X-Git-Url: http://jaekl.net/gitweb/?p=cfb.git;a=blobdiff_plain;f=prod%2Fnet%2Fjaekl%2Fqd%2Futil%2FSendMail.java;h=33be358b31edc0c28e7b232861e89419a76357ca;hp=1f563027ce5b247687be8173f95a9b74ca0b63de;hb=04db511351db70ea603cb65f3f2c5c0b7462d9cc;hpb=4173dc72e969e6e3f51c9cb4734b07ec664db975 diff --git a/prod/net/jaekl/qd/util/SendMail.java b/prod/net/jaekl/qd/util/SendMail.java index 1f56302..33be358 100644 --- a/prod/net/jaekl/qd/util/SendMail.java +++ b/prod/net/jaekl/qd/util/SendMail.java @@ -3,10 +3,13 @@ package net.jaekl.qd.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -17,8 +20,17 @@ public class SendMail { private static final String RESP_251 = "251"; // mail address change (we don't support this) private static final String RESP_354 = "354"; // OK, proceed with DATA transmission + // Actually, RFC821 (with which all SMTP should be backwards-compatible) + // requires all control transmissions to be done in US-ASCII. + // However, there's no point in throwing an exception if the server with which + // we're communicating sends bytes with the high bit set. So, let's read from + // the socket with the only Charset that Java guarantees will be available that + // can also read arbitrary sequences of 8-bit bytes. + private static final String SMTP_CHARSET = "ISO-8859-1"; + String m_hostName; String m_boundary; + Charset m_charset; String m_smtpHost; int m_smtpPort; @@ -56,8 +68,8 @@ public class SendMail { { try ( Socket sock = openSocket(m_smtpHost, m_smtpPort); - PrintWriter pw = new PrintWriter(sock.getOutputStream(), true); - BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), StandardCharsets.US_ASCII), true); + BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream(), getCharset())); ) { send(pw, br); @@ -129,14 +141,14 @@ public class SendMail { sendMimeParts(pw); - String result = sendLine(pw, br, "\r\n.\r\n"); + String result = sendLine(pw, br, "\r\n."); return result; } void sendMimeHeaders(PrintWriter pw) { sendLine(pw, "MIME-Version: 1.0"); - sendLine(pw, "Content-Type: multipart/mixed; boundary=" + getBoundary()); + sendLine(pw, "Content-Type: multipart/mixed; boundary=\"" + getBoundary() + "\""); } void sendMimeParts(PrintWriter pw) { @@ -159,6 +171,13 @@ public class SendMail { return true; } + Charset getCharset() { + if (null == m_charset) { + m_charset = Charset.forName(SMTP_CHARSET); + } + return m_charset; + } + String getBoundary() { if (null != m_boundary) {