+ /* ignore all multiline responses except for EHLO */
+ if (cont && smtp_session->state != SMTP_EHLO)
+ return session_recv_msg(session);
+
+ switch (smtp_session->state) {
+ case SMTP_READY:
+ if (strstr(msg, "ESMTP"))
+ smtp_session->is_esmtp = TRUE;
+ case SMTP_CONNECTED:
+#if USE_OPENSSL
+ if (smtp_session->user || session->ssl_type != SSL_NONE ||
+ smtp_session->is_esmtp)
+#else
+ if (smtp_session->user || smtp_session->is_esmtp)
+#endif
+ smtp_ehlo(smtp_session);
+ else
+ smtp_helo(smtp_session);
+ break;
+ case SMTP_HELO:
+ smtp_from(smtp_session);
+ break;
+ case SMTP_EHLO:
+ smtp_ehlo_recv(smtp_session, msg);
+ if (cont == TRUE)
+ break;
+ if (smtp_session->max_message_size > 0
+ && smtp_session->max_message_size <
+ smtp_session->send_data_len) {
+ log_warning(_("Message is too big "
+ "(Maximum size is %s)\n"),
+ to_human_readable(
+ (off_t)(smtp_session->max_message_size)));
+ smtp_session->state = SMTP_ERROR;
+ smtp_session->error_val = SM_ERROR;
+ return -1;
+ }
+#if USE_OPENSSL
+ if (session->ssl_type == SSL_STARTTLS &&
+ smtp_session->tls_init_done == FALSE) {
+ smtp_starttls(smtp_session);
+ break;
+ }
+#endif
+ if (smtp_session->user) {
+ if (smtp_auth(smtp_session) != SM_OK)
+ smtp_from(smtp_session);
+ } else
+ smtp_from(smtp_session);
+ break;
+ case SMTP_STARTTLS:
+#if USE_OPENSSL
+ if (session_start_tls(session) < 0) {
+ log_warning(_("can't start TLS session\n"));
+ smtp_session->state = SMTP_ERROR;
+ smtp_session->error_val = SM_ERROR;
+ return -1;
+ }
+ smtp_session->tls_init_done = TRUE;
+ smtp_ehlo(smtp_session);
+#endif
+ break;
+ case SMTP_AUTH:
+ smtp_auth_recv(smtp_session, msg);
+ break;
+ case SMTP_AUTH_LOGIN_USER:
+ smtp_auth_login_user_recv(smtp_session, msg);
+ break;
+ case SMTP_AUTH_PLAIN:
+ case SMTP_AUTH_LOGIN_PASS:
+ case SMTP_AUTH_CRAM_MD5:
+ smtp_from(smtp_session);
+ break;
+ case SMTP_FROM:
+ if (smtp_session->cur_to)
+ smtp_rcpt(smtp_session);
+ break;
+ case SMTP_RCPT:
+ if (smtp_session->cur_to)
+ smtp_rcpt(smtp_session);
+ else
+ smtp_data(smtp_session);
+ break;
+ case SMTP_DATA:
+ smtp_send_data(smtp_session);
+ break;
+ case SMTP_EOM:
+ smtp_quit(smtp_session);
+ break;
+ case SMTP_QUIT:
+ session_disconnect(session);
+ break;
+ case SMTP_ERROR:
+ default:
+ log_warning(_("error occurred on SMTP session\n"));
+ smtp_session->error_val = SM_ERROR;
+ return -1;