sink.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:30k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * sink.c -- forwarding/delivery support for fetchmail
  3.  *
  4.  * The interface of this module (open_sink(), stuff_line(), close_sink(),
  5.  * release_sink()) seals off the delivery logic from the protocol machine,
  6.  * so the latter won't have to care whether it's shipping to an [SL]MTP
  7.  * listener daemon or an MDA pipe.
  8.  *
  9.  * Copyright 1998 by Eric S. Raymond
  10.  * For license terms, see the file COPYING in this directory.
  11.  */
  12. #include  "config.h"
  13. #include  <stdio.h>
  14. #include  <errno.h>
  15. #include  <string.h>
  16. #include  <signal.h>
  17. #include  <time.h>
  18. #ifdef HAVE_MEMORY_H
  19. #include  <memory.h>
  20. #endif /* HAVE_MEMORY_H */
  21. #if defined(STDC_HEADERS)
  22. #include  <stdlib.h>
  23. #endif
  24. #if defined(HAVE_UNISTD_H)
  25. #include <unistd.h>
  26. #endif
  27. #if defined(HAVE_STDARG_H)
  28. #include  <stdarg.h>
  29. #else
  30. #include  <varargs.h>
  31. #endif
  32. #include  <ctype.h>
  33. #include  "fetchmail.h"
  34. #include  "socket.h"
  35. #include  "smtp.h"
  36. #include  "i18n.h"
  37. /* BSD portability hack...I know, this is an ugly place to put it */
  38. #if !defined(SIGCHLD) && defined(SIGCLD)
  39. #define SIGCHLD SIGCLD
  40. #endif
  41. /* makes the open_sink()/close_sink() pair non-reentrant */
  42. static int lmtp_responses;
  43. static int smtp_open(struct query *ctl)
  44. /* try to open a socket to the appropriate SMTP server for this query */ 
  45. {
  46.     /* maybe it's time to close the socket in order to force delivery */
  47.     if (NUM_NONZERO(ctl->batchlimit) && (ctl->smtp_socket != -1) && ++batchcount == ctl->batchlimit)
  48.     {
  49. SockClose(ctl->smtp_socket);
  50. ctl->smtp_socket = -1;
  51. batchcount = 0;
  52.     }
  53.     /* if no socket to any SMTP host is already set up, try to open one */
  54.     if (ctl->smtp_socket == -1) 
  55.     {
  56. /* 
  57.  * RFC 1123 requires that the domain name in HELO address is a
  58.  * "valid principal domain name" for the client host. If we're
  59.  * running in invisible mode, violate this with malice
  60.  * aforethought in order to make the Received headers and
  61.  * logging look right.
  62.  *
  63.  * In fact this code relies on the RFC1123 requirement that the
  64.  * SMTP listener must accept messages even if verification of the
  65.  * HELO name fails (RFC1123 section 5.2.5, paragraph 2).
  66.  *
  67.  * How we compute the true mailhost name to pass to the
  68.  * listener doesn't affect behavior on RFC1123- violating
  69.  * listeners that check for name match; we're going to lose
  70.  * on those anyway because we can never give them a name
  71.  * that matches the local machine fetchmail is running on.
  72.  * What it will affect is the listener's logging.
  73.  */
  74. struct idlist *idp;
  75. const char *id_me = run.invisible ? ctl->server.truename : fetchmailhost;
  76. int oldphase = phase;
  77. errno = 0;
  78. /*
  79.  * Run down the SMTP hunt list looking for a server that's up.
  80.  * Use both explicit hunt entries (value TRUE) and implicit 
  81.  * (default) ones (value FALSE).
  82.  */
  83. oldphase = phase;
  84. phase = LISTENER_WAIT;
  85. set_timeout(ctl->server.timeout);
  86. for (idp = ctl->smtphunt; idp; idp = idp->next)
  87. {
  88.     char *cp, *parsed_host;
  89. #ifdef INET6_ENABLE 
  90.     char *portnum = SMTP_PORT;
  91. #else
  92.     int portnum = SMTP_PORT;
  93. #endif /* INET6_ENABLE */
  94.     xalloca(parsed_host, char *, strlen(idp->id) + 1);
  95.     ctl->smtphost = idp->id;  /* remember last host tried. */
  96.     strcpy(parsed_host, idp->id);
  97.     if ((cp = strrchr(parsed_host, '/')))
  98.     {
  99. *cp++ = 0;
  100. #ifdef INET6_ENABLE 
  101. portnum = cp;
  102. #else
  103. portnum = atoi(cp);
  104. #endif /* INET6_ENABLE */
  105.     }
  106.     if ((ctl->smtp_socket = SockOpen(parsed_host,portnum,NULL,
  107.      ctl->server.plugout)) == -1)
  108. continue;
  109.     /* are we doing SMTP or LMTP? */
  110.     SMTP_setmode(ctl->listener);
  111.     /* first, probe for ESMTP */
  112.     if (SMTP_ok(ctl->smtp_socket) == SM_OK &&
  113.     SMTP_ehlo(ctl->smtp_socket, id_me,
  114.   &ctl->server.esmtp_options) == SM_OK)
  115.        break;  /* success */
  116.     /*
  117.      * RFC 1869 warns that some listeners hang up on a failed EHLO,
  118.      * so it's safest not to assume the socket will still be good.
  119.      */
  120.     SockClose(ctl->smtp_socket);
  121.     ctl->smtp_socket = -1;
  122.     /* if opening for ESMTP failed, try SMTP */
  123.     if ((ctl->smtp_socket = SockOpen(parsed_host,portnum,NULL,
  124.      ctl->server.plugout)) == -1)
  125. continue;
  126.     if (SMTP_ok(ctl->smtp_socket) == SM_OK && 
  127.     SMTP_helo(ctl->smtp_socket, id_me) == SM_OK)
  128. break;  /* success */
  129.     SockClose(ctl->smtp_socket);
  130.     ctl->smtp_socket = -1;
  131. }
  132. set_timeout(0);
  133. phase = oldphase;
  134.     }
  135.     /*
  136.      * RFC 1123 requires that the domain name part of the
  137.      * RCPT TO address be "canonicalized", that is a FQDN
  138.      * or MX but not a CNAME.  Some listeners (like exim)
  139.      * enforce this.  Now that we have the actual hostname,
  140.      * compute what we should canonicalize with.
  141.      */
  142.     ctl->destaddr = ctl->smtpaddress ? ctl->smtpaddress : ( ctl->smtphost ? ctl->smtphost : "localhost");
  143.     if (outlevel >= O_DEBUG && ctl->smtp_socket != -1)
  144. report(stdout, _("forwarding to %sn"), ctl->smtphost);
  145.     return(ctl->smtp_socket);
  146. }
  147. /* these are shared by open_sink and stuffline */
  148. static FILE *sinkfp;
  149. static RETSIGTYPE (*sigchld)(int);
  150. int stuffline(struct query *ctl, char *buf)
  151. /* ship a line to the given control block's output sink (SMTP server or MDA) */
  152. {
  153.     int n, oldphase;
  154.     char *last;
  155.     /* The line may contain NUL characters. Find the last char to use
  156.      * -- the real line termination is the sequence "n".
  157.      */
  158.     last = buf;
  159.     while ((last += strlen(last)) && (last[-1] != 'n'))
  160.         last++;
  161.     /* fix message lines that have only n termination (for qmail) */
  162.     if (ctl->forcecr)
  163.     {
  164.         if (last - 1 == buf || last[-2] != 'r')
  165. {
  166.     last[-1] = 'r';
  167.     *last++  = 'n';
  168.     *last    = '';
  169. }
  170.     }
  171.     oldphase = phase;
  172.     phase = FORWARDING_WAIT;
  173.     /*
  174.      * SMTP byte-stuffing.  We only do this if the protocol does *not*
  175.      * use .<CR><LF> as EOM.  If it does, the server will already have
  176.      * decorated any . lines it sends back up.
  177.      */
  178.     if (*buf == '.')
  179.     {
  180. if (ctl->server.base_protocol->delimited) /* server has already byte-stuffed */
  181. {
  182.     if (ctl->mda)
  183. ++buf;
  184.     else
  185. /* writing to SMTP, leave the byte-stuffing in place */;
  186. }
  187.         else /* if (!protocol->delimited) -- not byte-stuffed already */
  188. {
  189.     if (!ctl->mda)
  190. SockWrite(ctl->smtp_socket, buf, 1); /* byte-stuff it */
  191.     else
  192. /* leave it alone */;
  193. }
  194.     }
  195.     /* we may need to strip carriage returns */
  196.     if (ctl->stripcr)
  197.     {
  198. char *sp, *tp;
  199. for (sp = tp = buf; sp < last; sp++)
  200.     if (*sp != 'r')
  201. *tp++ =  *sp;
  202. *tp = '';
  203.         last = tp;
  204.     }
  205.     n = 0;
  206.     if (ctl->mda || ctl->bsmtp)
  207. n = fwrite(buf, 1, last - buf, sinkfp);
  208.     else if (ctl->smtp_socket != -1)
  209. n = SockWrite(ctl->smtp_socket, buf, last - buf);
  210.     phase = oldphase;
  211.     return(n);
  212. }
  213. static void sanitize(char *s)
  214. /* replace unsafe shellchars by an _ */
  215. {
  216.     const static char *ok_chars = " 1234567890!@%-_=+:,./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  217.     char *cp;
  218.     for (cp = s; *(cp += strspn(cp, ok_chars)); /* NO INCREMENT */)
  219.      *cp = '_';
  220. }
  221. static int send_bouncemail(struct query *ctl, struct msgblk *msg,
  222.    int userclass, char *message,
  223.    int nerrors, char *errors[])
  224. /* bounce back an error report a la RFC 1892 */
  225. {
  226.     char daemon_name[18 + HOSTLEN] = "FETCHMAIL-DAEMON@";
  227.     char boundary[BUFSIZ], *ts, *bounce_to;
  228.     int sock;
  229.     /* don't bounce  in reply to undeliverable bounces */
  230.     if (!msg->return_path[0] || strcmp(msg->return_path, "<>") == 0)
  231. return(FALSE);
  232.     bounce_to = (run.bouncemail ? msg->return_path : run.postmaster);
  233.     SMTP_setmode(SMTP_MODE);
  234.     strcat(daemon_name, fetchmailhost);
  235.     /* we need only SMTP for this purpose */
  236.     if ((sock = SockOpen("localhost", SMTP_PORT, NULL, NULL)) == -1
  237.      || SMTP_ok(sock) != SM_OK 
  238. || SMTP_helo(sock, "localhost") != SM_OK
  239. || SMTP_from(sock, daemon_name, (char *)NULL) != SM_OK
  240. || SMTP_rcpt(sock, bounce_to) != SM_OK
  241. || SMTP_data(sock) != SM_OK)
  242. return(FALSE);
  243.     /* our first duty is to keep the sacred foo counters turning... */
  244.     sprintf(boundary, 
  245.     "foo-mani-padme-hum-%d-%d-%ld", 
  246.     (int)getpid(), (int)getppid(), time((time_t *)NULL));
  247.     ts = rfc822timestamp();
  248.     if (outlevel >= O_VERBOSE)
  249. report(stdout, "SMTP: (bounce-message body)n");
  250.     else
  251. /* this will usually go to sylog... */
  252. report(stderr, "mail from %s bounced to %sn",
  253.        daemon_name, bounce_to);
  254.     /* bouncemail headers */
  255.     SockPrintf(sock, "Return-Path: <>rn");
  256.     SockPrintf(sock, "From: %srn", daemon_name);
  257.     SockPrintf(sock, "To: %srn", bounce_to);
  258.     SockPrintf(sock, "MIME-Version: 1.0rn");
  259.     SockPrintf(sock, "Content-Type: multipart/report; report-type=delivery-status;rntboundary="%s"rn", boundary);
  260.     SockPrintf(sock, "rn");
  261.     /* RFC1892 part 1 -- human-readable message */
  262.     SockPrintf(sock, "--%srn", boundary); 
  263.     SockPrintf(sock,"Content-Type: text/plainrn");
  264.     SockPrintf(sock, "rn");
  265.     SockWrite(sock, message, strlen(message));
  266.     SockPrintf(sock, "rn");
  267.     SockPrintf(sock, "rn");
  268.     if (nerrors)
  269.     {
  270. struct idlist *idp;
  271. int nusers;
  272. /* RFC1892 part 2 -- machine-readable responses */
  273. SockPrintf(sock, "--%srn", boundary); 
  274. SockPrintf(sock,"Content-Type: message/delivery-statusrn");
  275. SockPrintf(sock, "rn");
  276. SockPrintf(sock, "Reporting-MTA: dns; %srn", fetchmailhost);
  277. nusers = 0;
  278. for (idp = msg->recipients; idp; idp = idp->next)
  279.     if (idp->val.status.mark == userclass)
  280.     {
  281. char *error;
  282. /* Minimum RFC1894 compliance + Diagnostic-Code field */
  283. SockPrintf(sock, "rn");
  284. SockPrintf(sock, "Final-Recipient: rfc822; %srn", idp->id);
  285. SockPrintf(sock, "Last-Attempt-Date: %srn", ts);
  286. SockPrintf(sock, "Action: failedrn");
  287. if (nerrors == 1)
  288.     /* one error applies to all users */
  289.     error = errors[0];
  290. else if (nerrors > nusers)
  291. {
  292.     SockPrintf(sock, "Internal error: SMTP error count doesn't match number of recipients.rn");
  293.     break;
  294. }
  295. else
  296.     /* errors correspond 1-1 to selected users */
  297.     error = errors[nusers++];
  298. if (strlen(error) > 9 && isdigit(error[4])
  299. && error[5] == '.' && isdigit(error[6])
  300. && error[7] == '.' && isdigit(error[8]))
  301.     /* Enhanced status code available, use it */
  302.     SockPrintf(sock, "Status: %5.5srn", &(error[4]));
  303. else
  304.     /* Enhanced status code not available, fake one */
  305.     SockPrintf(sock, "Status: %c.0.0rn", error[0]);
  306. SockPrintf(sock, "Diagnostic-Code: %srn", error);
  307.     }
  308. SockPrintf(sock, "rn");
  309.     }
  310.     /* RFC1892 part 3 -- headers of undelivered message */
  311.     SockPrintf(sock, "--%srn", boundary); 
  312.     SockPrintf(sock, "Content-Type: text/rfc822-headersrn");
  313.     SockPrintf(sock, "rn");
  314.     SockWrite(sock, msg->headers, strlen(msg->headers));
  315.     SockPrintf(sock, "rn");
  316.     SockPrintf(sock, "--%s--rn", boundary); 
  317.     if (SMTP_eom(sock) != SM_OK || SMTP_quit(sock))
  318. return(FALSE);
  319.     SockClose(sock);
  320.     return(TRUE);
  321. }
  322. static int handle_smtp_report(struct query *ctl, struct msgblk *msg)
  323. /* handle SMTP errors based on the content of SMTP_response */
  324. /* return of PS_REFUSED deletes mail from the server; PS_TRANSIENT keeps it */
  325. {
  326.     int smtperr = atoi(smtp_response);
  327.     char *responses[1];
  328.     xalloca(responses[0], char *, strlen(smtp_response)+1);
  329.     strcpy(responses[0], smtp_response);
  330.     SMTP_rset(ctl->smtp_socket);    /* stay on the safe site */
  331.     /*
  332.      * Note: send_bouncemail message strings are not made subject
  333.      * to gettext translation because (a) they're going to be 
  334.      * embedded in a text/plain 7bit part, and (b) they're
  335.      * going to be associated with listener error-response
  336.      * messages, which are probably in English (none of the
  337.      * MTAs I know about are internationalized).
  338.      */
  339.     if (str_find(&ctl->antispam, smtperr))
  340.     {
  341. /*
  342.  * SMTP listener explicitly refuses to deliver mail
  343.  * coming from this address, probably due to an
  344.  * anti-spam domain exclusion.  Respect this.  Don't
  345.  * try to ship the message, and don't prevent it from
  346.  * being deleted.  Default values:
  347.  *
  348.  * 571 = sendmail's "unsolicited email refused"
  349.  * 550 = exim's new antispam response (temporary)
  350.  * 501 = exim's old antispam response
  351.  * 554 = Postfix antispam response.
  352.  *
  353.  */
  354. send_bouncemail(ctl, msg, XMIT_ACCEPT,
  355. "Our spam filter rejected this transaction.rn", 
  356. 1, responses);
  357. return(PS_REFUSED);
  358.     }
  359.     /*
  360.      * Suppress error message only if the response specifically 
  361.      * meant `excluded for policy reasons'.  We *should* see
  362.      * an error when the return code is less specific.
  363.      */
  364.     if (smtperr >= 400)
  365. report(stderr, _("%cMTP error: %sn"), 
  366.       ctl->listener,
  367.       smtp_response);
  368.     switch (smtperr)
  369.     {
  370.     case 552: /* message exceeds fixed maximum message size */
  371. /*
  372.  * Permanent no-go condition on the
  373.  * ESMTP server.  Don't try to ship the message, 
  374.  * and allow it to be deleted.
  375.  */
  376. send_bouncemail(ctl, msg, XMIT_ACCEPT,
  377. "This message was too large.rn", 
  378. 1, responses);
  379. return(run.bouncemail ? PS_REFUSED : PS_TRANSIENT);
  380.   
  381.     case 553: /* invalid sending domain */
  382. /*
  383.  * These latter days 553 usually means a spammer is trying to
  384.  * cover his tracks.  We never bouncemail on these, because 
  385.  * (a) the return address is invalid by definition, and 
  386.  * (b) we wouldn't want spammers to get confirmation that
  387.  * this address is live, anyway.
  388.  */
  389. send_bouncemail(ctl, msg, XMIT_ACCEPT,
  390. "Invalid address.rn", 
  391. 1, responses);
  392. return(PS_REFUSED);
  393.     default:
  394. /* bounce non-transient errors back to the sender */
  395. if (smtperr >= 500 && smtperr <= 599)
  396.     if (send_bouncemail(ctl, msg, XMIT_ACCEPT,
  397. "General SMTP/ESMTP error.rn", 
  398. 1, responses))
  399. return(run.bouncemail ? PS_REFUSED : PS_TRANSIENT);
  400. /*
  401.  * We're going to end up here on 4xx errors, like:
  402.  *
  403.  * 451: temporarily unable to identify sender (exim)
  404.  * 452: temporary out-of-queue-space condition on the ESMTP server.
  405.  *
  406.  * These are temporary errors.  Don't try to ship the message,
  407.  * and suppress deletion so it can be retried on a future
  408.  * retrieval cycle.
  409.  *
  410.  * Bouncemail *might* be appropriate here as a delay
  411.  * notification (note; if we ever add this, we must make
  412.  * sure the RFC1894 Action field is "delayed" rather thwn
  413.  * "failed").  But it's not really necessary because
  414.  * these are not actual failures, we're very likely to be
  415.  * able to recover on the next cycle.
  416.  */
  417. return(PS_TRANSIENT);
  418.     }
  419. }
  420. int open_sink(struct query *ctl, struct msgblk *msg,
  421.       int *good_addresses, int *bad_addresses)
  422. /* set up sinkfp to be an input sink we can ship a message to */
  423. {
  424.     struct idlist *idp;
  425.     *bad_addresses = *good_addresses = 0;
  426.     if (ctl->bsmtp) /* dump to a BSMTP batch file */
  427.     {
  428. if (strcmp(ctl->bsmtp, "-") == 0)
  429.     sinkfp = stdout;
  430. else
  431.     sinkfp = fopen(ctl->bsmtp, "a");
  432. /* see the ap computation under the SMTP branch */
  433. fprintf(sinkfp, 
  434. "MAIL FROM: %s", (msg->return_path[0]) ? msg->return_path : user);
  435. if (ctl->pass8bits || (ctl->mimemsg & MSG_IS_8BIT))
  436.     fputs(" BODY=8BITMIME", sinkfp);
  437. else if (ctl->mimemsg & MSG_IS_7BIT)
  438.     fputs(" BODY=7BIT", sinkfp);
  439. /* exim's BSMTP processor does not handle SIZE */
  440. /* fprintf(sinkfp, " SIZE=%drn", msg->reallen); */
  441. /*
  442.  * RFC 1123 requires that the domain name part of the
  443.  * RCPT TO address be "canonicalized", that is a FQDN
  444.  * or MX but not a CNAME.  Some listeners (like exim)
  445.  * enforce this.  Now that we have the actual hostname,
  446.  * compute what we should canonicalize with.
  447.  */
  448. ctl->destaddr = ctl->smtpaddress ? ctl->smtpaddress : "localhost";
  449. *bad_addresses = 0;
  450. for (idp = msg->recipients; idp; idp = idp->next)
  451.     if (idp->val.status.mark == XMIT_ACCEPT)
  452.     {
  453. if (strchr(idp->id, '@'))
  454.     fprintf(sinkfp,
  455. "RCPT TO: %srn", idp->id);
  456. else
  457.     fprintf(sinkfp,
  458. "RCPT TO: %s@%srn", idp->id, ctl->destaddr);
  459. *good_addresses = 0;
  460.     }
  461. fputs("DATArn", sinkfp);
  462. if (ferror(sinkfp))
  463. {
  464.     report(stderr, _("BSMTP file open or preamble write failedn"));
  465.     return(PS_BSMTP);
  466. }
  467.     }
  468.     else if (ctl->mda) /* we have a declared MDA */
  469.     {
  470. int length = 0, fromlen = 0, nameslen = 0;
  471. char *names = NULL, *before, *after, *from = NULL;
  472. ctl->destaddr = "localhost";
  473. for (idp = msg->recipients; idp; idp = idp->next)
  474.     if (idp->val.status.mark == XMIT_ACCEPT)
  475. (*good_addresses)++;
  476. length = strlen(ctl->mda);
  477. before = xstrdup(ctl->mda);
  478. /* get user addresses for %T (or %s for backward compatibility) */
  479. if (strstr(before, "%s") || strstr(before, "%T"))
  480. {
  481.     /*
  482.      * We go through this in order to be able to handle very
  483.      * long lists of users and (re)implement %s.
  484.      */
  485.     nameslen = 0;
  486.     for (idp = msg->recipients; idp; idp = idp->next)
  487. if ((idp->val.status.mark == XMIT_ACCEPT))
  488.     nameslen += (strlen(idp->id) + 1); /* string + ' ' */
  489.     if ((*good_addresses == 0))
  490. nameslen = strlen(run.postmaster);
  491.     names = (char *)xmalloc(nameslen + 1); /* account for '' */
  492.     if (*good_addresses == 0)
  493. strcpy(names, run.postmaster);
  494.     else
  495.     {
  496. names[0] = '';
  497. for (idp = msg->recipients; idp; idp = idp->next)
  498.     if (idp->val.status.mark == XMIT_ACCEPT)
  499.     {
  500. strcat(names, idp->id);
  501. strcat(names, " ");
  502.     }
  503. names[--nameslen] = ''; /* chop trailing space */
  504.     }
  505.     /* sanitize names in order to contain only harmless shell chars */
  506.     sanitize(names);
  507. }
  508. /* get From address for %F */
  509. if (strstr(before, "%F"))
  510. {
  511.     from = xstrdup(msg->return_path);
  512.     /* sanitize from in order to contain *only* harmless shell chars */
  513.     sanitize(from);
  514.     fromlen = strlen(from);
  515. }
  516. /* do we have to build an mda string? */
  517. if (names || from) 
  518. {
  519.     char *sp, *dp;
  520.     /* find length of resulting mda string */
  521.     sp = before;
  522.     while ((sp = strstr(sp, "%s"))) {
  523. length += nameslen - 2; /* subtract %s */
  524. sp += 2;
  525.     }
  526.     sp = before;
  527.     while ((sp = strstr(sp, "%T"))) {
  528. length += nameslen - 2; /* subtract %T */
  529. sp += 2;
  530.     }
  531.     sp = before;
  532.     while ((sp = strstr(sp, "%F"))) {
  533. length += fromlen - 2; /* subtract %F */
  534. sp += 2;
  535.     }
  536.     after = xmalloc(length + 1);
  537.     /* copy mda source string to after, while expanding %[sTF] */
  538.     for (dp = after, sp = before; (*dp = *sp); dp++, sp++) {
  539. if (sp[0] != '%') continue;
  540. /* need to expand? BTW, no here overflow, because in
  541. ** the worst case (end of string) sp[1] == '' */
  542. if (sp[1] == 's' || sp[1] == 'T') {
  543.     strcpy(dp, names);
  544.     dp += nameslen;
  545.     sp++; /* position sp over [sT] */
  546.     dp--; /* adjust dp */
  547. } else if (sp[1] == 'F') {
  548.     strcpy(dp, from);
  549.     dp += fromlen;
  550.     sp++; /* position sp over F */
  551.     dp--; /* adjust dp */
  552. }
  553.     }
  554.     if (names) {
  555. free(names);
  556. names = NULL;
  557.     }
  558.     if (from) {
  559. free(from);
  560. from = NULL;
  561.     }
  562.     free(before);
  563.     before = after;
  564. }
  565. if (outlevel >= O_DEBUG)
  566.     report(stdout, _("about to deliver with: %sn"), before);
  567. #ifdef HAVE_SETEUID
  568. /*
  569.  * Arrange to run with user's permissions if we're root.
  570.  * This will initialize the ownership of any files the
  571.  * MDA creates properly.  (The seteuid call is available
  572.  * under all BSDs and Linux)
  573.  */
  574. seteuid(ctl->uid);
  575. #endif /* HAVE_SETEUID */
  576. sinkfp = popen(before, "w");
  577. free(before);
  578. before = NULL;
  579. #ifdef HAVE_SETEUID
  580. /* this will fail quietly if we didn't start as root */
  581. seteuid(0);
  582. #endif /* HAVE_SETEUID */
  583. if (!sinkfp)
  584. {
  585.     report(stderr, _("MDA open failedn"));
  586.     return(PS_IOERR);
  587. }
  588. sigchld = signal(SIGCHLD, SIG_DFL);
  589.     }
  590.     else /* forward to an SMTP or LMTP listener */
  591.     {
  592. const char *ap;
  593. char options[MSGBUFSIZE]; 
  594. char addr[HOSTLEN+USERNAMELEN+1];
  595. char **from_responses;
  596. int total_addresses;
  597. /* build a connection to the SMTP listener */
  598. if ((smtp_open(ctl) == -1))
  599. {
  600.     report(stderr, _("%cMTP connect to %s failedn"),
  601.   ctl->listener,
  602.   ctl->smtphost ? ctl->smtphost : "localhost");
  603.     return(PS_SMTP);
  604. }
  605. /*
  606.  * Compute ESMTP options.
  607.  */
  608. options[0] = '';
  609. if (ctl->server.esmtp_options & ESMTP_8BITMIME) {
  610.              if (ctl->pass8bits || (ctl->mimemsg & MSG_IS_8BIT))
  611. strcpy(options, " BODY=8BITMIME");
  612.              else if (ctl->mimemsg & MSG_IS_7BIT)
  613. strcpy(options, " BODY=7BIT");
  614.         }
  615. if ((ctl->server.esmtp_options & ESMTP_SIZE) && msg->reallen > 0)
  616.     sprintf(options + strlen(options), " SIZE=%d", msg->reallen);
  617. /*
  618.  * Try to get the SMTP listener to take the Return-Path
  619.  * address as MAIL FROM .  If it won't, fall back on the
  620.  * calling-user ID.  This won't affect replies, which use the
  621.  * header From address anyway.
  622.  *
  623.  * RFC 1123 requires that the domain name part of the
  624.  * MAIL FROM address be "canonicalized", that is a
  625.  * FQDN or MX but not a CNAME.  We'll assume the From
  626.  * header is already in this form here (it certainly
  627.  * is if rewrite is on).  RFC 1123 is silent on whether
  628.  * a nonexistent hostname part is considered canonical.
  629.  *
  630.  * This is a potential problem if the MTAs further upstream
  631.  * didn't pass canonicalized From/Return-Path lines, *and* the
  632.  * local SMTP listener insists on them.
  633.  */
  634. ap = (msg->return_path[0]) ? msg->return_path : user;
  635. if (SMTP_from(ctl->smtp_socket, ap, options) != SM_OK)
  636.     return(handle_smtp_report(ctl, msg));
  637. /*
  638.  * Now list the recipient addressees
  639.  */
  640. total_addresses = 0;
  641. for (idp = msg->recipients; idp; idp = idp->next)
  642.     total_addresses++;
  643. xalloca(from_responses, char **, sizeof(char *) * total_addresses);
  644. for (idp = msg->recipients; idp; idp = idp->next)
  645.     if (idp->val.status.mark == XMIT_ACCEPT)
  646.     {
  647. if (strchr(idp->id, '@'))
  648.     strcpy(addr, idp->id);
  649. else
  650. #ifdef HAVE_SNPRINTF
  651.     snprintf(addr, sizeof(addr)-1, "%s@%s", idp->id, ctl->destaddr);
  652. #else
  653.     sprintf(addr, "%s@%s", idp->id, ctl->destaddr);
  654. #endif /* HAVE_SNPRINTF */
  655. if (SMTP_rcpt(ctl->smtp_socket, addr) == SM_OK)
  656.     (*good_addresses)++;
  657. else
  658. {
  659.     char errbuf[POPBUFSIZE];
  660.     strcpy(errbuf, idp->id);
  661.     strcat(errbuf, ": ");
  662.     strcat(errbuf, smtp_response);
  663.     xalloca(from_responses[*bad_addresses], 
  664.     char *, 
  665.     strlen(errbuf)+1);
  666.     strcpy(from_responses[*bad_addresses], errbuf);
  667.     (*bad_addresses)++;
  668.     idp->val.status.mark = XMIT_RCPTBAD;
  669.     if (outlevel >= O_VERBOSE)
  670. report(stderr, 
  671.       _("%cMTP listener doesn't like recipient address `%s'n"),
  672.       ctl->listener, addr);
  673. }
  674.     }
  675. if (*bad_addresses)
  676.     send_bouncemail(ctl, msg, XMIT_RCPTBAD,
  677.                             "Some addresses were rejected by the MDA fetchmail forwards to.rn",
  678.                             *bad_addresses, from_responses);
  679. /*
  680.  * It's tempting to do local notification only if bouncemail was
  681.  * insufficient -- that is, to add && total_addresses > *bad_addresses
  682.  * to the test here.  The problem with this theory is that it would
  683.  * make initial diagnosis of a broken multidrop configuration very
  684.  * hard -- most single-recipient messages would just invisibly bounce.
  685.  */
  686. if (!(*good_addresses)) 
  687. {
  688.     if (strchr(run.postmaster, '@'))
  689. strcpy(addr, run.postmaster);
  690.     else
  691.     {
  692. #ifdef HAVE_SNPRINTF
  693. snprintf(addr, sizeof(addr)-1, "%s@%s", run.postmaster, ctl->destaddr);
  694. #else
  695. sprintf(addr, "%s@%s", run.postmaster, ctl->destaddr);
  696. #endif /* HAVE_SNPRINTF */
  697.     }
  698.     if (SMTP_rcpt(ctl->smtp_socket, addr) != SM_OK)
  699.     {
  700. report(stderr, _("can't even send to %s!n"), run.postmaster);
  701. SMTP_rset(ctl->smtp_socket); /* required by RFC1870 */
  702. return(PS_SMTP);
  703.     }
  704.     if (outlevel >= O_VERBOSE)
  705. report(stderr, _("no address matches; forwarding to %s.n"), run.postmaster);
  706. }
  707. /* 
  708.  * Tell the listener we're ready to send data.
  709.  * Some listeners (like zmailer) may return antispam errors here.
  710.  */
  711. if (SMTP_data(ctl->smtp_socket) != SM_OK)
  712.     return(handle_smtp_report(ctl, msg));
  713.     }
  714.     /*
  715.      * We need to stash this away in order to know how many
  716.      * response lines to expect after the LMTP end-of-message.
  717.      */
  718.     lmtp_responses = *good_addresses;
  719.     return(PS_SUCCESS);
  720. }
  721. void release_sink(struct query *ctl)
  722. /* release the per-message output sink, whether it's a pipe or SMTP socket */
  723. {
  724.     if (ctl->bsmtp)
  725. fclose(sinkfp);
  726.     else if (ctl->mda)
  727.     {
  728. if (sinkfp)
  729. {
  730.     pclose(sinkfp);
  731.     sinkfp = (FILE *)NULL;
  732. }
  733. signal(SIGCHLD, sigchld);
  734.     }
  735. }
  736. int close_sink(struct query *ctl, struct msgblk *msg, flag forward)
  737. /* perform end-of-message actions on the current output sink */
  738. {
  739.     if (ctl->mda)
  740.     {
  741. int rc;
  742. /* close the delivery pipe, we'll reopen before next message */
  743. if (sinkfp)
  744. {
  745.     rc = pclose(sinkfp);
  746.     sinkfp = (FILE *)NULL;
  747. }
  748. else
  749.     rc = 0;
  750. signal(SIGCHLD, sigchld);
  751. if (rc)
  752. {
  753.     report(stderr, 
  754.    _("MDA exited abnormally or returned nonzero statusn"));
  755.     return(FALSE);
  756. }
  757.     }
  758.     else if (ctl->bsmtp)
  759.     {
  760. /* implicit disk-full check here... */
  761. fputs(".rn", sinkfp);
  762. if (strcmp(ctl->bsmtp, "-"))
  763.     fclose(sinkfp);
  764. if (ferror(sinkfp))
  765. {
  766.     report(stderr, 
  767.    _("Message termination or close of BSMTP file failedn"));
  768.     return(FALSE);
  769. }
  770.     }
  771.     else if (forward)
  772.     {
  773. /* write message terminator */
  774. if (SMTP_eom(ctl->smtp_socket) != SM_OK)
  775. {
  776.     if (handle_smtp_report(ctl, msg) != PS_REFUSED)
  777. return(FALSE);
  778.     else
  779.     {
  780. report(stderr, _("SMTP listener refused deliveryn"));
  781. return(TRUE);
  782.     }
  783. }
  784. /*
  785.  * If this is an SMTP connection, SMTP_eom() ate the response.
  786.  * But could be this is an LMTP connection, in which case we have to
  787.  * interpret either (a) a single 503 response meaning there
  788.  * were no successful RCPT TOs, or (b) a variable number of
  789.  * responses, one for each successful RCPT TO.  We need to send
  790.  * bouncemail on each failed response and then return TRUE anyway,
  791.  * otherwise the message will get left in the queue and resent
  792.  * to people who got it the first time.
  793.  */
  794. if (ctl->listener == LMTP_MODE)
  795. {
  796.     if (lmtp_responses == 0)
  797.     {
  798. SMTP_ok(ctl->smtp_socket); 
  799. /*
  800.  * According to RFC2033, 503 is the only legal response
  801.  * if no RCPT TO commands succeeded.  No error recovery
  802.  * is really possible here, as we have no idea what
  803.  * insane thing the listener might be doing if it doesn't
  804.  * comply.
  805.  */
  806. if (atoi(smtp_response) == 503)
  807.     report(stderr, _("LMTP delivery error on EOMn"));
  808. else
  809.     report(stderr,
  810.   _("Unexpected non-503 response to LMTP EOM: %sn"),
  811.   smtp_response);
  812. /*
  813.  * It's not completely clear what to do here.  We choose to
  814.  * interpret delivery failure here as a transient error, 
  815.  * the same way SMTP delivery failure is handled.  If we're
  816.  * wrong, an undead message will get stuck in the queue.
  817.  */
  818. return(FALSE);
  819.     }
  820.     else
  821.     {
  822. int i, errors;
  823. char **responses;
  824. /* eat the RFC2033-required responses, saving errors */ 
  825. xalloca(responses, char **, sizeof(char *) * lmtp_responses);
  826. for (errors = i = 0; i < lmtp_responses; i++)
  827. {
  828.     if (SMTP_ok(ctl->smtp_socket) == SM_OK)
  829. responses[i] = (char *)NULL;
  830.     else
  831.     {
  832. xalloca(responses[errors], 
  833. char *, 
  834. strlen(smtp_response)+1);
  835. strcpy(responses[errors], smtp_response);
  836. errors++;
  837.     }
  838. }
  839. if (errors == 0)
  840.     return(TRUE); /* all deliveries succeeded */
  841. else
  842.     /*
  843.      * One or more deliveries failed.
  844.      * If we can bounce a failures list back to the
  845.      * sender, and the postmaster does not want to
  846.      * deal with the bounces return TRUE, deleting the
  847.      * message from the server so it won't be
  848.      * re-forwarded on subsequent poll cycles.
  849.      */
  850.     return(send_bouncemail(ctl, msg, XMIT_ACCEPT,
  851.  "LSMTP partial delivery failure.rn",
  852.  errors, responses));
  853.     }
  854. }
  855.     }
  856.     return(TRUE);
  857. }
  858. int open_warning_by_mail(struct query *ctl, struct msgblk *msg)
  859. /* set up output sink for a mailed warning to calling user */
  860. {
  861.     int good, bad;
  862.     /*
  863.      * Dispatching warning email is a little complicated.  The problem is
  864.      * that we have to deal with three distinct cases:
  865.      *
  866.      * 1. Single-drop running from user account.  Warning mail should
  867.      * go to the local name for which we're collecting (coincides
  868.      * with calling user).
  869.      *
  870.      * 2. Single-drop running from root or other privileged ID, with rc
  871.      * file generated on the fly (Ken Estes's weird setup...)  Mail
  872.      * should go to the local name for which we're collecting (does not 
  873.      * coincide with calling user).
  874.      * 
  875.      * 3. Multidrop.  Mail must go to postmaster.  We leave the recipients
  876.      * member null so this message will fall through to run.postmaster.
  877.      *
  878.      * The zero in the reallen element means we won't pass a SIZE
  879.      * option to ESMTP; the message length would be more trouble than
  880.      * it's worth to compute.
  881.      */
  882.     struct msgblk reply = {NULL, NULL, "FETCHMAIL-DAEMON@", 0};
  883.     strcat(reply.return_path, fetchmailhost);
  884.     if (!MULTIDROP(ctl)) /* send to calling user */
  885.     {
  886. int status;
  887. save_str(&reply.recipients, ctl->localnames->id, XMIT_ACCEPT);
  888. status = open_sink(ctl, &reply, &good, &bad);
  889. free_str_list(&reply.recipients);
  890. return(status);
  891.     }
  892.     else /* send to postmaster  */
  893. return(open_sink(ctl, &reply, &good, &bad));
  894. }
  895. #if defined(HAVE_STDARG_H)
  896. void stuff_warning(struct query *ctl, const char *fmt, ... )
  897. #else
  898. void stuff_warning(struct query *ctl, fmt, va_alist)
  899. struct query *ctl;
  900. const char *fmt; /* printf-style format */
  901. va_dcl
  902. #endif
  903. /* format and ship a warning message line by mail */
  904. {
  905.     char buf[POPBUFSIZE];
  906.     va_list ap;
  907.     /*
  908.      * stuffline() requires its input to be writeable (for CR stripping),
  909.      * so we needed to copy the message to a writeable buffer anyway in
  910.      * case it was a string constant.  We make a virtue of that necessity
  911.      * here by supporting stdargs/varargs.
  912.      */
  913. #if defined(HAVE_STDARG_H)
  914.     va_start(ap, fmt) ;
  915. #else
  916.     va_start(ap);
  917. #endif
  918. #ifdef HAVE_VSNPRINTF
  919.     vsnprintf(buf, sizeof(buf), fmt, ap);
  920. #else
  921.     vsprintf(buf, fmt, ap);
  922. #endif
  923.     va_end(ap);
  924.     strcat(buf, "rn");
  925.     stuffline(ctl, buf);
  926. }
  927. void close_warning_by_mail(struct query *ctl, struct msgblk *msg)
  928. /* sign and send mailed warnings */
  929. {
  930.     stuff_warning(ctl, "--rnttttThe Fetchmail Daemonrn");
  931.     close_sink(ctl, msg, TRUE);
  932. }
  933. /* sink.c ends here */