add Summary->Next/Prev labeled message
[claws.git] / src / smtp.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2001 Hiroyuki Yamamoto
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #include <glib.h>
21 #include <stdio.h>
22 #include <string.h>
23
24 #include "smtp.h"
25 #include "esmtp.h"
26 #include "socket.h"
27 #include "utils.h"
28
29 #define MSGBUFSIZE      8192
30
31 static gint verbose = 1;
32 static gchar smtp_response[MSGBUFSIZE];
33
34 gint smtp_helo(SockInfo *sock, const gchar *hostname, gboolean esmtp)
35 {
36         if (esmtp)
37                 return esmtp_ehlo(sock, hostname);
38         else {
39                 sock_printf(sock, "HELO %s\r\n", hostname);
40                 if (verbose)
41                         log_print("SMTP> HELO %s\n", hostname);
42
43                 return smtp_ok(sock);
44         }
45 }
46
47 gint smtp_from(SockInfo *sock, const gchar *from,
48                const gchar *userid, const gchar *passwd,
49                gboolean use_smtp_auth)
50 {
51         gchar buf[MSGBUFSIZE];
52         SMTPAuthType authtype;
53
54         if (use_smtp_auth) {
55                 /* exist AUTH-Type CRAM_MD5 */
56                 if (esmtp_auth_cram_md5(sock) == SM_ERROR) {
57                         /* exist AUTH-Type LOGIN */
58                         if (esmtp_auth_login(sock) == SM_ERROR)
59                                 return SM_ERROR;
60                         else
61                                 authtype = SMTPAUTH_LOGIN;
62                 } else
63                         authtype = SMTPAUTH_CRAM_MD5;
64
65                 esmtp_auth(sock, authtype, userid, passwd);
66         }
67
68         if (strchr(from, '<'))
69                 g_snprintf(buf, sizeof(buf), "MAIL FROM: %s", from);
70         else
71                 g_snprintf(buf, sizeof(buf), "MAIL FROM: <%s>", from);
72
73         sock_printf(sock, "%s\r\n", buf);
74         if (verbose)
75                 log_print("SMTP> %s\n", buf);
76
77         return smtp_ok(sock);
78 }
79
80 gint smtp_rcpt(SockInfo *sock, const gchar *to)
81 {
82         gchar buf[MSGBUFSIZE];
83
84         if (strchr(to, '<'))
85                 g_snprintf(buf, sizeof(buf), "RCPT TO: %s", to);
86         else
87                 g_snprintf(buf, sizeof(buf), "RCPT TO: <%s>", to);
88
89         sock_printf(sock, "%s\r\n", buf);
90         if (verbose)
91                 log_print("SMTP> %s\n", buf);
92
93         return smtp_ok(sock);
94 }
95
96 gint smtp_data(SockInfo *sock)
97 {
98         sock_printf(sock, "DATA\r\n");
99         if (verbose)
100                 log_print("SMTP> DATA\n");
101
102         return smtp_ok(sock);
103 }
104
105 gint smtp_rset(SockInfo *sock)
106 {
107         sock_printf(sock, "RSET\r\n");
108         if (verbose)
109                 log_print("SMTP> RSET\n");
110
111         return smtp_ok(sock);
112 }
113
114 gint smtp_quit(SockInfo *sock)
115 {
116         sock_printf(sock, "QUIT\r\n");
117         if (verbose)
118                 log_print("SMTP> QUIT\n");
119
120         return smtp_ok(sock);
121 }
122
123 gint smtp_eom(SockInfo *sock)
124 {
125         sock_printf(sock, ".\r\n");
126         if (verbose)
127                 log_print("SMTP> . (EOM)\n");
128
129         return smtp_ok(sock);
130 }
131
132 gint smtp_ok(SockInfo *sock)
133 {
134         while ((sock_gets(sock, smtp_response, sizeof(smtp_response) - 1))
135                != -1) {
136                 if (strlen(smtp_response) < 4)
137                         return SM_ERROR;
138                 strretchomp(smtp_response);
139
140                 if (verbose)
141                         log_print("SMTP< %s\n", smtp_response);
142
143                 if ((smtp_response[0] == '1' || smtp_response[0] == '2' ||
144                      smtp_response[0] == '3') &&
145                      (smtp_response[3] == ' ' || smtp_response[3] == '\0'))
146                         return SM_OK;
147                 else if (smtp_response[3] != '-')
148                         return SM_ERROR;
149                 else if (smtp_response[0] == '5' &&
150                          smtp_response[1] == '0' &&
151                          (smtp_response[2] == '4' ||
152                           smtp_response[2] == '3' ||
153                           smtp_response[2] == '1'))
154                         return SM_ERROR;
155         }
156
157         return SM_UNRECOVERABLE;
158 }