2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2001 Hiroyuki Yamamoto
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.
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.
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.
29 #define MSGBUFSIZE 8192
31 static gint verbose = 1;
32 static gchar smtp_response[MSGBUFSIZE];
34 gint smtp_helo(SockInfo *sock, const gchar *hostname, gboolean esmtp)
37 return esmtp_ehlo(sock, hostname);
39 sock_printf(sock, "HELO %s\r\n", hostname);
41 log_print("SMTP> HELO %s\n", hostname);
47 gint smtp_from(SockInfo *sock, const gchar *from,
48 const gchar *userid, const gchar *passwd,
49 gboolean use_smtp_auth)
51 gchar buf[MSGBUFSIZE];
52 SMTPAuthType authtype;
55 /* exist AUTH-Type CRAM_MD5 */
56 if (!smtp_auth_methods[SMTPAUTH_CRAM_MD5]
57 || esmtp_auth_cram_md5(sock) == SM_ERROR) {
58 /* exist AUTH-Type LOGIN */
59 if (!smtp_auth_methods[SMTPAUTH_LOGIN]
60 || esmtp_auth_login(sock) == SM_ERROR)
63 authtype = SMTPAUTH_LOGIN;
65 authtype = SMTPAUTH_CRAM_MD5;
67 if (esmtp_auth(sock, authtype, userid, passwd) != SM_OK)
71 if (strchr(from, '<'))
72 g_snprintf(buf, sizeof(buf), "MAIL FROM: %s", from);
74 g_snprintf(buf, sizeof(buf), "MAIL FROM: <%s>", from);
76 sock_printf(sock, "%s\r\n", buf);
78 log_print("SMTP> %s\n", buf);
83 gint smtp_rcpt(SockInfo *sock, const gchar *to)
85 gchar buf[MSGBUFSIZE];
88 g_snprintf(buf, sizeof(buf), "RCPT TO: %s", to);
90 g_snprintf(buf, sizeof(buf), "RCPT TO: <%s>", to);
92 sock_printf(sock, "%s\r\n", buf);
94 log_print("SMTP> %s\n", buf);
99 gint smtp_data(SockInfo *sock)
101 sock_printf(sock, "DATA\r\n");
103 log_print("SMTP> DATA\n");
105 return smtp_ok(sock);
108 gint smtp_rset(SockInfo *sock)
110 sock_printf(sock, "RSET\r\n");
112 log_print("SMTP> RSET\n");
114 return smtp_ok(sock);
117 gint smtp_quit(SockInfo *sock)
119 sock_printf(sock, "QUIT\r\n");
121 log_print("SMTP> QUIT\n");
123 return smtp_ok(sock);
126 gint smtp_eom(SockInfo *sock)
128 sock_printf(sock, ".\r\n");
130 log_print("SMTP> . (EOM)\n");
132 return smtp_ok(sock);
135 gint smtp_ok(SockInfo *sock)
137 while ((sock_gets(sock, smtp_response, sizeof(smtp_response) - 1))
139 if (strlen(smtp_response) < 4)
141 strretchomp(smtp_response);
144 log_print("SMTP< %s\n", smtp_response);
146 if ((smtp_response[0] == '1' || smtp_response[0] == '2' ||
147 smtp_response[0] == '3') &&
148 (smtp_response[3] == ' ' || smtp_response[3] == '\0'))
150 else if (smtp_response[3] != '-')
152 else if (smtp_response[0] == '5' &&
153 smtp_response[1] == '0' &&
154 (smtp_response[2] == '4' ||
155 smtp_response[2] == '3' ||
156 smtp_response[2] == '1'))
160 return SM_UNRECOVERABLE;