import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
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;
try (
Socket sock = openSocket(m_smtpHost, m_smtpPort);
PrintWriter pw = new PrintWriter(sock.getOutputStream(), true);
- BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
+ BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream(), getCharset()));
)
{
send(pw, br);
return true;
}
+ Charset getCharset() {
+ if (null == m_charset) {
+ m_charset = Charset.forName(SMTP_CHARSET);
+ }
+ return m_charset;
+ }
+
String getBoundary()
{
if (null != m_boundary) {