masqmail-0.2
diff src/smtp_out.c @ 171:349518b940db
added support for STARTTLS wrappers
added the route config option `instant_helo' which
causes masqmail, as SMTP client, not to wait for the
server's 220 greeting. Instead if says EHLO right at
once. You'll need this for STARTTLS wrappers that
usually eat the greeting line.
author | meillo@marmaro.de |
---|---|
date | Thu, 22 Jul 2010 23:30:05 +0200 |
parents | 52c82d755215 |
children | 087e99c7702a |
line diff
1.1 --- a/src/smtp_out.c Mon Jul 19 14:01:13 2010 +0200 1.2 +++ b/src/smtp_out.c Thu Jul 22 23:30:05 2010 +0200 1.3 @@ -231,11 +231,22 @@ 1.4 static gboolean 1.5 check_helo_response(smtp_base * psb) 1.6 { 1.7 - gchar *ptr = psb->buffer; 1.8 + gchar *ptr; 1.9 1.10 if (!check_response(psb, FALSE)) 1.11 return FALSE; 1.12 1.13 + if (psb->last_code == 220) { 1.14 + logwrite(LOG_NOTICE, "received a 220 greeting after sending EHLO,\n"); 1.15 + logwrite(LOG_NOTICE, "please remove `instant_helo' from your route config\n"); 1.16 + /* read the next response, cause that's the actual helo response */ 1.17 + if (!read_response(psb, SMTP_CMD_TIMEOUT) || !check_response(psb, FALSE)) { 1.18 + return FALSE; 1.19 + } 1.20 + } 1.21 + 1.22 + ptr = psb->buffer; 1.23 + 1.24 while (*ptr) { 1.25 if (strncasecmp(&(ptr[4]), "SIZE", 4) == 0) { 1.26 gchar *arg; 1.27 @@ -668,24 +679,35 @@ 1.28 #endif 1.29 1.30 gboolean 1.31 -smtp_out_init(smtp_base * psb) 1.32 +smtp_out_init(smtp_base * psb, gboolean instant_helo) 1.33 { 1.34 gboolean ok; 1.35 1.36 - if ((ok = read_response(psb, SMTP_INITIAL_TIMEOUT))) { 1.37 - if ((ok = check_init_response(psb))) { 1.38 + logwrite(LOG_INFO, "smtp_out_init(): instant_helo:%d\n", instant_helo); 1.39 1.40 - if ((ok = smtp_helo(psb, psb->helo_name))) { 1.41 + if (instant_helo) { 1.42 + /* we say hello right away, hence we don't know if 1.43 + ESMTP is supported; we just assume it */ 1.44 + psb->use_esmtp = 1; 1.45 + } else { 1.46 + if ((ok = read_response(psb, SMTP_INITIAL_TIMEOUT))) { 1.47 + ok = check_init_response(psb); 1.48 + } 1.49 + if (!ok) { 1.50 + smtp_out_log_failure(psb, NULL); 1.51 + return ok; 1.52 + } 1.53 + } 1.54 + 1.55 + if ((ok = smtp_helo(psb, psb->helo_name))) { 1.56 #ifdef ENABLE_AUTH 1.57 - if (psb->auth_name && psb->use_auth) { 1.58 - /* we completely disregard the response of server here. If 1.59 - authentication fails, the server will complain later 1.60 - anyway. I know, this is not polite... */ 1.61 - smtp_out_auth(psb); 1.62 - } 1.63 + if (psb->auth_name && psb->use_auth) { 1.64 + /* we completely disregard the response of server here. If 1.65 + authentication fails, the server will complain later 1.66 + anyway. I know, this is not polite... */ 1.67 + smtp_out_auth(psb); 1.68 + } 1.69 #endif 1.70 - } 1.71 - } 1.72 } 1.73 if (!ok) 1.74 smtp_out_log_failure(psb, NULL); 1.75 @@ -899,7 +921,7 @@ 1.76 if ((psb = smtp_out_open(host, port, resolve_list))) { 1.77 set_heloname(psb, return_path->domain, TRUE); 1.78 /* initiate connection, send message and quit: */ 1.79 - if (smtp_out_init(psb)) { 1.80 + if (smtp_out_init(psb, FALSE)) { 1.81 smtp_out_msg(psb, msg, return_path, rcpt_list, NULL); 1.82 if (psb->error == smtp_ok || (psb->error == smtp_fail) || (psb->error == smtp_trylater) 1.83 || (psb->error == smtp_syntax) || (psb->error == smtp_cancel))