SMTP over SSL (untested, feedback requested)
[claws.git] / src / send.c
index ad182fda40a5c679af0f9db3c4f2debe47f6ebf3..ea74478525d714148785f1b0d209db2fa45cfcc6 100644 (file)
@@ -48,6 +48,9 @@
 #include "gtkutils.h"
 
 #define SMTP_PORT      25
+#if USE_SSL
+#define SSMTP_PORT     465
+#endif
 
 typedef struct _SendProgressDialog     SendProgressDialog;
 
@@ -58,13 +61,25 @@ struct _SendProgressDialog
        gboolean cancelled;
 };
 
+#if !USE_SSL
 static gint send_message_smtp  (GSList *to_list, const gchar *from,
                                 const gchar *server, gushort port,
                                 const gchar *domain, const gchar *userid,
                                 const gchar *passwd, gboolean use_smtp_auth,
                                 FILE *fp);
+
 static SockInfo *send_smtp_open        (const gchar *server, gushort port,
                                 const gchar *domain, gboolean use_smtp_auth);
+#else
+static gint send_message_smtp  (GSList *to_list, const gchar *from,
+                                const gchar *server, gushort port,
+                                const gchar *domain, const gchar *userid,
+                                const gchar *passwd, gboolean use_smtp_auth,
+                                FILE *fp, gboolean use_ssl);
+
+static SockInfo *send_smtp_open        (const gchar *server, gushort port,
+                                const gchar *domain, gboolean use_smtp_auth, gboolean use_ssl);
+#endif
 
 static SendProgressDialog *send_progress_dialog_create(void);
 static void send_progress_dialog_destroy(SendProgressDialog *dialog);
@@ -94,13 +109,21 @@ gint send_message(const gchar *file, PrefsAccount *ac_prefs, GSList *to_list)
                                                ac_prefs->mail_command,
                                                fp);
        } else {
+#if USE_SSL
+               port = ac_prefs->set_smtpport ? ac_prefs->smtpport : (ac_prefs->smtp_ssl ? SSMTP_PORT : SMTP_PORT);
+#else
                port = ac_prefs->set_smtpport ? ac_prefs->smtpport : SMTP_PORT;
+#endif
                domain = ac_prefs->set_domain ? ac_prefs->domain : NULL;
 
                val = send_message_smtp(to_list, ac_prefs->address,
                                        ac_prefs->smtp_server, port, domain,
                                         ac_prefs->userid, ac_prefs->passwd,
-                                       ac_prefs->use_smtp_auth, fp);
+                                       ac_prefs->use_smtp_auth, fp
+#if USE_SSL
+                                       , ac_prefs->smtp_ssl
+#endif
+                                       );
        }
 
        fclose(fp);
@@ -211,16 +234,32 @@ gint send_message_queue(const gchar *file)
                }
 
                if (ac) {
+#if !USE_SSL
                        port = ac->set_smtpport ? ac->smtpport : SMTP_PORT;
+#else
+                       port = ac->set_smtpport ? ac->smtpport : (ac->smtp_ssl ? SSMTP_PORT : SMTP_PORT);
+#endif
                        domain = ac->set_domain ? ac->domain : NULL;
+#if !USE_SSL
                        val = send_message_smtp
                                (to_list, from, server, port, domain,
                                 ac->userid, ac->passwd, ac->use_smtp_auth, fp);
+#else
+                       val = send_message_smtp
+                               (to_list, from, server, port, domain,
+                                ac->userid, ac->passwd, ac->use_smtp_auth, fp, ac->smtp_ssl);
+#endif
                } else {
                        g_warning(_("Account not found.\n"));
+#if !USE_SSL
                        val = send_message_smtp
                                (to_list, from, server, SMTP_PORT, NULL,
                                 NULL, NULL, FALSE, fp);
+#else
+                       val = send_message_smtp
+                               (to_list, from, server, SMTP_PORT, NULL,
+                                NULL, NULL, FALSE, fp, FALSE);
+#endif
                }
        }
 
@@ -266,11 +305,19 @@ gint send_message_queue(const gchar *file)
        } \
 }
 
+#if !USE_SSL
 static gint send_message_smtp(GSList *to_list, const gchar *from,
                              const gchar *server, gushort port,
                              const gchar *domain, const gchar *userid,
                              const gchar *passwd, gboolean use_smtp_auth,
                              FILE *fp)
+#else
+static gint send_message_smtp(GSList *to_list, const gchar *from,
+                             const gchar *server, gushort port,
+                             const gchar *domain, const gchar *userid,
+                             const gchar *passwd, gboolean use_smtp_auth,
+                             FILE *fp, gboolean use_ssl)
+#endif
 {
        SockInfo *smtp_sock = NULL;
        SendProgressDialog *dialog;
@@ -306,9 +353,15 @@ static gint send_message_smtp(GSList *to_list, const gchar *from,
        gtk_clist_set_text(clist, 0, 2, _("Connecting"));
        GTK_EVENTS_FLUSH();
 
+#if !USE_SSL
        SEND_EXIT_IF_ERROR((smtp_sock = send_smtp_open
                                (server, port, domain, use_smtp_auth)),
                           "connecting to server");
+#else
+       SEND_EXIT_IF_ERROR((smtp_sock = send_smtp_open
+                               (server, port, domain, use_smtp_auth, use_ssl)),
+                          "connecting to server");
+#endif
 
        progress_dialog_set_label(dialog->dialog, _("Sending MAIL FROM..."));
        gtk_clist_set_text(clist, 0, 2, _("Sending"));
@@ -364,14 +417,23 @@ static gint send_message_smtp(GSList *to_list, const gchar *from,
        SEND_EXIT_IF_NOTOK(smtp_eom(smtp_sock), "terminating data");
        SEND_EXIT_IF_NOTOK(smtp_quit(smtp_sock), "sending QUIT");
 
+#if USE_SSL
+       ssl_done_socket(smtp_sock);
+#endif
+
        sock_close(smtp_sock);
        send_progress_dialog_destroy(dialog);
 
        return 0;
 }
 
+#if !USE_SSL
 static SockInfo *send_smtp_open(const gchar *server, gushort port,
                           const gchar *domain, gboolean use_smtp_auth)
+#else
+static SockInfo *send_smtp_open(const gchar *server, gushort port,
+                          const gchar *domain, gboolean use_smtp_auth, gboolean use_ssl)
+#endif
 {
        SockInfo *sock;
        gint val;
@@ -384,6 +446,14 @@ static SockInfo *send_smtp_open(const gchar *server, gushort port,
                return NULL;
        }
 
+#if USE_SSL
+       if(use_ssl && !ssl_init_socket(sock)) {
+               log_warning(_("SSL connection failed"));
+               sock_close(sock);
+               return NULL;
+       }
+#endif
+
        if (smtp_ok(sock) == SM_OK) {
                val = smtp_helo(sock, domain ? domain : get_domain_name(),
                                use_smtp_auth);