// SmtpSender.java - a sample to send email to an SMTP server // by Rowland http://home.comcast.net/~rowland3 import java.io.*; import java.net.*; import java.text.DateFormat; import java.util.*; class MailMessage { String subject; String date; Vector vbodylines; // message text is a vector of strings public final String sender, recipient; TreeMap header= new TreeMap(); public MailMessage(String _sender, String _recipient) { sender= _sender; recipient= _recipient; vbodylines = new Vector(); } public void addHeaderLine(String line) { try { int ix= line.indexOf(": "); if (ix< 0) return; String key= line.substring(0, ix); String val= line.substring(ix+2); if (val.endsWith("\n")) val= val.substring(val.length()-1); // get rid of trailing LF if (val.endsWith("\r")) val= val.substring(val.length()-1); // get rid of trailing CRLF header.put(key, val); } catch (Exception E) { System.err.println("MailMessage.addheaderLine: "+ line); } } public void addHeaderVal(String key, String val) { header.put(key, val); } public void addMailMessageLine(String _line) { vbodylines.add(_line); } public Enumeration getMailMessageLines() { return vbodylines.elements(); } public Iterator getHeaderFields() { return header.keySet().iterator(); } public String getHeaderVal(String key) { Object O= header.get(key); if (O== null) return null; return (String)O; } public String senderUname() { int ix= sender.indexOf("@"); if (ix< 0) return sender; return sender.substring(0, ix); } public String toString() { String s= "Sender: "+ sender+ "\tRecipient: "+ recipient+ "\n"; Iterator hi= header.keySet().iterator(); while (hi.hasNext()) { String key= (String)hi.next(); String hline= key+ ": "+ header.get(key)+ "\n"; s+= hline; } s+= "\n"; Enumeration e= vbodylines.elements(); while(e.hasMoreElements()) { s+= (String)e.nextElement()+ "\n"; } return s; } } //------------------------------------------------------------------------------ class SmtpSender { Socket sserver; BufferedReader in; OutputStreamWriter out; static final int SMTP_PORT= 25; SmtpSender(MailMessage message, String server) { try { sserver= new Socket(server, SMTP_PORT); send(message, sserver); sserver.close(); } catch (Exception E) { System.err.println("SmtpSender.SmtpSender: "+ E.toString()+ " "+ E.getMessage()); } } protected void send(MailMessage message, Socket sserver) { try { // A bit convoluted, but doesn't depend on DNS in any way... InetAddress localhost= sserver.getLocalAddress(); String localaddress= localhost.getHostAddress(); // Mandatory header fields, Date and From if (message.getHeaderVal("Date")== null) message.addHeaderVal("Date", new java.util.Date().toString()); if (message.getHeaderVal("From")== null) message.addHeaderVal("From", message.senderUname()+ " <"+ message.sender+ ">"); out= new OutputStreamWriter(sserver.getOutputStream()); in = new BufferedReader(new InputStreamReader(sserver.getInputStream())); String sintro= readln(); if (!sintro.startsWith("220")) { // 220 System.err.println("SmtpSender: intro=="+ sintro); return; } writeln("EHLO "+ localaddress); if (!expect250()) return; String sender= message.sender; int ix= sender.indexOf("@"); if (ix< 0) { // fill in sender domain sender+= "@"+ localaddress; } writeln("MAIL FROM:<"+ sender+ ">"); if (!expect250()) return; writeln("RCPT TO:<"+ message.recipient+ ">"); if (!expect250()) return; writeln("DATA"); while (true) { // may be multiple 250 replies pending from server String line= readln(); if (line.startsWith("3")) break; // ready to send if (!line.startsWith("2")) { System.err.println("SmtpSender.send reponse to DATA: "+ line); return; } } Iterator hi= message.getHeaderFields(); while (hi.hasNext()) { String key= (String)hi.next(); writeln(key+ ": "+ message.getHeaderVal(key)); } writeln(""); // end of header; Enumeration e= message.getMailMessageLines(); while(e.hasMoreElements()) { String bline= (String)e.nextElement(); if (bline.startsWith(".")) bline= "."+ bline; writeln(bline); } writeln("."); expect250(); writeln("QUIT"); } catch (Exception E) { System.err.println("SmtpSender.send: "+ E.toString()); } } final boolean expect250() throws IOException { String line= readln(); if (!line.startsWith("2")) { System.err.println("SmtpSender.expect250: "+ line); return false; } return true; } final void writeln(String s) throws IOException { System.err.println("From client: "+ s); out.write(s+ "\r\n"); out.flush(); } final String readln() throws IOException { String line= in.readLine(); System.err.println("From server: "+ line); return line; } protected static Socket serverConnect(String server) { Socket ss= null; try { ss= new Socket(server, SMTP_PORT); } catch (Exception E) { ss= null; } return ss; } protected static String serverConnectTest(String server) { Socket ss= serverConnect(server); if (ss== null) return null; try { ss.close(); } catch (Exception E) { } return server; } public static void main(String args[]) { // usage: java SmtpSender mailaddress smtpserver String mailaddress= args[0]; MailMessage message= new MailMessage("SmtpSender", mailaddress); message.addHeaderVal("Subject", "SmtpSender test"); message.addMailMessageLine("SmtpSender test body"); new SmtpSender(message, args[1]); } }