]> WPIA git - gigi.git/blob - src/org/cacert/gigi/email/Sendmail.java
1eb1d914f4750444d0bdf3c47d2d0b66965974fc
[gigi.git] / src / org / cacert / gigi / email / Sendmail.java
1 package org.cacert.gigi.email;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.PrintWriter;
7 import java.net.Socket;
8 import java.security.GeneralSecurityException;
9 import java.text.SimpleDateFormat;
10 import java.util.Base64;
11 import java.util.Date;
12 import java.util.Locale;
13 import java.util.Properties;
14 import java.util.regex.Pattern;
15
16 import org.cacert.gigi.util.ServerConstants;
17
18 public class Sendmail extends EmailProvider {
19
20     protected Sendmail(Properties props) {}
21
22     private static final Pattern NON_ASCII = Pattern.compile("[^a-zA-Z0-9 .-\\[\\]!_@]");
23
24     @Override
25     public void sendmail(String to, String subject, String message, String from, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException {
26
27         String[] bits = from.split(",");
28
29         Socket smtp = new Socket("localhost", 25);
30         PrintWriter out = new PrintWriter(smtp.getOutputStream());
31         BufferedReader in = new BufferedReader(new InputStreamReader(smtp.getInputStream()));
32         readResponse(in);
33         out.print("HELO www.cacert.org\r\n");
34         out.flush();
35         readResponse(in);
36         out.print("MAIL FROM:<returns@cacert.org>\r\n");
37         out.flush();
38         readResponse(in);
39         bits = to.split(",");
40         for (String user : bits) {
41             out.print("RCPT TO:<" + user.trim() + ">\r\n");
42             out.flush();
43             readResponse(in);
44         }
45         out.print("DATA\r\n");
46         out.flush();
47         readResponse(in);
48         out.print("X-Mailer: CAcert.org Website\r\n");
49         // if (array_key_exists("REMOTE_ADDR", $_SERVER)) {
50         // out.print("X-OriginatingIP: ".$_SERVER["REMOTE_ADDR"]."\r\n");
51         // }
52         // TODO
53         SimpleDateFormat emailDate = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss ZZZZ (z)", Locale.ENGLISH);
54         out.print("Date: " + emailDate.format(new Date(System.currentTimeMillis())) + "\r\n");
55         if (errorsto != null) {
56             out.print("Sender: " + errorsto + "\r\n");
57             out.print("Errors-To: " + errorsto + "\r\n");
58         }
59         if (replyto != null) {
60             out.print("Reply-To: " + replyto + "\r\n");
61         } else {
62             out.print("Reply-To: " + from + "\r\n");
63         }
64         out.print("From: support@" + ServerConstants.getWwwHostName().replaceAll("^www.", "") + "\r\n");
65         out.print("To: " + to + "\r\n");
66         if (NON_ASCII.matcher(subject).matches()) {
67
68             out.print("Subject: =?utf-8?B?" + Base64.getEncoder().encodeToString(subject.getBytes()) + "?=\r\n");
69         } else {
70             out.print("Subject: " + subject + "\r\n");
71         }
72         StringBuffer headers = new StringBuffer();
73         headers.append("Content-Type: text/plain; charset=\"utf-8\"\r\n");
74         headers.append("Content-Transfer-Encoding: base64\r\n");
75         // out.print(chunk_split(base64_encode(recode("html..utf-8",
76         // $message)))."\r\n.\r\n");
77         headers.append("\r\n");
78         headers.append(Base64.getEncoder().encodeToString(message.getBytes("UTF-8")).replaceAll("(.{64})(?=.)", "$1\r\n"));
79         headers.append("\r\n");
80
81         try {
82             sendSigned(headers.toString(), out);
83             out.print("\r\n.\r\n");
84             out.flush();
85         } catch (GeneralSecurityException e) {
86             e.printStackTrace();
87             smtp.close();
88             return;
89         }
90         readResponse(in);
91         out.print("QUIT\n");
92         out.flush();
93         readResponse(in);
94         smtp.close();
95     }
96
97     private static void readResponse(BufferedReader in) throws IOException {
98         String line;
99         while ((line = in.readLine()) != null && line.matches("\\d+-")) {
100             System.out.println(line);
101         }
102
103     }
104
105 }