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))