3 * Copyright (c) 1998-2012 by the citadel.org team
5 * This program is open source 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 3 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
20 typedef enum _eSMTP_C_States {
35 typedef struct _stmp_out_msg {
44 struct ares_mx_reply *AllMX;
45 struct ares_mx_reply *CurrMX;
48 const char *LookupHostname;
52 DNSQueryParts MxLookup;
53 DNSQueryParts HostLookup;
54 struct hostent *OneMX;
58 ParsedURL *pCurrRelay;
60 const char *envelope_from;
69 typedef eNextState (*SMTPReadHandler)(SmtpOutMsg *Msg);
70 typedef eNextState (*SMTPSendHandler)(SmtpOutMsg *Msg);
72 SMTPReadHandler ReadHandlers[eMaxSMTPC];
73 SMTPSendHandler SendHandlers[eMaxSMTPC];
74 const ConstStr ReadErrors[eMaxSMTPC+1];
75 const double SMTP_C_ReadTimeouts[eMaxSMTPC];
76 const double SMTP_C_SendTimeouts[eMaxSMTPC];
77 const double SMTP_C_ConnTimeout;
79 #define F_RELAY (1<<0) /* we have a Relay host configuration */
80 #define F_HAVE_FALLBACK (1<<1) /* we have a fallback host configuration */
81 #define F_FALLBACK (1<<2)
82 #define F_HAVE_MX (1<<3) /* we have a list of mx records to go through.*/
83 #define F_DIRECT (1<<4) /* no mx record found, trying direct connect. */
86 int smtp_resolve_recipients(SmtpOutMsg *SendMsg);
88 #define QID ((SmtpOutMsg*)IO->Data)->MyQItem->MessageID
89 #define N ((SmtpOutMsg*)IO->Data)->n
91 #define EVS_syslog(LEVEL, FORMAT, ...) \
93 "IO[%ld]CC[%d]S[%ld][%ld]" FORMAT, \
94 IO->ID, CCID, QID, N, __VA_ARGS__)
96 #define EVSM_syslog(LEVEL, FORMAT) \
98 "IO[%ld]CC[%d]S[%ld][%ld]" FORMAT, \
101 #define EVNCS_syslog(LEVEL, FORMAT, ...) \
102 syslog(LEVEL, "IO[%ld]S[%ld][%ld]" FORMAT, \
103 IO->ID, QID, N, __VA_ARGS__)
105 #define EVNCSM_syslog(LEVEL, FORMAT) \
106 syslog(LEVEL, "IO[%ld]S[%ld][%ld]" FORMAT, \