]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/email/Sendmail.java
upd: Implement the patches for old bug 1288, and bug 1318
[gigi.git] / src / org / cacert / gigi / email / Sendmail.java
index f709169e4dd3185259f95398791169ffb01955c8..008f3c69be986aec9dcc4f36d05cb0b80f04df40 100644 (file)
@@ -5,102 +5,106 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.Socket;
+import java.security.GeneralSecurityException;
 import java.text.SimpleDateFormat;
 import java.util.Base64;
 import java.util.Date;
 import java.util.Locale;
+import java.util.Properties;
 import java.util.regex.Pattern;
 
-class Sendmail {
-       private Sendmail() {
-       }
-       private static final Pattern NON_ASCII = Pattern
-                       .compile("[^a-zA-Z0-9 .-\\[\\]!_@]");
+import org.cacert.gigi.util.ServerConstants;
 
-       public static void sendmail(String to, String subject, String message,
-                       String from, String replyto, String toname, String fromname,
-                       String errorsto, boolean extra) throws IOException {
+public class Sendmail extends EmailProvider {
 
-               String[] bits = from.split(",");
+    protected Sendmail(Properties props) {}
 
-               Socket smtp = new Socket("dogcraft.de", 25);
-               PrintWriter out = new PrintWriter(smtp.getOutputStream());
-               BufferedReader in = new BufferedReader(new InputStreamReader(
-                               smtp.getInputStream()));
-               readResponse(in);
-               out.print("HELO www.cacert.org\r\n");
-               out.flush();
-               readResponse(in);
-               out.print("MAIL FROM:<returns@cacert.org>\r\n");
-               out.flush();
-               readResponse(in);
-               bits = to.split(",");
-               for (String user : bits) {
-                       out.print("RCPT TO:<" + user.trim() + ">\r\n");
-                       out.flush();
-                       readResponse(in);
-               }
-               out.print("DATA\r\n");
-               out.flush();
-               readResponse(in);
-               out.print("X-Mailer: CAcert.org Website\r\n");
-               // if (array_key_exists("REMOTE_ADDR", $_SERVER)) {
-               // out.print("X-OriginatingIP: ".$_SERVER["REMOTE_ADDR"]."\r\n");
-               // }
-               // TODO
-               SimpleDateFormat emailDate = new SimpleDateFormat(
-                               "E, d MMM yyyy HH:mm:ss ZZZZ (z)", Locale.ENGLISH);
-               out.print("Date: "
-                               + emailDate.format(new Date(System.currentTimeMillis()))
-                               + "\r\n");
-               out.print("Sender: " + errorsto + "\r\n");
-               out.print("Errors-To: " + errorsto + "\r\n");
-               if (replyto != null) {
-                       out.print("Reply-To: " + replyto + "\r\n");
-               } else {
-                       out.print("Reply-To: " + from + "\r\n");
-               }
-               out.print("From: " + from + "\r\n");
-               out.print("To: " + to + "\r\n");
-               if (NON_ASCII.matcher(subject).matches()) {
+    private static final Pattern NON_ASCII = Pattern.compile("[^a-zA-Z0-9 .-\\[\\]!_@]");
 
-                       out.print("Subject: =?utf-8?B?"
-                                       + Base64.getEncoder().encodeToString(subject.getBytes())
-                                       + "?=\r\n");
-               } else {
-                       out.print("Subject: " + subject + "\r\n");
-               }
-               out.print("Mime-Version: 1.0\r\n");
-               if (!extra) {
-                       out.print("Content-Type: text/plain; charset=\"utf-8\"\r\n");
-                       out.print("Content-Transfer-Encoding: 8bit\r\n");
-               } else {
-                       out.print("Content-Type: text/plain; charset=\"iso-8859-1\"\r\n");
-                       out.print("Content-Transfer-Encoding: quoted-printable\r\n");
-                       out.print("Content-Disposition: inline\r\n");
-               }
-               // out.print("Content-Transfer-Encoding: BASE64\r\n");
-               out.print("\r\n");
-               // out.print(chunk_split(base64_encode(recode("html..utf-8",
-               // $message)))."\r\n.\r\n");
-               message = message + "\r\n";
+    @Override
+    public void sendmail(String to, String subject, String message, String from, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException {
 
-               String sendM = message.replace("\r", "").replace("\n.\n", "\n")
-                               .replace("\n.\n", "\n").replace("\n", "\r\n")
-                               + ".\r\n";
-               out.print(sendM);
-               out.flush();
-               readResponse(in);
-               out.print("QUIT\n");
-               out.flush();
-               readResponse(in);
-               smtp.close();
-       }
-       private static void readResponse(BufferedReader in) throws IOException {
-               String line;
-               while ((line = in.readLine()) != null && line.matches("\\d+-")) {
-               }
+        String[] bits = from.split(",");
 
-       }
+        Socket smtp = new Socket("localhost", 25);
+        PrintWriter out = new PrintWriter(smtp.getOutputStream());
+        BufferedReader in = new BufferedReader(new InputStreamReader(smtp.getInputStream()));
+        readSMTPResponse(in, 220);
+        out.print("HELO www.cacert.org\r\n");
+        out.flush();
+        readSMTPResponse(in, 250);
+        out.print("MAIL FROM:<returns@cacert.org>\r\n");
+        out.flush();
+        readSMTPResponse(in, 250);
+        bits = to.split(",");
+        for (String user : bits) {
+            out.print("RCPT TO:<" + user.trim() + ">\r\n");
+            out.flush();
+            readSMTPResponse(in, 250);
+        }
+        out.print("DATA\r\n");
+        out.flush();
+        readSMTPResponse(in, 250);
+        out.print("X-Mailer: CAcert.org Website\r\n");
+        // if (array_key_exists("REMOTE_ADDR", $_SERVER)) {
+        // out.print("X-OriginatingIP: ".$_SERVER["REMOTE_ADDR"]."\r\n");
+        // }
+        // TODO
+        SimpleDateFormat emailDate = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss ZZZZ (z)", Locale.ENGLISH);
+        out.print("Date: " + emailDate.format(new Date(System.currentTimeMillis())) + "\r\n");
+        if (errorsto != null) {
+            out.print("Sender: " + errorsto + "\r\n");
+            out.print("Errors-To: " + errorsto + "\r\n");
+        }
+        if (replyto != null) {
+            out.print("Reply-To: " + replyto + "\r\n");
+        } else {
+            out.print("Reply-To: " + from + "\r\n");
+        }
+        out.print("From: support@" + ServerConstants.getWwwHostName().replaceAll("^www.", "") + "\r\n");
+        out.print("To: " + to + "\r\n");
+        if (NON_ASCII.matcher(subject).matches()) {
+
+            out.print("Subject: =?utf-8?B?" + Base64.getEncoder().encodeToString(subject.getBytes()) + "?=\r\n");
+        } else {
+            out.print("Subject: " + subject + "\r\n");
+        }
+        StringBuffer headers = new StringBuffer();
+        headers.append("Content-Type: text/plain; charset=\"utf-8\"\r\n");
+        headers.append("Content-Transfer-Encoding: base64\r\n");
+        // out.print(chunk_split(base64_encode(recode("html..utf-8",
+        // $message)))."\r\n.\r\n");
+        headers.append("\r\n");
+        headers.append(Base64.getEncoder().encodeToString(message.getBytes("UTF-8")).replaceAll("(.{64})(?=.)", "$1\r\n"));
+        headers.append("\r\n");
+
+        try {
+            sendSigned(headers.toString(), out);
+            out.print("\r\n.\r\n");
+            out.flush();
+        } catch (GeneralSecurityException e) {
+            e.printStackTrace();
+            smtp.close();
+            return;
+        }
+        readSMTPResponse(in, 250);
+        out.print("QUIT\n");
+        out.flush();
+        readSMTPResponse(in, 221);
+        smtp.close();
+    }
+
+    public static boolean readSMTPResponse(BufferedReader in, int code) throws IOException {
+        String line;
+        while ((line = in.readLine()) != null) {
+            if (line.startsWith(code + " ")) {
+                return true;
+            } else if ( !line.startsWith(code + "-")) {
+                return false;
+            }
+        }
+        return false;
+
+    }
 
 }