X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fcommon%2Fsmtp.c;h=346c63e5f4eae85ffcb431e99fc3023b00976fcc;hp=f1d627d4835c3a2581eafdabb87ac333ae608602;hb=f69d8e55a0a3b1bf0075ea7bd7806b00e676153d;hpb=18ec5c3a941c304410e37326836fef24292865b8 diff --git a/src/common/smtp.c b/src/common/smtp.c index f1d627d48..346c63e5f 100644 --- a/src/common/smtp.c +++ b/src/common/smtp.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2003 Hiroyuki Yamamoto + * Copyright (C) 1999-2004 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ static gint smtp_helo(SMTPSession *session); static gint smtp_rcpt(SMTPSession *session); static gint smtp_data(SMTPSession *session); static gint smtp_send_data(SMTPSession *session); -static gint smtp_rset(SMTPSession *session); +/* static gint smtp_rset(SMTPSession *session); */ static gint smtp_quit(SMTPSession *session); static gint smtp_eom(SMTPSession *session); @@ -61,12 +61,10 @@ Session *smtp_session_new(void) SMTPSession *session; session = g_new0(SMTPSession, 1); + + session_init(SESSION(session)); + SESSION(session)->type = SESSION_SMTP; - SESSION(session)->server = NULL; - SESSION(session)->port = 0; - SESSION(session)->sock = NULL; - SESSION(session)->state = SESSION_READY; - SESSION(session)->data = NULL; SESSION(session)->recv_msg = smtp_session_recv_msg; @@ -92,6 +90,8 @@ Session *smtp_session_new(void) session->send_data = NULL; session->send_data_len = 0; + session->max_message_size = -1; + session->avail_auth_type = 0; session->forced_auth_type = 0; session->auth_type = 0; @@ -119,18 +119,29 @@ static void smtp_session_destroy(Session *session) static gint smtp_from(SMTPSession *session) { gchar buf[MSGBUFSIZE]; + gchar *mail_size = NULL; g_return_val_if_fail(session->from != NULL, SM_ERROR); session->state = SMTP_FROM; + + if (session->is_esmtp) + mail_size = g_strdup_printf(" SIZE=%d", session->send_data_len); + else + mail_size = g_strdup(""); + if (strchr(session->from, '<')) - g_snprintf(buf, sizeof(buf), "MAIL FROM: %s", session->from); + g_snprintf(buf, sizeof(buf), "MAIL FROM:%s%s", session->from, + mail_size); else - g_snprintf(buf, sizeof(buf), "MAIL FROM: <%s>", session->from); + g_snprintf(buf, sizeof(buf), "MAIL FROM:<%s>%s", session->from, + mail_size); + + g_free(mail_size); session_send_msg(SESSION(session), SESSION_MSG_NORMAL, buf); - log_print("SMTP> %s\n", buf); + log_print("%sSMTP> %s\n", (session->is_esmtp?"E":""), buf); return SM_OK; } @@ -269,7 +280,7 @@ static gint smtp_ehlo_recv(SMTPSession *session, const gchar *msg) const gchar *p = msg; p += 3; if (*p == '-' || *p == ' ') p++; - if (g_strncasecmp(p, "AUTH", 4) == 0) { + if (g_ascii_strncasecmp(p, "AUTH", 4) == 0) { p += 5; if (strcasestr(p, "LOGIN")) session->avail_auth_type |= SMTPAUTH_LOGIN; @@ -278,6 +289,10 @@ static gint smtp_ehlo_recv(SMTPSession *session, const gchar *msg) if (strcasestr(p, "DIGEST-MD5")) session->avail_auth_type |= SMTPAUTH_DIGEST_MD5; } + if (g_ascii_strncasecmp(p, "SIZE", 4) == 0) { + p += 5; + session->max_message_size = atoi(p); + } return SM_OK; } else if ((msg[0] == '1' || msg[0] == '2' || msg[0] == '3') && (msg[3] == ' ' || msg[3] == '\0')) @@ -347,9 +362,9 @@ static gint smtp_rcpt(SMTPSession *session) to = (gchar *)session->cur_to->data; if (strchr(to, '<')) - g_snprintf(buf, sizeof(buf), "RCPT TO: %s", to); + g_snprintf(buf, sizeof(buf), "RCPT TO:%s", to); else - g_snprintf(buf, sizeof(buf), "RCPT TO: <%s>", to); + g_snprintf(buf, sizeof(buf), "RCPT TO:<%s>", to); session_send_msg(SESSION(session), SESSION_MSG_NORMAL, buf); log_print("SMTP> %s\n", buf); @@ -378,6 +393,7 @@ static gint smtp_send_data(SMTPSession *session) return SM_OK; } +#if 0 static gint smtp_rset(SMTPSession *session) { session->state = SMTP_RSET; @@ -387,6 +403,7 @@ static gint smtp_rset(SMTPSession *session) return SM_OK; } +#endif static gint smtp_quit(SMTPSession *session) { @@ -471,15 +488,18 @@ static gint smtp_session_recv_msg(Session *session, const gchar *msg) /* ignore all multiline responses except for EHLO */ if (cont && smtp_session->state != SMTP_EHLO) - return 1; + 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) + if (smtp_session->user || session->ssl_type != SSL_NONE || + smtp_session->is_esmtp) #else - if (smtp_session->user) + if (smtp_session->user || smtp_session->is_esmtp) #endif smtp_ehlo(smtp_session); else @@ -492,6 +512,17 @@ static gint smtp_session_recv_msg(Session *session, const gchar *msg) 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) { @@ -554,7 +585,7 @@ static gint smtp_session_recv_msg(Session *session, const gchar *msg) } if (cont) - return 1; + return session_recv_msg(session); return 0; }