- Log.info(SMTP.Outgoing.class, "connecting...");
- accepted0 = new Connection(new Socket(mx, 25), InetAddress.getLocalHost().getHostName()) {
- public boolean handleRequest() throws IOException {
- Log.info(SMTP.Outgoing.class, "connected");
- check(readln()); // banner
- println("HELO " + vhost ); check(readln());
- println("MAIL FROM: " + m.envelopeFrom); check(readln());
- println("RCPT TO: " + m.envelopeTo); check(readln());
- println("DATA"); check(readln());
- println(m.body);
- println(".");
- check(readln());
- Log.info(SMTP.Outgoing.class, "message accepted by " + mx);
- boolean accepted = true;
- try {
- conn.close();
- } finally {
- return accepted;
- }
+ Log.note("connecting to " + mx + "...");
+ conn = new Connection(new Socket(mx, 25), InetAddress.getLocalHost().getHostName());
+ conn.setNewline("\r\n");
+ conn.setTimeout(60 * 1000);
+ Log.note(" connected");
+ check(conn.readln(), conn); // banner
+ try {
+ conn.println("EHLO " + conn.vhost);
+ check(conn.readln(), conn);
+ } catch (SMTPException smtpe) {
+ conn.println("HELO " + conn.vhost);
+ check(conn.readln(), conn);
+ }
+ if (m.envelopeFrom==null) {
+ Log.warn("", "MAIL FROM:<>");
+ conn.println("MAIL FROM:<>"); check(conn.readln(), conn);
+ } else {
+ Log.warn("", "MAIL FROM:<" + m.envelopeFrom.toString()+">");
+ conn.println("MAIL FROM:<" + m.envelopeFrom.toString()+">"); check(conn.readln(), conn);
+ }
+ conn.println("RCPT TO:<" + m.envelopeTo.toString()+">"); check(conn.readln(), conn);
+ conn.println("DATA"); check(conn.readln(), conn);
+ Headers head = m.headers;
+ head.remove("return-path");
+ head.remove("bcc");
+ Stream stream = head.getStream();
+ for(String s = stream.readln(); s!=null; s=stream.readln()) {
+ if (s.startsWith(".")) conn.print(".");
+ conn.println(s);
+ }
+ conn.println("");
+ stream = m.getBody().getStream();
+ for(String s = stream.readln(); s!=null; s=stream.readln()) {
+ if (s.startsWith(".")) conn.print(".");
+ conn.println(s);
+ }
+ conn.println(".");
+ String resp = conn.readln();
+ if (resp == null)
+ throw new SMTPException("server " + mx + " closed connection without accepting message");
+ check(resp, conn);
+ Log.warn(SMTP.Outgoing.class, "success: " + mx + " accepted " + m.summary() + "\n["+resp+"]");
+ accepted = true;
+ conn.close();
+ } catch (SMTPException e) {
+ if (accepted) return true;
+ Log.warn(SMTP.Outgoing.class, " unable to send; error=" + e);
+ Log.warn(SMTP.Outgoing.class, " message: " + m.summary());
+ Log.warn(SMTP.Outgoing.class, e);
+ if (e.code >= 500 && e.code <= 599) {
+ try {
+ attempt(m.bounce("unable to deliver: " + e), true);
+ } catch (Exception ex) {
+ Log.error(SMTP.Outgoing.class, "exception while trying to deliver bounce; giving up completely");
+ Log.error(SMTP.Outgoing.class, ex);