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