104 #include <sys/stat.h>
105 #include <sys/socket.h>
106 #include <netinet/in.h>
113 #ifdef STRCASECMP_IN_STRINGS_H
196 #define SMTP_STATE_XFORWARD_NAME_ADDR 0
197 #define SMTP_STATE_XFORWARD_PROTO_HELO 1
198 #define SMTP_STATE_MAIL 2
199 #define SMTP_STATE_RCPT 3
200 #define SMTP_STATE_DATA 4
201 #define SMTP_STATE_DOT 5
202 #define SMTP_STATE_ABORT 6
203 #define SMTP_STATE_RSET 7
204 #define SMTP_STATE_QUIT 8
205 #define SMTP_STATE_LAST 9
220 "sending XFORWARD name/address",
221 "sending XFORWARD protocol/helo_name",
224 "sending DATA command",
225 "sending end of data -- message may be sent more than once",
226 "sending final RSET",
227 "sending RSET probe",
232 "XFORWARD name/address command",
233 "XFORWARD helo/protocol command",
237 "end of DATA command",
238 "final RSET command",
248 #define SMTP_MIME_DOWNGRADE(session, request) \
249 (var_disable_mime_oconv == 0 \
250 && (session->features & SMTP_FEATURE_8BITMIME) == 0 \
251 && strcmp(request->encoding, MAIL_ATTR_ENC_7BIT) != 0)
263 static void smtp_hbc_logger(
void *,
const char *,
const char *,
const char *,
const char *);
264 static void smtp_text_out(
void *,
int,
const char *, ssize_t, off_t);
271 static int smtp_vrfy_tgt;
277 static const NAME_CODE vrfy_init_table[] = {
285 msg_fatal(
"bad protocol stage: \"%s = %s\"",
293 const char *myname =
"smtp_helo";
304 static const NAME_CODE xforward_features[] = {
314 const char *ehlo_words;
316 static const NAME_MASK pix_bug_table[] = {
321 const char *pix_bug_words;
322 const char *pix_bug_source;
326 int saved_features = session->
features;
340 tls_helo_status = smtp_start_tls(state);
342 return (tls_helo_status);
364 where =
"receiving the initial server greeting";
374 "host %s refused to talk to me: %s",
388 "client TLS configuration problem"));
396 if (resp->
str[strspn(resp->
str,
"20 *\t\n")] == 0) {
407 if (*pix_bug_words) {
414 pix_bug_mask &= ~SMTP_FEATURE_PIX_DELAY_DOTCRLF;
415 msg_info(
"%s: enabling PIX workarounds: %s for %s",
418 pix_bug_table, pix_bug_mask),
432 for (n = 0; (word =
mystrtok(&words,
" \t\n")) != 0; n++) {
435 msg_warn(
"host %s greeted me with my own hostname %s",
465 where =
"performing the EHLO handshake";
469 if (resp->
code == 421)
471 "host %s refused to talk to me: %s",
479 where =
"performing the HELO handshake";
483 "host %s refused to talk to me: %s",
488 where =
"performing the LHLO handshake";
492 "host %s refused to talk to me: %s",
512 msg_warn(
"%s: %s map lookup error for %s",
519 msg_info(
"discarding EHLO keywords: %s",
533 for (n = 0; (words =
mystrtok(&lines,
"\n")) != 0; ) {
535 && (word =
mystrtok(&words,
" \t=")) != 0) {
537 if (session->
helo != 0)
549 msg_warn(
"host %s replied to HELO/EHLO"
550 " with my own hostname %s",
555 "mail for %s loops back to myself",
560 "mail for %s loops back to myself",
563 }
else if (
strcasecmp(word,
"8BITMIME") == 0) {
566 }
else if (
strcasecmp(word,
"PIPELINING") == 0) {
569 }
else if (
strcasecmp(word,
"XFORWARD") == 0) {
571 while ((word =
mystrtok(&words,
" \t")) != 0)
578 if ((word =
mystrtok(&words,
" \t")) != 0) {
580 msg_warn(
"bad EHLO SIZE limit \"%s\" from %s",
587 }
else if (
strcasecmp(word,
"STARTTLS") == 0) {
601 }
else if (
strcasecmp(word,
"SMTPUTF8") == 0) {
610 msg_info(
"server features: 0x%x size %.0f",
636 #define DELIVERY_REQUIRES_SMTPUTF8 \
637 ((request->smtputf8 & SMTPUTF8_FLAG_REQUESTED) \
638 && (request->smtputf8 & ~SMTPUTF8_FLAG_REQUESTED))
650 "SMTPUTF8 is required, "
651 "but was not offered by host %s",
661 msg_info(
"host %s offers SMTPUTF8 support, but not 8BITMIME",
705 #define PIPELINING_BUFSIZE VSTREAM_BUFSIZE
707 #define TLS_WORST_PAYLOAD 16384
708 #define TLS_WORST_COMP_OVERHD 1024
709 #define TLS_WORST_PROTO_OVERHD 128
710 #define TLS_WORST_SMTP_PAYLOAD (TLS_WORST_PAYLOAD - TLS_WORST_COMP_OVERHD)
711 #define TLS_WORST_TOTAL_OVERHD (TLS_WORST_COMP_OVERHD + TLS_WORST_PROTO_OVERHD)
717 int enc_overhead = 0;
719 optlen =
sizeof(tcp_bufsize);
721 SO_SNDBUF, (
char *) &tcp_bufsize, &optlen) < 0)
727 / TLS_WORST_SMTP_PAYLOAD) * TLS_WORST_TOTAL_OVERHD;
732 SO_SNDBUF, (
char *) &tcp_bufsize, optlen) < 0)
736 msg_info(
"Using %s PIPELINING, TCP send buffer size is %d, "
737 "PIPELINING buffer size is %d",
760 && smtp_tls_ctx != 0 && state->tls->level >=
TLS_LEV_MAY) {
769 "receiving the STARTTLS response"));
790 tls_helo_status = smtp_start_tls(state);
792 return (tls_helo_status);
802 "TLS is required, but host %s refused to start TLS: %s",
819 "TLS is required, but was not offered by host %s",
821 }
else if (smtp_tls_ctx == 0) {
824 "TLS is required, but our TLS engine is unavailable"));
826 msg_warn(
"%s: TLS is required but unavailable, don't know why",
830 "TLS is required, but unavailable"));
851 TLS_CLIENT_START_PROPS tls_props;
910 session->tls_context =
911 TLS_CLIENT_START(&tls_props,
915 tls_level = state->tls->level,
916 nexthop = session->tls_nexthop,
920 helo = session->
helo,
921 protocols = state->tls->protocols,
922 cipher_grade = state->tls->grade,
925 matchargv = state->tls->matchargv,
927 dane = state->tls->dane);
930 if (session->tls_context == 0) {
959 "Cannot start TLS: handshake failure"));
976 if (!TLS_CERT_IS_TRUSTED(session->tls_context))
979 "Server certificate not trusted"));
981 if (!TLS_CERT_IS_MATCHED(session->tls_context))
984 "Server certificate not verified"));
1000 static void smtp_hbc_logger(
void *context,
const char *action,
1001 const char *where,
const char *content,
1017 static void smtp_text_out(
void *context,
int rec_type,
1018 const char *text, ssize_t len,
1019 off_t unused_offset)
1024 const char *data_start;
1037 && data_left > 0 && *data_start ==
'.')
1058 }
while (data_left > 0);
1063 static void PRINTFLIKE(3, 4) smtp_format_out(
void *,
int, const
char *,...);
1065 static
void smtp_format_out(
void *context,
int rec_type, const
char *
fmt,...)
1080 static void smtp_header_out(
void *context,
int unused_header_class,
1092 for (line = start; line; line = next_line) {
1095 next_line - line - 1 : strlen(line), offset);
1101 static void smtp_header_rewrite(
void *context,
int header_class,
1106 int did_rewrite = 0;
1118 header_info, buf, offset);
1122 msg_warn(
"%s: smtp header checks lookup error",
1126 if (result !=
STR(buf)) {
1145 + strlen(header_info->
name) + 1);
1147 for (tpp = addr_list; *tpp; tpp++)
1155 myfree((
void *) addr_list);
1162 if (did_rewrite == 0) {
1163 smtp_header_out(context, header_class, header_info, buf, offset);
1176 for (line = start =
vstring_str(buf); line != 0; line = next_line) {
1177 end_line = line + strcspn(line,
"\n");
1179 if (end_line - start < 70) {
1185 next_line = *end_line ? end_line + 1 : 0;
1196 for (line = start =
vstring_str(buf); line != 0; line = next_line) {
1200 next_line - line - 1 : strlen(line), offset);
1209 static void smtp_body_rewrite(
void *context,
int type,
1210 const char *buf, ssize_t len,
1221 if (result == buf) {
1222 smtp_text_out(state, type, buf, len, offset);
1224 msg_warn(
"%s: smtp body checks lookup error",
1227 }
else if (result != 0) {
1228 smtp_text_out(state, type, result, strlen(result), offset);
1236 static void smtp_mime_fail(
SMTP_STATE *state,
int mime_errs)
1244 "%s", detail->
text);
1252 const char *myname =
"smtp_loop";
1278 #define REWRITE_ADDRESS(dst, src) do { \
1279 vstring_strcpy(dst, src); \
1280 if (*(src) && smtp_generic_maps) \
1281 smtp_map11_internal(dst, smtp_generic_maps, \
1282 smtp_ext_prop_mask & EXT_PROP_GENERIC); \
1285 #define QUOTE_ADDRESS(dst, src) do { \
1286 if (*(src) && var_smtp_quote_821_env) { \
1287 quote_821_local(dst, src); \
1289 vstring_strcpy(dst, src); \
1295 #define RETURN(x) do { \
1296 if (recv_state != SMTP_STATE_LAST) \
1297 DONT_CACHE_THIS_SESSION; \
1298 vstring_free(next_command); \
1300 myfree((void *) survivors); \
1301 if (session->mime_state) \
1302 session->mime_state = mime_state_free(session->mime_state); \
1306 #define SENDER_IS_AHEAD \
1307 (recv_state < send_state || recv_rcpt != send_rcpt)
1309 #define SENDER_IN_WAIT_STATE \
1310 (send_state == SMTP_STATE_DOT || send_state == SMTP_STATE_LAST)
1312 #define SENDING_MAIL \
1313 (recv_state <= SMTP_STATE_DOT)
1315 #define CANT_RSET_THIS_SESSION \
1316 (session->features |= SMTP_FEATURE_RSET_REJECTED)
1335 next_rcpt = send_rcpt = recv_rcpt = recv_done = 0;
1336 mail_from_rejected = 0;
1360 msg_panic(
"%s: bad sender state %d (receiver state %d)",
1361 myname, send_state, recv_state);
1365 msg_warn(
"smtp_proto: spurious flush before read in send state %d",
1379 switch (send_state) {
1385 msg_panic(
"%s: bad sender state %d", myname, send_state);
1399 #ifndef CAN_FORWARD_CLIENT_NAME
1400 #define _ATTR_AVAIL_AND_KNOWN_(val) \
1401 (DEL_REQ_ATTR_AVAIL(val) && strcasecmp((val), "unknown"))
1402 #define CAN_FORWARD_CLIENT_NAME _ATTR_AVAIL_AND_KNOWN_
1403 #define CAN_FORWARD_CLIENT_ADDR _ATTR_AVAIL_AND_KNOWN_
1404 #define CAN_FORWARD_CLIENT_PORT _ATTR_AVAIL_AND_KNOWN_
1405 #define CAN_FORWARD_PROTO_NAME _ATTR_AVAIL_AND_KNOWN_
1406 #define CAN_FORWARD_HELO_NAME DEL_REQ_ATTR_AVAIL
1407 #define CAN_FORWARD_IDENT_NAME DEL_REQ_ATTR_AVAIL
1408 #define CAN_FORWARD_RWR_CONTEXT DEL_REQ_ATTR_AVAIL
1482 msg_warn(
"%s: unknown content encoding: %s",
1511 #ifdef USE_SASL_AUTH
1562 const char *orcpt_type_addr = rcpt->
dsn_orcpt;
1565 if (orcpt_type_addr[0] == 0 && rcpt->
orig_addr[0] != 0) {
1575 if (orcpt_type_addr[0] != 0) {
1579 if (
strncasecmp(orcpt_type_addr,
"utf-8;", 6) == 0) {
1581 orcpt_type_addr,
"+=") != 0)
1703 #define CHECK_PIPELINING_BUFSIZE \
1704 (recv_state != SMTP_STATE_DOT || send_state != SMTP_STATE_QUIT)
1713 || time((time_t *) 0)
1722 msg_panic(
"%s: bad receiver state %d (sender state %d)",
1723 myname, recv_state, send_state);
1745 #define LOST_CONNECTION_INSIDE_DATA (except == SMTP_ERR_EOF)
1752 "sending message body"));
1763 switch (recv_state) {
1769 if (resp->
code / 100 != 2)
1770 msg_warn(
"host %s said: %s (in reply to %s)",
1781 if (resp->
code / 100 != 2)
1782 msg_warn(
"host %s said: %s (in reply to %s)",
1795 if (resp->
code / 100 != 2) {
1797 "host %s said: %s (in reply to %s)",
1801 mail_from_rejected = 1;
1818 "unexpected server message");
1819 msg_warn(
"server %s violates %s policy",
1822 mail_from_rejected = 1;
1845 if (!mail_from_rejected) {
1847 if (resp->
code == 552) {
1853 if (resp->
code / 100 == 2) {
1859 survivors[nrcpt] = recv_rcpt;
1870 "host %s said: %s (in reply to %s)",
1891 if (resp->
code / 100 != 3) {
1894 "host %s said: %s (in reply to %s)",
1913 for (nrcpt = 0; nrcpt < recv_rcpt; nrcpt++) {
1939 if (resp->
code / 100 != 2) {
1941 "host %s said: %s (in reply to %s)",
1946 for (nrcpt = 0; nrcpt < recv_rcpt; nrcpt++) {
1965 + survivors[recv_done++];
1966 if (resp->
code / 100 != 2) {
1968 "host %s said: %s (in reply to %s)",
1978 msg_info(
"%s: got %d of %d end-of-data replies",
1979 myname, recv_done, nrcpt);
1980 if (recv_done < nrcpt)
2025 if (resp->
code / 100 != 2)
2054 send_rcpt = recv_rcpt = 0;
2096 #define SMTP_ANY_CHECKS (smtp_header_checks || smtp_body_checks)
2107 smtp_header_rewrite :
2122 smtp_text_out((
void *) state, rec_type,
2132 smtp_mime_fail(state, mime_errs);
2136 prev_type = rec_type;
2154 smtp_mime_fail(state, mime_errs);
2166 msg_warn(
"%s: bad record type: %d in message content",
2170 "unreadable mail queue entry");
2183 "sending message body"));
2210 send_state = next_state;
2211 send_rcpt = next_rcpt;
2232 msg_panic(
"smtp_xfer: bad recipient count: %d",
2235 msg_panic(
"smtp_xfer: bad recipient status: %d",
2246 "message size %lu exceeds size limit %.0f of server %s",
2291 result = smtp_loop(state, send_state, recv_state);
#define SMTP_KEY_FLAG_HOSTNAME
#define SMTP_FEATURE_8BITMIME
#define SMTP_VRFY_TGT_RCPT
bool var_smtp_always_ehlo
bool var_smtp_tls_wrappermode
#define SMTP_FEATURE_EARLY_TLS_MAIL_REPLY
SMTP_ITERATOR iterator[1]
struct SMTP_SESSION * session
#define THIS_SESSION_IS_CACHED
char * mystrdup(const char *str)
#define EHLO_MASK_XFORWARD
#define str_name_mask(tag, table, mask)
#define CAN_FORWARD_PROTO_NAME
#define EHLO_MASK_STARTTLS
#define EHLO_MASK_SMTPUTF8
MIME_STATE * mime_state_alloc(int flags, MIME_STATE_HEAD_OUT head_out, MIME_STATE_ANY_END head_end, MIME_STATE_BODY_OUT body_out, MIME_STATE_ANY_END body_end, MIME_STATE_ERR_PRINT err_print, void *context)
TOK822 ** tok822_grep(TOK822 *, int)
NORETURN msg_panic(const char *fmt,...)
#define XFORWARD_DOM_LOCAL
#define SMTP_FEATURE_SIZE
#define PIX_BUG_DISABLE_ESMTP
VSTRING * xtext_quote_append(VSTRING *quoted, const char *unquoted, const char *special)
int * xfer_timeouts[SMTP_STATE_LAST]
#define SMTP_RESP_FAKE(resp, _dsn)
off_t off_cvt_string(const char *str)
DELIVER_REQUEST * request
#define vstream_longjmp(stream, val)
int var_smtp_starttls_tmout
HBC_CALL_BACKS smtp_hbc_callbacks[1]
#define DEL_REQ_TRACE_ONLY(f)
bool var_smtp_tls_note_starttls_offer
#define EHLO_MASK_8BITMIME
VSTRING * vstring_truncate(VSTRING *vp, ssize_t len)
#define MAIL_ATTR_RWR_LOCAL
#define SMTP_MISC_FLAG_IN_STARTTLS
char * xfer_request[SMTP_STATE_LAST]
#define SMTP_KEY_FLAG_SERVICE
char * translit(char *, const char *, const char *)
#define CAN_FORWARD_RWR_CONTEXT
#define SMTP_FEATURE_XFORWARD_IDENT
int alldig(const char *string)
#define vstream_setjmp(stream)
#define RETRY_AS_PLAINTEXT
char * mystrtok(char **src, const char *sep)
int smtp_sasl_helo_login(SMTP_STATE *)
#define vstream_ftime(vp)
#define CAN_FORWARD_CLIENT_PORT
#define SMTP_STATE_XFORWARD_NAME_ADDR
#define MIME_OPT_DISABLE_MIME
int strncasecmp(const char *s1, const char *s2, size_t n)
#define SMTP_FEATURE_STARTTLS
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
TOK822 * tok822_free_tree(TOK822 *)
void smtp_vrfy_init(void)
#define VSTRING_TERMINATE(vp)
const char * str_ehlo_mask(int mask_bits)
#define SMTPUTF8_FLAG_REQUESTED
int smtp_xfer(SMTP_STATE *state)
int smtp_map11_tree(TOK822 *, MAPS *, int)
#define SENDER_IN_WAIT_STATE
#define SMTP_FEATURE_BEST_MX
#define CAN_FORWARD_HELO_NAME
#define SMTP_RESP_SET_DSN(resp, _dsn)
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
VSTRING * vstring_vsprintf(VSTRING *vp, const char *format, va_list ap)
bool var_smtp_dummy_mail_auth
#define TLS_MUST_TRUST(l)
struct timeval conn_setup_done
#define MAIL_ATTR_ENC_NONE
void smtp_sasl_helo_auth(SMTP_SESSION *, const char *)
int mime_state_update(MIME_STATE *state, int rec_type, const char *text, ssize_t len)
#define SMTP_MISC_FLAG_COMPLETE_SESSION
int smtp_misc_fail(SMTP_STATE *state, int throttle, const char *mta_name, SMTP_RESP *resp, const char *format,...)
#define DONT_CACHE_THIS_SESSION
bool var_smtp_rec_deadline
char * xfer_states[SMTP_STATE_LAST]
void smtp_fputc(int ch, VSTREAM *stream)
VSTRING * uxtext_quote(VSTRING *quoted, const char *unquoted, const char *special)
#define CAN_FORWARD_IDENT_NAME
void(* MIME_STATE_ANY_END)(void *)
#define THIS_SESSION_IS_EXPIRED
#define VSTRING_RESET(vp)
#define SMTP_FEATURE_XFORWARD_DOMAIN
#define VSTREAM_PURGE_BOTH
bool var_smtp_tls_blk_early_mail_reply
#define SMTP_RCPT_ISMARKED(rcpt)
void msg_warn(const char *fmt,...)
char * hbc_header_checks(void *context, HBC_CHECKS *hbc, int header_class, const HEADER_OPTS *hdr_opts, VSTRING *header, off_t offset)
int smtp_quit(SMTP_STATE *state)
void smtp_stream_setup(VSTREAM *stream, int maxtime, int enable_deadline)
VSTRING * vstring_alloc(ssize_t len)
void smtp_fputs(const char *cp, ssize_t todo, VSTREAM *stream)
#define NAME_CODE_FLAG_NONE
#define CANT_RSET_THIS_SESSION
#define REWRITE_ADDRESS(dst, src)
const char * dsn_notify_str(int mask)
VSTRING * tok822_externalize(VSTRING *, TOK822 *, int)
struct timeval incoming_arrival
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
const MIME_STATE_DETAIL * mime_state_detail(int error_code)
void smtp_fwrite(const char *cp, ssize_t todo, VSTREAM *stream)
#define SMTP_FEATURE_XFORWARD_HELO
#define SMTP_FEATURE_PIPELINING
#define CAN_FORWARD_CLIENT_ADDR
#define smtp_mesg_fail(state, mta, resp,...)
#define SMTP_FEATURE_XFORWARD_PORT
int name_code(const NAME_CODE *table, int flags, const char *name)
struct MIME_STATE * mime_state
#define SMTP_STATE_XFORWARD_PROTO_HELO
NORETURN msg_fatal(const char *fmt,...)
#define XFORWARD_DOM_REMOTE
#define VAR_SMTP_VRFY_TGT
off_t vstream_fseek(VSTREAM *stream, off_t offset, int whence)
#define DONT_USE_FORBIDDEN_SESSION
#define SMTP_FEATURE_PIX_NO_ESMTP
char * var_smtp_ehlo_dis_words
#define SMTP_VRFY_TGT_DATA
#define LOST_CONNECTION_INSIDE_DATA
#define SMTP_MIME_DOWNGRADE(session, request)
void smtp_flush(VSTREAM *stream)
#define SMTP_FEATURE_AUTH
#define VSTREAM_BST_OUT_PEND
HBC_CHECKS * smtp_header_checks
#define MIME_OPT_DOWNGRADE
#define SMTP_RCPT_LEFT(state)
#define CHECK_PIPELINING_BUFSIZE
#define quote_822_local(dst, src)
int const char SMTP_RESP const char void RECIPIENT const char SMTP_RESP const char int smtp_stream_except(SMTP_STATE *, int, const char *)
int strcasecmp(const char *s1, const char *s2)
#define HBC_CHECKS_STAT_ERROR
#define SMTP_FEATURE_SMTPUTF8
#define SMTP_KEY_FLAG_NEXTHOP
void(* MIME_STATE_ERR_PRINT)(void *, int, const char *, ssize_t)
bool var_smtp_skip_5xx_greeting
void smtp_chat_cmd(SMTP_SESSION *session, const char *fmt,...)
void smtp_sasl_cleanup(SMTP_SESSION *)
VSTRING * vstring_free(VSTRING *vp)
char * var_smtp_tls_fpt_dgst
#define SMTP_KEY_FLAG_ADDR
#define TLS_MUST_MATCH(l)
char * split_at(char *string, int delimiter)
#define vstream_fileno(vp)
int mark_corrupt(VSTREAM *src)
VSTRING * xtext_quote(VSTRING *quoted, const char *unquoted, const char *special)
#define SMTP_FEATURE_PIX_DELAY_DOTCRLF
#define SMTP_MISC_FLAG_LOOP_DETECT
#define NAME_MASK_ANY_CASE
SMTP_RESP * smtp_chat_resp(SMTP_SESSION *)
MAPS * smtp_ehlo_dis_maps
void smtp_rcpt_done(SMTP_STATE *, SMTP_RESP *, RECIPIENT *)
void smtp_rcpt_fail(SMTP_STATE *state, RECIPIENT *rcpt, const char *mta_name, SMTP_RESP *resp, const char *format,...)
int smtp_rset(SMTP_STATE *state)
int smtp_helo(SMTP_STATE *state)
#define MIME_OPT_REPORT_NESTING
char * hbc_body_checks(void *context, HBC_CHECKS *hbc, const char *line, ssize_t len, off_t offset)
ssize_t vstream_bufstat(VSTREAM *vp, int command)
struct timeval deliver_done
#define MAIL_ATTR_ENC_8BIT
#define rec_get(fp, buf, limit)
#define VSTREAM_PURGE_WRITE
int vstream_fpurge(VSTREAM *stream, int direction)
const char * maps_find(MAPS *maps, const char *name, int flags)
#define vstream_ferror(vp)
const char * dsn_ret_str(int code)
#define smtp_site_fail(state, mta, resp,...)
bool var_smtp_sasl_enable
#define PIPELINING_BUFSIZE
HBC_CHECKS * smtp_body_checks
char * var_smtp_pix_bug_words
char * smtp_key_prefix(VSTRING *, const char *, SMTP_ITERATOR *, int)
#define name_mask_opt(tag, table, str, flags)
#define CAN_FORWARD_CLIENT_NAME
#define QUOTE_ADDRESS(dst, src)
VSTRING * vstring_strcat(VSTRING *vp, const char *src)
#define SMTP_FEATURE_XFORWARD_PROTO
#define SMTP_FEATURE_ESMTP
#define SMTP_FEATURE_XFORWARD_ADDR
#define SMTP_FEATURE_XFORWARD_NAME
#define MAIL_ATTR_ENC_7BIT
#define EHLO_MASK_PIPELINING
int ehlo_mask(const char *mask_str)
void * mymalloc(ssize_t len)
#define PLAINTEXT_FALLBACK_OK_AFTER_STARTTLS_FAILURE
bool var_smtp_send_xforward
#define DELIVERY_REQUIRES_SMTPUTF8
char * var_smtp_helo_name
void msg_info(const char *fmt,...)
#define PIX_BUG_DELAY_DOTCRLF