2 * driver.c -- generic driver for mail fetch method protocols
4 * Copyright 1997 by Eric S. Raymond
5 * For license terms, see the file COPYING in this directory.
16 #endif /* HAVE_MEMORY_H */
17 #if defined(STDC_HEADERS)
20 #if defined(HAVE_UNISTD_H)
23 #if defined(HAVE_STDARG_H)
28 #if defined(HAVE_SYS_ITIMER_H)
29 #include <sys/itimer.h>
34 #ifdef HAVE_NET_SOCKET_H
35 #include <net/socket.h>
38 #ifdef HAVE_RES_SEARCH
41 #endif /* HAVE_RES_SEARCH */
45 #include <netinet/in.h>
47 #endif /* KERBEROS_V4 */
52 #include "fetchmail.h"
55 /* throw types for runtime errors */
56 #define THROW_TIMEOUT 1 /* server timed out */
57 #define THROW_SIGPIPE 2 /* SIGPIPE on stream socket */
59 #ifndef strstr /* glibc-2.1 declares this as a macro */
60 extern char *strstr(); /* needed on sysV68 R3V7.1. */
63 int batchcount; /* count of messages sent in current batch */
64 flag peek_capable; /* can we peek for better error recovery? */
65 int pass; /* how many times have we re-polled? */
66 int stage; /* where are we? */
67 int phase; /* where are we, for error-logging purposes? */
68 int mytimeout; /* value of nonreponse timeout */
69 int suppress_tags; /* emit tags? */
70 char shroud[PASSWORDLEN]; /* string to shroud in debug output */
72 static const struct method *protocol;
73 static jmp_buf restart;
77 #define GENSYM (sprintf(tag, "A%04d", ++tagnum % TAGMOD), tag)
79 static int timeoutcount; /* count consecutive timeouts */
80 static int msglen; /* actual message length */
82 void set_timeout(int timeleft)
83 /* reset the nonresponse-timeout */
85 #if !defined(__EMX__) && !defined(__BEOS__)
86 struct itimerval ntimeout;
91 ntimeout.it_interval.tv_sec = ntimeout.it_interval.tv_usec = 0;
92 ntimeout.it_value.tv_sec = timeleft;
93 ntimeout.it_value.tv_usec = 0;
94 setitimer(ITIMER_REAL, &ntimeout, (struct itimerval *)NULL);
98 static void timeout_handler (int signal)
99 /* handle SIGALRM signal indicating a server timeout */
102 longjmp(restart, THROW_TIMEOUT);
105 static void sigpipe_handler (int signal)
106 /* handle SIGPIPE signal indicating a broken stream socket */
108 longjmp(restart, THROW_SIGPIPE);
111 static int accept_count, reject_count;
113 static void map_name(const char *name, struct query *ctl, struct idlist **xmit_names)
114 /* add given name to xmit_names if it matches declared localnames */
115 /* name: name to map */
116 /* ctl: list of permissible aliases */
117 /* xmit_names: list of recipient names parsed out */
122 lname = idpair_find(&ctl->localnames, name+off);
123 if (!lname && ctl->wildcard)
126 if (lname != (char *)NULL)
128 if (outlevel >= O_DEBUG)
129 report(stdout, _("mapped %s to local %s\n"), name, lname);
130 save_str(xmit_names, lname, XMIT_ACCEPT);
135 static void find_server_names(const char *hdr,
137 struct idlist **xmit_names)
138 /* parse names out of a RFC822 header into an ID list */
139 /* hdr: RFC822 header in question */
140 /* ctl: list of permissible aliases */
141 /* xmit_names: list of recipient names parsed out */
143 if (hdr == (char *)NULL)
149 for (cp = nxtaddr(hdr);
156 * If the name of the user begins with a qmail virtual
157 * domain prefix, ignore the prefix. Doing this here
158 * means qvirtual will work either with ordinary name
159 * mapping or with a localdomains option.
161 if (ctl->server.qvirtual)
163 int sl = strlen(ctl->server.qvirtual);
165 if (!strncasecmp(cp, ctl->server.qvirtual, sl))
169 if ((atsign = strchr(cp, '@'))) {
173 * Does a trailing segment of the hostname match something
174 * on the localdomains list? If so, save the whole name
177 for (idp = ctl->server.localdomains; idp; idp = idp->next) {
180 rhs = atsign + (strlen(atsign) - strlen(idp->id));
182 (rhs[-1] == '.' || rhs[-1] == '@') &&
183 strcasecmp(rhs, idp->id) == 0)
185 if (outlevel >= O_DEBUG)
186 report(stdout, _("passed through %s matching %s\n"),
188 save_str(xmit_names, cp, XMIT_ACCEPT);
194 /* if we matched a local domain, idp != NULL */
198 * Check to see if the right-hand part is an alias
199 * or MX equivalent of the mailserver. If it's
200 * not, skip this name. If it is, we'll keep
201 * going and try to find a mapping to a client name.
203 if (!is_host_alias(atsign+1, ctl))
205 save_str(xmit_names, cp, XMIT_REJECT);
211 map_name(cp, ctl, xmit_names);
219 * Return zero on a syntactically invalid address, nz on a valid one.
221 * This used to be strchr(a, '.'), but it turns out that lines like this
223 * Received: from punt-1.mail.demon.net by mailstore for markb@ordern.com
224 * id 938765929:10:27223:2; Fri, 01 Oct 99 08:18:49 GMT
226 * are not uncommon. So now we just check that the following token is
227 * not itself an email address.
229 #define VALID_ADDRESS(a) !strchr(a, '@')
231 static char *parse_received(struct query *ctl, char *bufp)
232 /* try to extract real address from the Received line */
233 /* If a valid Received: line is found, we return the full address in
234 * a buffer which can be parsed from nxtaddr(). This is to ansure that
235 * the local domain part of the address can be passed along in
236 * find_server_names() if it contains one.
237 * Note: We should return a dummy header containing the address
238 * which makes nxtaddr() behave correctly.
241 char *base, *ok = (char *)NULL;
242 static char rbuf[HOSTLEN + USERNAMELEN + 4];
245 * Try to extract the real envelope addressee. We look here
246 * specifically for the mailserver's Received line.
247 * Note: this will only work for sendmail, or an MTA that
248 * shares sendmail's convention for embedding the envelope
249 * address in the Received line. Sendmail itself only
250 * does this when the mail has a single recipient.
252 if (outlevel >= O_DEBUG)
253 report(stdout, _("analyzing Received line:\n%s"), bufp);
255 /* search for whitepace-surrounded "by" followed by valid address */
256 for (base = bufp; ; base = ok + 2)
258 if (!(ok = strstr(base, "by")))
260 else if (!isspace(ok[-1]) || !isspace(ok[2]))
266 /* extract space-delimited token after "by" */
267 for (sp = ok + 2; isspace(*sp); sp++)
270 for (; !isspace(*sp); sp++)
274 /* look for valid address */
275 if (VALID_ADDRESS(rbuf))
278 ok = sp - 1; /* arrange to skip this token */
284 * If it's a DNS name of the mail server, look for the
285 * recipient name after a following "for". Otherwise
288 if (is_host_alias(rbuf, ctl))
290 if (outlevel >= O_DEBUG)
292 _("line accepted, %s is an alias of the mailserver\n"), rbuf);
296 if (outlevel >= O_DEBUG)
298 _("line rejected, %s is not an alias of the mailserver\n"),
303 /* search for whitepace-surrounded "for" followed by xxxx@yyyy */
304 for (base = ok + 4 + strlen(rbuf); ; base = ok + 2)
306 if (!(ok = strstr(base, "for")))
308 else if (!isspace(ok[-1]) || !isspace(ok[3]))
314 /* extract space-delimited token after "for" */
315 for (sp = ok + 3; isspace(*sp); sp++)
318 for (; !isspace(*sp); sp++)
322 if (strchr(rbuf, '@'))
325 ok = sp - 1; /* arrange to skip this token */
330 flag want_gt = FALSE;
333 /* char after "for" could be space or a continuation newline */
334 for (sp = ok + 4; isspace(*sp); sp++)
337 *tp++ = ':'; /* Here is the hack. This is to be friends */
338 *tp++ = ' '; /* with nxtaddr()... */
344 while (*sp == '@') /* skip routes */
345 while (*sp && *sp++ != ':')
348 && (want_gt ? (*sp != '>') : !isspace(*sp))
354 /* uh oh -- whitespace here can't be right! */
360 if (strlen(rbuf) <= 3) /* apparently nothing has been found */
368 if (outlevel >= O_DEBUG)
369 report(stdout, _("no Received address found\n"));
374 if (outlevel >= O_DEBUG) {
375 char *lf = rbuf + strlen(rbuf)-1;
377 if (outlevel >= O_DEBUG)
378 report(stdout, _("found Received address `%s'\n"), rbuf+2);
385 /* shared by readheaders and readbody */
386 static int sizeticker;
387 static struct msgblk msgblk;
389 #define EMPTYLINE(s) ((s)[0] == '\r' && (s)[1] == '\n' && (s)[2] == '\0')
391 static int readheaders(int sock,
396 /* read message headers and ship to SMTP or MDA */
397 /* sock: to which the server is connected */
398 /* fetchlen: length of message according to fetch response */
399 /* reallen: length of message according to getsizes */
400 /* ctl: query control record */
401 /* num: index of message */
406 struct addrblk *next;
408 struct addrblk *to_addrchain = NULL;
409 struct addrblk **to_chainptr = &to_addrchain;
410 struct addrblk *resent_to_addrchain = NULL;
411 struct addrblk **resent_to_chainptr = &resent_to_addrchain;
413 char buf[MSGBUFSIZE+1];
414 int from_offs, reply_to_offs, resent_from_offs;
415 int app_from_offs, sender_offs, resent_sender_offs;
417 char *received_for, *rcv, *cp, *delivered_to;
418 int n, linelen, oldlen, ch, remaining, skipcount;
420 flag no_local_matches = FALSE;
421 flag headers_ok, has_nuls;
422 int olderrs, good_addresses, bad_addresses;
425 has_nuls = headers_ok = FALSE;
426 msgblk.return_path[0] = '\0';
427 olderrs = ctl->errcount;
429 /* read message headers */
430 msgblk.reallen = reallen;
433 * We used to free the header block unconditionally at the end of
434 * readheaders, but it turns out that if close_sink() hits an error
435 * condition the code for sending bouncemail will actually look
436 * at the freed storage and coredump...
439 free(msgblk.headers);
441 msgblk.headers = received_for = delivered_to = NULL;
442 from_offs = reply_to_offs = resent_from_offs = app_from_offs =
443 sender_offs = resent_sender_offs = env_offs = -1;
449 for (remaining = fetchlen; remaining > 0 || protocol->delimited; remaining -= linelen)
453 line = xmalloc(sizeof(buf));
457 set_timeout(mytimeout);
458 if ((n = SockRead(sock, buf, sizeof(buf)-1)) == -1) {
461 free(msgblk.headers);
462 msgblk.headers = NULL;
469 /* lines may not be properly CRLF terminated; fix this for qmail */
472 cp = buf + strlen(buf) - 1;
473 if (*cp == '\n' && (cp == buf || cp[-1] != '\r'))
482 * Decode MIME encoded headers. We MUST do this before
483 * looking at the Content-Type / Content-Transfer-Encoding
484 * headers (RFC 2046).
489 line = (char *) realloc(line, strlen(line) + strlen(buf) +1);
493 /* check for end of headers */
497 has_nuls = (linelen != strlen(line));
499 goto process_headers;
503 * Check for end of message immediately. If one of your folders
504 * has been mangled, the delimiter may occur directly after the
507 if (protocol->delimited && line[0] == '.' && EMPTYLINE(line+1))
510 has_nuls = (linelen != strlen(line));
511 goto process_headers;
515 * At least one brain-dead website (netmind.com) is known to
516 * send out robotmail that's missing the RFC822 delimiter blank
517 * line before the body! Without this check fetchmail segfaults.
518 * With it, we treat such messages as though they had the missing
521 if (!isspace(line[0]) && !strchr(line, ':'))
525 has_nuls = (linelen != strlen(line));
526 goto process_headers;
529 /* check for RFC822 continuations */
530 set_timeout(mytimeout);
534 (ch == ' ' || ch == '\t'); /* continuation to next line? */
536 /* write the message size dots */
537 if ((outlevel > O_SILENT && outlevel < O_VERBOSE) && linelen > 0)
539 sizeticker += linelen;
540 while (sizeticker >= SIZETICKER)
542 if ((!run.use_syslog && !isafile(1)) || run.showdots)
547 sizeticker -= SIZETICKER;
551 /* we see an ordinary (non-header, non-message-delimiter line */
552 has_nuls = (linelen != strlen(line));
555 * When mail delivered to a multidrop mailbox on the server is
556 * addressed to multiple people on the client machine, there
557 * will be one copy left in the box for each recipient. Thus,
558 * if the mail is addressed to N people, each recipient will
559 * get N copies. This is bad when N > 1.
561 * Foil this by suppressing all but one copy of a message with
562 * a given Message-ID. The accept_count test ensures that
563 * multiple pieces of email with the same Message-ID, each
564 * with a *single* addressee (the N == 1 case), won't be
567 * Note: This implementation only catches runs of successive
568 * messages with the same ID, but that should be good
569 * enough. A more general implementation would have to store
570 * ever-growing lists of seen message-IDs; in a long-running
571 * daemon this would turn into a memory leak even if the
572 * implementation were perfect.
574 * Don't mess with this code casually. It would be way too easy
575 * to break it in a way that blackholed mail. Better to pass
576 * the occasional duplicate than to do that...
578 if (MULTIDROP(ctl) && !strncasecmp(line, "Message-ID:", 11))
580 if (ctl->lastid && !strcasecmp(ctl->lastid, line))
582 if (accept_count > 1)
589 ctl->lastid = strdup(line);
594 * The University of Washington IMAP server (the reference
595 * implementation of IMAP4 written by Mark Crispin) relies
596 * on being able to keep base-UID information in a special
597 * message at the head of the mailbox. This message should
598 * neither be deleted nor forwarded.
602 * We disable this check under POP2 because there's no way to
603 * prevent deletion of the message. So at least we ought to
604 * forward it to the user so he or she will have some clue
605 * that things have gone awry.
608 if (strncmp(protocol->service, "pop2", 4))
609 #else /* INET6_ENABLE */
610 if (protocol->port != 109)
611 #endif /* INET6_ENABLE */
612 #endif /* POP2_ENABLE */
613 if (num == 1 && !strncasecmp(line, "X-IMAP:", 7)) {
615 free(msgblk.headers);
616 msgblk.headers = NULL;
621 * This code prevents fetchmail from becoming an accessory after
622 * the fact to upstream sendmails with the `E' option on. It also
623 * copes with certain brain-dead POP servers (like NT's) that pass
624 * through Unix from_ lines.
626 * Either of these bugs can result in a non-RFC822 line at the
627 * beginning of the headers. If fetchmail just passes it
628 * through, the client listener may think the message has *no*
629 * headers (since the first) line it sees doesn't look
630 * RFC822-conformant) and fake up a set.
632 * What the user would see in this case is bogus (synthesized)
633 * headers, followed by a blank line, followed by the >From,
634 * followed by the real headers, followed by a blank line,
637 * We forestall this lossage by tossing anything that looks
638 * like an escaped or passed-through From_ line in headers.
639 * These aren't RFC822 so our conscience is clear...
641 if (!strncasecmp(line, ">From ", 6) || !strncasecmp(line, "From ", 5))
648 * We remove all Delivered-To: headers.
650 * This is to avoid false mail loops messages when delivering
651 * local messages to and from a Postfix/qmail mailserver.
653 if (ctl->dropdelivered && !strncasecmp(line, "Delivered-To:", 13))
663 * If we see a Status line, it may have been inserted by an MUA
664 * on the mail host, or it may have been inserted by the server
665 * program after the headers in the transaction stream. This
666 * can actually hose some new-mail notifiers such as xbuffy,
667 * which assumes any Status line came from a *local* MDA and
668 * therefore indicates that the message has been seen.
670 * Some buggy POP servers (including at least the 3.3(20)
671 * version of the one distributed with IMAP) insert empty
672 * Status lines in the transaction stream; we'll chuck those
673 * unconditionally. Nonempty ones get chucked if the user
674 * turns on the dropstatus flag.
679 if (!strncasecmp(line, "Status:", 7))
681 else if (!strncasecmp(line, "X-Mozilla-Status:", 17))
686 while (*cp && isspace(*cp)) cp++;
687 if (!*cp || ctl->dropstatus)
696 line = reply_hack(line, ctl->server.truename);
699 * OK, this is messy. If we're forwarding by SMTP, it's the
700 * SMTP-receiver's job (according to RFC821, page 22, section
701 * 4.1.1) to generate a Return-Path line on final delivery.
702 * The trouble is, we've already got one because the
703 * mailserver's SMTP thought *it* was responsible for final
706 * Stash away the contents of Return-Path (as modified by reply_hack)
707 * for use in generating MAIL FROM later on, then prevent the header
708 * from being saved with the others. In effect, we strip it off here.
710 * If the SMTP server conforms to the standards, and fetchmail gets the
711 * envelope sender from the Return-Path, the new Return-Path should be
712 * exactly the same as the original one.
714 * We do *not* want to ignore empty Return-Path headers. These should
715 * be passed through as a way of indicating that a message should
716 * not trigger bounces if delivery fails. What we *do* need to do is
717 * make sure we never try to rewrite such a blank Return-Path. We
718 * handle this with a check for <> in the rewrite logic above.
720 if (!strncasecmp("Return-Path:", line, 12) && (cp = nxtaddr(line)))
722 strcpy(msgblk.return_path, cp);
731 oldlen = strlen(line);
732 msgblk.headers = xmalloc(oldlen + 1);
733 (void) strcpy(msgblk.headers, line);
735 line = msgblk.headers;
742 newlen = oldlen + strlen(line);
743 newhdrs = (char *) realloc(msgblk.headers, newlen + 1);
744 if (newhdrs == NULL) {
748 msgblk.headers = newhdrs;
749 strcpy(msgblk.headers + oldlen, line);
751 line = msgblk.headers + oldlen;
755 if (!strncasecmp("From:", line, 5))
756 from_offs = (line - msgblk.headers);
757 else if (!strncasecmp("Reply-To:", line, 9))
758 reply_to_offs = (line - msgblk.headers);
759 else if (!strncasecmp("Resent-From:", line, 12))
760 resent_from_offs = (line - msgblk.headers);
761 else if (!strncasecmp("Apparently-From:", line, 16))
762 app_from_offs = (line - msgblk.headers);
763 else if (!strncasecmp("Sender:", line, 7))
764 sender_offs = (line - msgblk.headers);
765 else if (!strncasecmp("Resent-Sender:", line, 14))
766 resent_sender_offs = (line - msgblk.headers);
769 else if (!strncasecmp("Message-Id:", line, 11))
771 if (ctl->server.uidl)
775 line[IDLEN+12] = 0; /* prevent stack overflow */
776 sscanf(line+12, "%s", id);
777 if (!str_find( &ctl->newsaved, num))
779 struct idlist *new = save_str(&ctl->newsaved,id,UID_SEEN);
780 new->val.status.num = num;
784 #endif /* __UNUSED__ */
786 else if (!MULTIDROP(ctl))
789 else if (!strncasecmp("To:", line, 3)
790 || !strncasecmp("Cc:", line, 3)
791 || !strncasecmp("Bcc:", line, 4)
792 || !strncasecmp("Apparently-To:", line, 14))
794 *to_chainptr = xmalloc(sizeof(struct addrblk));
795 (*to_chainptr)->offset = (line - msgblk.headers);
796 to_chainptr = &(*to_chainptr)->next;
800 else if (!strncasecmp("Resent-To:", line, 10)
801 || !strncasecmp("Resent-Cc:", line, 10)
802 || !strncasecmp("Resent-Bcc:", line, 11))
804 *resent_to_chainptr = xmalloc(sizeof(struct addrblk));
805 (*resent_to_chainptr)->offset = (line - msgblk.headers);
806 resent_to_chainptr = &(*resent_to_chainptr)->next;
807 *resent_to_chainptr = NULL;
810 else if (ctl->server.envelope != STRING_DISABLED)
812 if (ctl->server.envelope
813 && strcasecmp(ctl->server.envelope, "Received"))
815 if (env_offs == -1 && !strncasecmp(ctl->server.envelope,
817 strlen(ctl->server.envelope)))
819 if (skipcount++ != ctl->server.envskip)
821 env_offs = (line - msgblk.headers);
824 else if (!received_for && !strncasecmp("Received:", line, 9))
826 if (skipcount++ != ctl->server.envskip)
828 received_for = parse_received(ctl, line);
835 * We want to detect this early in case there are so few headers that the
836 * dispatch logic barfs.
840 if (outlevel > O_SILENT)
842 _("message delimiter found while scanning headers\n"));
846 * Hack time. If the first line of the message was blank, with no headers
847 * (this happens occasionally due to bad gatewaying software) cons up
848 * a set of fake headers.
850 * If you modify the fake header template below, be sure you don't
851 * make either From or To address @-less, otherwise the reply_hack
852 * logic will do bad things.
854 if (msgblk.headers == (char *)NULL)
857 snprintf(buf, sizeof(buf),
860 #endif /* HAVE_SNPRINTF */
861 "From: FETCHMAIL-DAEMON\r\nTo: %s@%s\r\nSubject: Headerless mail from %s's mailbox on %s\r\n",
862 user, fetchmailhost, ctl->remotename, ctl->server.truename);
863 msgblk.headers = xstrdup(buf);
867 * We can now process message headers before reading the text.
868 * In fact we have to, as this will tell us where to forward to.
871 /* Check for MIME headers indicating possible 8-bit data */
872 ctl->mimemsg = MimeBodyType(msgblk.headers, ctl->mimedecode);
875 if (ctl->server.sdps && sdps_envfrom)
877 /* We have the real envelope return-path, stored out of band by
878 * SDPS - that's more accurate than any header is going to be.
880 strcpy(msgblk.return_path, sdps_envfrom);
883 #endif /* SDPS_ENABLE */
885 * If there is a Return-Path address on the message, this was
886 * almost certainly the MAIL FROM address given the originating
887 * sendmail. This is the best thing to use for logging the
888 * message origin (it sets up the right behavior for bounces and
889 * mailing lists). Otherwise, fall down to the next available
890 * envelope address (which is the most probable real sender).
891 * *** The order is important! ***
892 * This is especially useful when receiving mailing list
893 * messages in multidrop mode. if a local address doesn't
894 * exist, the bounce message won't be returned blindly to the
895 * author or to the list itself but rather to the list manager
896 * (ex: specified by "Sender:") which is much less annoying. This
897 * is true for most mailing list packages.
899 if( !msgblk.return_path[0] ){
901 if (resent_sender_offs >= 0 && (ap = nxtaddr(msgblk.headers + resent_sender_offs)));
902 else if (sender_offs >= 0 && (ap = nxtaddr(msgblk.headers + sender_offs)));
903 else if (resent_from_offs >= 0 && (ap = nxtaddr(msgblk.headers + resent_from_offs)));
904 else if (from_offs >= 0 && (ap = nxtaddr(msgblk.headers + from_offs)));
905 else if (reply_to_offs >= 0 && (ap = nxtaddr(msgblk.headers + reply_to_offs)));
906 else if (app_from_offs >= 0 && (ap = nxtaddr(msgblk.headers + app_from_offs)));
907 if (ap) strcpy( msgblk.return_path, ap );
910 /* cons up a list of local recipients */
911 msgblk.recipients = (struct idlist *)NULL;
912 accept_count = reject_count = 0;
913 /* is this a multidrop box? */
917 if (ctl->server.sdps && sdps_envto)
919 /* We have the real envelope recipient, stored out of band by
920 * SDPS - that's more accurate than any header is going to be.
922 find_server_names(sdps_envto, ctl, &msgblk.recipients);
925 #endif /* SDPS_ENABLE */
926 if (env_offs > -1) /* We have the actual envelope addressee */
927 find_server_names(msgblk.headers + env_offs, ctl, &msgblk.recipients);
928 else if (delivered_to && ctl->server.envelope != STRING_DISABLED &&
929 ctl->server.envelope && !strcasecmp(ctl->server.envelope, "Delivered-To"))
931 find_server_names(delivered_to, ctl, &msgblk.recipients);
934 else if (received_for)
936 * We have the Received for addressee.
937 * It has to be a mailserver address, or we
938 * wouldn't have got here.
939 * We use find_server_names() to let local
940 * hostnames go through.
942 find_server_names(received_for, ctl, &msgblk.recipients);
946 * We haven't extracted the envelope address.
947 * So check all the "Resent-To" header addresses if
948 * they exist. If and only if they don't, consider
949 * the "To" addresses.
951 register struct addrblk *nextptr;
952 if (resent_to_addrchain) {
953 /* delete the "To" chain and substitute it
954 * with the "Resent-To" list
956 while (to_addrchain) {
957 nextptr = to_addrchain->next;
959 to_addrchain = nextptr;
961 to_addrchain = resent_to_addrchain;
962 resent_to_addrchain = NULL;
964 /* now look for remaining adresses */
965 while (to_addrchain) {
966 find_server_names(msgblk.headers+to_addrchain->offset, ctl, &msgblk.recipients);
967 nextptr = to_addrchain->next;
969 to_addrchain = nextptr;
974 no_local_matches = TRUE;
975 save_str(&msgblk.recipients, run.postmaster, XMIT_ACCEPT);
976 if (outlevel >= O_DEBUG)
978 _("no local matches, forwarding to %s\n"),
982 else /* it's a single-drop box, use first localname */
983 save_str(&msgblk.recipients, ctl->localnames->id, XMIT_ACCEPT);
987 * Time to either address the message or decide we can't deliver it yet.
989 if (ctl->errcount > olderrs) /* there were DNS errors above */
991 if (outlevel >= O_DEBUG)
993 _("forwarding and deletion suppressed due to DNS errors\n"));
994 free(msgblk.headers);
995 msgblk.headers = NULL;
996 free_str_list(&msgblk.recipients);
997 return(PS_TRANSIENT);
1001 /* set up stuffline() so we can deliver the message body through it */
1002 if ((n = open_sink(ctl, &msgblk,
1003 &good_addresses, &bad_addresses)) != PS_SUCCESS)
1005 free(msgblk.headers);
1006 msgblk.headers = NULL;
1007 free_str_list(&msgblk.recipients);
1014 * Some server/sendmail combinations cause problems when our
1015 * synthetic Received line is before the From header. Cope
1018 if ((rcv = strstr(msgblk.headers, "Received:")) == (char *)NULL)
1019 rcv = msgblk.headers;
1020 /* handle ">Received:" lines too */
1021 while (rcv > msgblk.headers && rcv[-1] != '\n')
1023 if (rcv > msgblk.headers)
1028 n = stuffline(ctl, msgblk.headers);
1031 if (!run.invisible && n != -1)
1033 /* utter any per-message Received information we need here */
1034 if (ctl->server.trueaddr) {
1035 sprintf(buf, "Received: from %s [%u.%u.%u.%u]\r\n",
1036 ctl->server.truename,
1037 (unsigned char)ctl->server.trueaddr[0],
1038 (unsigned char)ctl->server.trueaddr[1],
1039 (unsigned char)ctl->server.trueaddr[2],
1040 (unsigned char)ctl->server.trueaddr[3]);
1042 sprintf(buf, "Received: from %s\r\n", ctl->server.truename);
1044 n = stuffline(ctl, buf);
1048 * This header is technically invalid under RFC822.
1049 * POP3, IMAP, etc. are not legal mail-parameter values.
1051 * We used to include ctl->remotename in this log line,
1052 * but this can be secure information that would be bad
1055 sprintf(buf, "\tby %s with %s (fetchmail-%s)\r\n",
1059 n = stuffline(ctl, buf);
1063 if (good_addresses == 0)
1066 "for %s@%s (by default); ",
1067 user, ctl->destaddr);
1069 else if (good_addresses == 1)
1071 for (idp = msgblk.recipients; idp; idp = idp->next)
1072 if (idp->val.status.mark == XMIT_ACCEPT)
1073 break; /* only report first address */
1074 if (strchr(idp->id, '@'))
1075 sprintf(buf+1, "for %s", idp->id);
1078 * This could be a bit misleading, as destaddr is
1079 * the forwarding host rather than the actual
1080 * destination. Most of the time they coincide.
1082 sprintf(buf+1, "for %s@%s", idp->id, ctl->destaddr);
1083 sprintf(buf+strlen(buf), " (%s); ",
1084 MULTIDROP(ctl) ? "multi-drop" : "single-drop");
1089 strcat(buf, rfc822timestamp());
1090 strcat(buf, "\r\n");
1091 n = stuffline(ctl, buf);
1097 n = stuffline(ctl, rcv); /* ship out rest of msgblk.headers */
1101 report(stdout, _("writing RFC822 msgblk.headers\n"));
1103 free(msgblk.headers);
1104 msgblk.headers = NULL;
1105 free_str_list(&msgblk.recipients);
1108 else if ((run.poll_interval == 0 || nodetach) && outlevel >= O_VERBOSE && !isafile(2))
1111 /* write error notifications */
1112 if (no_local_matches || has_nuls || bad_addresses)
1115 char errhd[USERNAMELEN + POPBUFSIZE], *errmsg;
1118 (void) strcpy(errhd, "X-Fetchmail-Warning: ");
1119 if (no_local_matches)
1121 if (reject_count != 1)
1122 strcat(errhd, _("no recipient addresses matched declared local names"));
1125 for (idp = msgblk.recipients; idp; idp = idp->next)
1126 if (idp->val.status.mark == XMIT_REJECT)
1128 sprintf(errhd+strlen(errhd), _("recipient address %s didn't match any local name"), idp->id);
1134 if (errhd[sizeof("X-Fetchmail-Warning: ")])
1135 strcat(errhd, "; ");
1136 strcat(errhd, _("message has embedded NULs"));
1141 if (errhd[sizeof("X-Fetchmail-Warning: ")])
1142 strcat(errhd, "; ");
1143 strcat(errhd, _("SMTP listener rejected local recipient addresses: "));
1144 errlen = strlen(errhd);
1145 for (idp = msgblk.recipients; idp; idp = idp->next)
1146 if (idp->val.status.mark == XMIT_RCPTBAD)
1147 errlen += strlen(idp->id) + 2;
1149 xalloca(errmsg, char *, errlen+3);
1150 (void) strcpy(errmsg, errhd);
1151 for (idp = msgblk.recipients; idp; idp = idp->next)
1152 if (idp->val.status.mark == XMIT_RCPTBAD)
1154 strcat(errmsg, idp->id);
1156 strcat(errmsg, ", ");
1161 strcat(errmsg, "\r\n");
1163 /* ship out the error line */
1164 stuffline(ctl, errmsg);
1167 /* issue the delimiter line */
1172 stuffline(ctl, buf);
1174 /* free(msgblk.headers); */
1175 free_str_list(&msgblk.recipients);
1176 return(headers_ok ? PS_SUCCESS : PS_TRUNCATED);
1179 static int readbody(int sock, struct query *ctl, flag forward, int len)
1180 /* read and dispose of a message body presented on sock */
1181 /* ctl: query control record */
1182 /* sock: to which the server is connected */
1183 /* len: length of message */
1184 /* forward: TRUE to forward */
1187 unsigned char buf[MSGBUFSIZE+4];
1188 unsigned char *inbufp = buf;
1189 flag issoftline = FALSE;
1192 * Pass through the text lines in the body.
1194 * Yes, this wants to be ||, not &&. The problem is that in the most
1195 * important delimited protocol, POP3, the length is not reliable.
1196 * As usual, the problem is Microsoft brain damage; see FAQ item S2.
1197 * So, for delimited protocols we need to ignore the length here and
1198 * instead drop out of the loop with a break statement when we see
1199 * the message delimiter.
1201 while (protocol->delimited || len > 0)
1203 set_timeout(mytimeout);
1204 if ((linelen = SockRead(sock, inbufp, sizeof(buf)-4-(inbufp-buf)))==-1)
1212 /* write the message size dots */
1215 sizeticker += linelen;
1216 while (sizeticker >= SIZETICKER)
1218 if (outlevel > O_SILENT && (((run.poll_interval == 0 || nodetach) && !isafile(1)) || run.showdots))
1223 sizeticker -= SIZETICKER;
1228 /* check for end of message */
1229 if (protocol->delimited && *inbufp == '.')
1231 if (inbufp[1] == '\r' && inbufp[2] == '\n' && inbufp[3] == '\0')
1233 else if (inbufp[1] == '\n' && inbufp[2] == '\0')
1236 msglen--; /* subtract the size of the dot escape */
1241 if (ctl->mimedecode && (ctl->mimemsg & MSG_NEEDS_DECODE)) {
1242 issoftline = UnMimeBodyline(&inbufp, protocol->delimited, issoftline);
1243 if (issoftline && (sizeof(buf)-1-(inbufp-buf) < 200))
1246 * Soft linebreak, but less than 200 bytes left in
1247 * input buffer. Rather than doing a buffer overrun,
1248 * ignore the soft linebreak, NL-terminate data and
1249 * deliver what we have now.
1250 * (Who writes lines longer than 2K anyway?)
1252 *inbufp = '\n'; *(inbufp+1) = '\0';
1257 /* ship out the text line */
1258 if (forward && (!issoftline))
1263 /* guard against very long lines */
1264 buf[MSGBUFSIZE+1] = '\r';
1265 buf[MSGBUFSIZE+2] = '\n';
1266 buf[MSGBUFSIZE+3] = '\0';
1268 n = stuffline(ctl, buf);
1272 report(stdout, _("writing message text\n"));
1276 else if (outlevel >= O_VERBOSE && !isafile(1))
1289 kerberos_auth (socket, canonical, principal)
1290 /* authenticate to the server host using Kerberos V4 */
1291 int socket; /* socket to server host */
1292 char *canonical; /* server name */
1295 char * host_primary;
1299 Key_schedule schedule;
1301 char * prin_copy = (char *) NULL;
1302 char * prin = (char *) NULL;
1303 char * inst = (char *) NULL;
1304 char * realm = (char *) NULL;
1306 if (principal != (char *)NULL && *principal)
1309 prin = prin_copy = xstrdup(principal);
1310 for (cp = prin_copy; *cp && *cp != '.'; ++cp)
1316 while (*cp && *cp != '@')
1326 xalloca(ticket, KTEXT, sizeof (KTEXT_ST));
1327 rem = (krb_sendauth (0L, socket, ticket,
1328 prin ? prin : "pop",
1329 inst ? inst : canonical,
1330 realm ? realm : ((char *) (krb_realmofhost (canonical))),
1331 ((unsigned long) 0),
1335 ((struct sockaddr_in *) 0),
1336 ((struct sockaddr_in *) 0),
1342 if (rem != KSUCCESS)
1344 report(stderr, _("kerberos error %s\n"), (krb_get_err_text (rem)));
1345 return (PS_AUTHFAIL);
1349 #endif /* KERBEROS_V4 */
1352 static int kerberos5_auth(socket, canonical)
1353 /* authenticate to the server host using Kerberos V5 */
1354 int socket; /* socket to server host */
1355 const char *canonical; /* server name */
1357 krb5_error_code retval;
1358 krb5_context context;
1360 krb5_principal client = NULL, server = NULL;
1361 krb5_error *err_ret = NULL;
1363 krb5_auth_context auth_context = NULL;
1365 krb5_init_context(&context);
1366 krb5_init_ets(context);
1367 krb5_auth_con_init(context, &auth_context);
1369 if (retval = krb5_cc_default(context, &ccdef)) {
1370 report(stderr, "krb5_cc_default: %s\n", error_message(retval));
1374 if (retval = krb5_cc_get_principal(context, ccdef, &client)) {
1375 report(stderr, "krb5_cc_get_principal: %s\n", error_message(retval));
1379 if (retval = krb5_sname_to_principal(context, canonical, "pop",
1382 report(stderr, "krb5_sname_to_principal: %s\n", error_message(retval));
1386 retval = krb5_sendauth(context, &auth_context, (krb5_pointer) &socket,
1387 "KPOPV1.0", client, server,
1388 AP_OPTS_MUTUAL_REQUIRED,
1389 NULL, /* no data to checksum */
1390 0, /* no creds, use ccache instead */
1394 NULL); /* don't need reply */
1396 krb5_free_principal(context, server);
1397 krb5_free_principal(context, client);
1398 krb5_auth_con_free(context, auth_context);
1402 if (err_ret && err_ret->e_text) {
1403 report(stderr, _("krb5_sendauth: %s [server says '%*s'] \n"),
1404 error_message(retval),
1407 if (err_ret && err_ret->text.length) {
1408 report(stderr, _("krb5_sendauth: %s [server says '%*s'] \n"),
1409 error_message(retval),
1410 err_ret->text.length,
1411 err_ret->text.data);
1413 krb5_free_error(context, err_ret);
1415 report(stderr, "krb5_sendauth: %s\n", error_message(retval));
1421 #endif /* KERBEROS_V5 */
1423 static void clean_skipped_list(struct idlist **skipped_list)
1424 /* struct "idlist" contains no "prev" ptr; we must remove unused items first */
1426 struct idlist *current=NULL, *prev=NULL, *tmp=NULL, *head=NULL;
1427 prev = current = head = *skipped_list;
1433 /* if item has no reference, remove it */
1434 if (current && current->val.status.mark == 0)
1436 if (current == head) /* remove first item (head) */
1438 head = current->next;
1439 if (current->id) free(current->id);
1441 prev = current = head;
1443 else /* remove middle/last item */
1445 tmp = current->next;
1447 if (current->id) free(current->id);
1452 else /* skip this item */
1455 current = current->next;
1459 *skipped_list = head;
1462 static void send_size_warnings(struct query *ctl)
1463 /* send warning mail with skipped msg; reset msg count when user notified */
1466 int msg_to_send = FALSE;
1467 struct idlist *head=NULL, *current=NULL;
1468 int max_warning_poll_count;
1470 head = ctl->skipped;
1474 /* don't start a notification message unless we need to */
1475 for (current = head; current; current = current->next)
1476 if (current->val.status.num == 0 && current->val.status.mark)
1482 * There's no good way to recover if we can't send notification mail,
1483 * but it's not a disaster, either, since the skipped mail will not
1486 if (open_warning_by_mail(ctl, (struct msgblk *)NULL))
1489 _("Subject: Fetchmail oversized-messages warning.\r\n"
1491 "The following oversized messages remain on the mail server %s:"),
1492 ctl->server.pollname);
1494 if (run.poll_interval == 0)
1495 max_warning_poll_count = 0;
1497 max_warning_poll_count = ctl->warnings/run.poll_interval;
1499 /* parse list of skipped msg, adding items to the mail */
1500 for (current = head; current; current = current->next)
1502 if (current->val.status.num == 0 && current->val.status.mark)
1504 nbr = current->val.status.mark;
1505 size = atoi(current->id);
1507 _("\t%d msg %d octets long skipped by fetchmail.\r\n"),
1510 current->val.status.num++;
1511 current->val.status.mark = 0;
1513 if (current->val.status.num >= max_warning_poll_count)
1514 current->val.status.num = 0;
1517 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1520 static int do_session(ctl, proto, maxfetch)
1521 /* retrieve messages from server using given protocol method table */
1522 struct query *ctl; /* parsed options with merged-in defaults */
1523 const struct method *proto; /* protocol method table */
1524 const int maxfetch; /* maximum number of messages to fetch */
1527 #ifdef HAVE_VOLATILE
1528 volatile int ok, mailserver_socket = -1; /* pacifies -Wall */
1530 int ok, mailserver_socket = -1;
1531 #endif /* HAVE_VOLATILE */
1533 void (*pipesave)(int);
1534 void (*alrmsave)(int);
1535 struct idlist *current=NULL, *tmp=NULL;
1538 ctl->server.base_protocol = protocol;
1542 tag[0] = '\0'; /* nuke any tag hanging out from previous query */
1545 /* set up the server-nonresponse timeout */
1546 alrmsave = signal(SIGALRM, timeout_handler);
1547 mytimeout = ctl->server.timeout;
1549 /* set up the broken-pipe timeout */
1550 pipesave = signal(SIGPIPE, sigpipe_handler);
1552 if ((js = setjmp(restart)))
1554 #ifdef HAVE_SIGPROCMASK
1556 * Don't rely on setjmp() to restore the blocked-signal mask.
1557 * It does this under BSD but is required not to under POSIX.
1559 * If your Unix doesn't have sigprocmask, better hope it has
1560 * BSD-like behavior. Otherwise you may see fetchmail get
1561 * permanently wedged after a second timeout on a bad read,
1562 * because alarm signals were blocked after the first.
1566 sigfillset(&allsigs);
1567 sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
1568 #endif /* HAVE_SIGPROCMASK */
1570 if (js == THROW_SIGPIPE)
1572 signal(SIGPIPE, SIG_IGN);
1574 _("SIGPIPE thrown from an MDA or a stream socket error\n"));
1578 else if (js == THROW_TIMEOUT)
1580 if (phase == OPEN_WAIT)
1582 _("timeout after %d seconds waiting to connect to server %s.\n"),
1583 ctl->server.timeout, ctl->server.pollname);
1584 else if (phase == SERVER_WAIT)
1586 _("timeout after %d seconds waiting for server %s.\n"),
1587 ctl->server.timeout, ctl->server.pollname);
1588 else if (phase == FORWARDING_WAIT)
1590 _("timeout after %d seconds waiting for %s.\n"),
1591 ctl->server.timeout,
1592 ctl->mda ? "MDA" : "SMTP");
1593 else if (phase == LISTENER_WAIT)
1595 _("timeout after %d seconds waiting for listener to respond.\n"), ctl->server.timeout);
1598 _("timeout after %d seconds.\n"), ctl->server.timeout);
1601 * If we've exceeded our threshold for consecutive timeouts,
1602 * try to notify the user, then mark the connection wedged.
1603 * Don't do this if the connection can idle, though; idle
1604 * timeouts just mean the frequency of mail is low.
1606 if (timeoutcount > MAX_TIMEOUTS
1607 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
1610 _("Subject: fetchmail sees repeated timeouts\r\n"));
1612 _("Fetchmail saw more than %d timeouts while attempting to get mail from %s@%s.\r\n"),
1615 ctl->server.truename);
1617 _("This could mean that your mailserver is stuck, or that your SMTP\r\n" \
1618 "server is wedged, or that your mailbox file on the server has been\r\n" \
1619 "corrupted by a server error. You can run `fetchmail -v -v' to\r\n" \
1620 "diagnose the problem.\r\n\r\n" \
1621 "Fetchmail won't poll this mailbox again until you restart it.\r\n"));
1622 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1629 /* try to clean up all streams */
1631 if (ctl->smtp_socket != -1)
1632 SockClose(ctl->smtp_socket);
1633 if (mailserver_socket != -1)
1634 SockClose(mailserver_socket);
1638 char buf[MSGBUFSIZE+1], *realhost;
1639 int len, num, count, new, bytes, deletions = 0, *msgsizes = NULL;
1641 int fetches, dispatches, oldphase;
1642 #else /* INET6_ENABLE */
1643 int port, fetches, dispatches, oldphase;
1644 #endif /* INET6_ENABLE */
1647 /* execute pre-initialization command, if any */
1648 if (ctl->preconnect && (ok = system(ctl->preconnect)))
1651 _("pre-connection command failed with status %d\n"), ok);
1656 /* open a socket to the mail server */
1659 set_timeout(mytimeout);
1662 port = ctl->server.port ? ctl->server.port : ( ctl->use_ssl ? protocol->sslport : protocol->port );
1664 port = ctl->server.port ? ctl->server.port : protocol->port;
1666 #endif /* !INET6_ENABLE */
1667 realhost = ctl->server.via ? ctl->server.via : ctl->server.pollname;
1669 /* allow time for the port to be set up if we have a plugin */
1670 if (ctl->server.plugin)
1673 if ((mailserver_socket = SockOpen(realhost,
1674 ctl->server.service ? ctl->server.service : ( ctl->use_ssl ? protocol->sslservice : protocol->service ),
1675 ctl->server.netsec, ctl->server.plugin)) == -1)
1676 #else /* INET6_ENABLE */
1677 if ((mailserver_socket = SockOpen(realhost, port, NULL, ctl->server.plugin)) == -1)
1678 #endif /* INET6_ENABLE */
1680 char errbuf[BUFSIZ];
1683 #ifdef HAVE_RES_SEARCH
1684 if (err_no != 0 && h_errno != 0)
1685 report(stderr, _("internal inconsistency\n"));
1688 * Avoid generating a bogus error every poll cycle when we're
1689 * in daemon mode but the connection to the outside world
1692 if (!((err_no == EHOSTUNREACH || err_no == ENETUNREACH)
1693 && run.poll_interval))
1695 report_build(stderr, _("%s connection to %s failed"),
1696 protocol->name, ctl->server.pollname);
1697 #ifdef HAVE_RES_SEARCH
1700 if (h_errno == HOST_NOT_FOUND)
1701 strcpy(errbuf, _("host is unknown."));
1703 else if (h_errno == NO_ADDRESS)
1704 strcpy(errbuf, _("name is valid but has no IP address."));
1706 else if (h_errno == NO_RECOVERY)
1707 strcpy(errbuf, _("unrecoverable name server error."));
1708 else if (h_errno == TRY_AGAIN)
1709 strcpy(errbuf, _("temporary name server error."));
1711 sprintf(errbuf, _("unknown DNS error %d."), h_errno);
1714 #endif /* HAVE_RES_SEARCH */
1715 strcpy(errbuf, strerror(err_no));
1716 report_complete(stderr, ": %s\n", errbuf);
1720 * Don't use this. It was an attempt to address Debian bug
1721 * #47143 (Notify user by mail when pop server nonexistent).
1722 * Trouble is, that doesn't work; you trip over the case
1723 * where your SLIP or PPP link is down...
1725 /* warn the system administrator */
1726 if (open_warning_by_mail(ctl, (struct msgblk *)NULL) == 0)
1729 _("Subject: Fetchmail unreachable-server warning.\r\n"
1731 "Fetchmail could not reach the mail server %s:")
1732 ctl->server.pollname);
1733 stuff_warning(ctl, errbuf, ctl->server.pollname);
1734 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1738 #endif /* INET6_ENABLE */
1748 /* perform initial SSL handshake on open connection */
1749 /* Note: We pass the realhost name over for certificate
1750 verification. We may want to make this configurable */
1751 if (ctl->use_ssl && SSLOpen(mailserver_socket,ctl->sslkey,ctl->sslcert,ctl->sslproto,realhost) == -1)
1753 report(stderr, _("SSL connection failed.\n"));
1759 if (ctl->server.authenticate == A_KERBEROS_V4)
1761 set_timeout(mytimeout);
1762 ok = kerberos_auth(mailserver_socket, ctl->server.truename,
1763 ctl->server.principal);
1768 #endif /* KERBEROS_V4 */
1771 if (ctl->server.authenticate == A_KERBEROS_V5)
1773 set_timeout(mytimeout);
1774 ok = kerberos5_auth(mailserver_socket, ctl->server.truename);
1779 #endif /* KERBEROS_V5 */
1781 /* accept greeting message from mail server */
1782 ok = (protocol->parse_response)(mailserver_socket, buf);
1786 /* try to get authorized to fetch mail */
1787 stage = STAGE_GETAUTH;
1788 if (protocol->getauth)
1790 ok = (protocol->getauth)(mailserver_socket, ctl, buf);
1794 if (ok == PS_LOCKBUSY)
1795 report(stderr, _("Lock-busy error on %s@%s\n"),
1797 ctl->server.truename);
1798 else if (ok == PS_SERVBUSY)
1799 report(stderr, _("Server busy error on %s@%s\n"),
1801 ctl->server.truename);
1802 else if (ok == PS_AUTHFAIL)
1804 report(stderr, _("Authorization failure on %s@%s%s\n"),
1806 ctl->server.truename,
1807 (ctl->wehaveauthed ? " (previously authorized)" : " ")
1811 * If we're running in background, try to mail the
1812 * calling user a heads-up about the authentication
1813 * failure once it looks like this isn't a fluke
1814 * due to the server being temporarily inaccessible.
1815 * When we get third succesive failure, we notify the user
1816 * but only if we haven't already managed to get
1817 * authorization. After that, once we get authorization
1818 * we let the user know service is restored.
1820 if (run.poll_interval
1821 && ctl->wehavesentauthnote
1822 && ((ctl->wehaveauthed && ++ctl->authfailcount == 10)
1823 || ++ctl->authfailcount == 3)
1824 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
1826 ctl->wehavesentauthnote = 1;
1828 _("Subject: fetchmail authentication failed on %s@%s\r\n"),
1829 ctl->remotename, ctl->server.truename);
1831 _("Fetchmail could not get mail from %s@%s.\r\n"),
1833 ctl->server.truename);
1834 if (ctl->wehaveauthed)
1835 stuff_warning(ctl, _("\
1836 The attempt to get authorization failed.\r\n\
1837 Since we have already succeeded in getting authorization for this\r\n\
1838 connection, this is probably another failure mode (such as busy server)\r\n\
1839 that fetchmail cannot distinguish because the server didn't send a useful\r\n\
1842 However, if you HAVE changed you account details since starting the\r\n\
1843 fetchmail daemon, you need to stop the daemon, change your configuration\r\n\
1844 of fetchmail, and then restart the daemon.\r\n\
1846 The fetchmail daemon will continue running and attempt to connect\r\n\
1847 at each cycle. No future notifications will be sent until service\r\n\
1850 stuff_warning(ctl, _("\
1851 The attempt to get authorization failed.\r\n\
1852 This probably means your password is invalid, but some servers have\r\n\
1853 other failure modes that fetchmail cannot distinguish from this\r\n\
1854 because they don't send useful error messages on login failure.\r\n\
1856 The fetchmail daemon will continue running and attempt to connect\r\n\
1857 at each cycle. No future notifications will be sent until service\r\n\
1859 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1863 report(stderr, _("Unknown login or authentication error on %s@%s\n"),
1865 ctl->server.truename);
1872 * This connection has given us authorization at least once.
1874 * There are dodgy server (clubinternet.fr for example) that
1875 * give spurious authorization failures on patently good
1876 * account/password details, then 5 minutes later let you in!
1878 * This is meant to build in some tolerance of such nasty bits
1881 ctl->wehaveauthed = 1;
1882 /*if (ctl->authfailcount >= 3)*/
1883 if (ctl->wehavesentauthnote)
1885 ctl->wehavesentauthnote = 0;
1887 _("Authorization OK on %s@%s\n"),
1889 ctl->server.truename);
1890 if (!open_warning_by_mail(ctl, (struct msgblk *)NULL))
1893 _("Subject: fetchmail authentication OK on %s@%s\r\n"),
1894 ctl->remotename, ctl->server.truename);
1896 _("Fetchmail was able to log into %s@%s.\r\n"),
1898 ctl->server.truename);
1900 _("Service has been restored.\r\n"));
1901 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1906 * Reporting only after the first three
1907 * consecutive failures, or ten consecutive
1908 * failures after we have managed to get
1911 ctl->authfailcount = 0;
1915 ctl->errcount = fetches = 0;
1917 /* now iterate over each folder selected */
1918 for (idp = ctl->mailboxes; idp; idp = idp->next)
1925 /* reset timeout, in case we did an IDLE */
1926 mytimeout = ctl->server.timeout;
1928 if (outlevel >= O_DEBUG)
1931 report(stdout, _("selecting or re-polling folder %s\n"), idp->id);
1933 report(stdout, _("selecting or re-polling default folder\n"));
1936 /* compute # of messages and number of new messages waiting */
1937 stage = STAGE_GETRANGE;
1938 ok = (protocol->getrange)(mailserver_socket, ctl, idp->id, &count, &new, &bytes);
1942 /* show user how many messages we downloaded */
1944 (void) sprintf(buf, _("%s at %s (folder %s)"),
1945 ctl->remotename, ctl->server.truename, idp->id);
1947 (void) sprintf(buf, _("%s at %s"),
1948 ctl->remotename, ctl->server.truename);
1949 if (outlevel > O_SILENT)
1951 if (count == -1) /* only used for ETRN */
1952 report(stdout, _("Polling %s\n"), ctl->server.truename);
1953 else if (count != 0)
1955 if (new != -1 && (count - new) > 0)
1956 report_build(stdout, _("%d %s (%d seen) for %s"),
1957 count, count > 1 ? _("messages") :
1961 report_build(stdout, _("%d %s for %s"),
1962 count, count > 1 ? _("messages") :
1965 report_complete(stdout, ".\n");
1967 report_complete(stdout, _(" (%d octets).\n"), bytes);
1971 /* these are pointless in normal daemon mode */
1972 if (pass == 1 && (run.poll_interval == 0 || outlevel >= O_VERBOSE))
1973 report(stdout, _("No mail for %s\n"), buf);
1977 /* very important, this is where we leave the do loop */
1983 if (new == -1 || ctl->fetchall)
1985 fetches = new; /* set error status ccorrectly */
1987 * There used to be a `got noerror' here, but this
1988 * prevneted checking of multiple folders. This
1989 * comment is a reminder in case I introduced some
1990 * subtle bug by removing it...
1995 flag force_retrieval;
1998 * What forces this code is that in POP2 and
1999 * IMAP2bis you can't fetch a message without
2000 * having it marked `seen'. In POP3 and IMAP4, on the
2001 * other hand, you can (peek_capable is set by
2002 * each driver module to convey this; it's not a
2003 * method constant because of the difference between
2004 * IMAP2bis and IMAP4, and because POP3 doesn't peek
2005 * if fetchall is on).
2007 * The result of being unable to peek is that if there's
2008 * any kind of transient error (DNS lookup failure, or
2009 * sendmail refusing delivery due to process-table limits)
2010 * the message will be marked "seen" on the server without
2011 * having been delivered. This is not a big problem if
2012 * fetchmail is running in foreground, because the user
2013 * will see a "skipped" message when it next runs and get
2016 * But in daemon mode this leads to the message
2017 * being silently ignored forever. This is not
2020 * We compensate for this by checking the error
2021 * count from the previous pass and forcing all
2022 * messages to be considered new if it's nonzero.
2024 force_retrieval = !peek_capable && (ctl->errcount > 0);
2027 * We need the size of each message before it's
2028 * loaded in order to pass it to the ESMTP SIZE
2029 * option. If the protocol has a getsizes method,
2030 * we presume this means it doesn't get reliable
2031 * sizes from message fetch responses.
2033 if (proto->getsizes)
2037 xalloca(msgsizes, int *, sizeof(int) * count);
2038 for (i = 0; i < count; i++)
2041 stage = STAGE_GETSIZES;
2042 ok = (proto->getsizes)(mailserver_socket, count, msgsizes);
2049 for (i = 0; i < count; i++)
2050 bytes += msgsizes[i];
2054 /* read, forward, and delete messages */
2055 stage = STAGE_FETCH;
2056 for (num = 1; num <= count; num++)
2058 flag toolarge = NUM_NONZERO(ctl->limit)
2059 && msgsizes && (msgsizes[num-1] > ctl->limit);
2060 flag oldmsg = (!new) || (protocol->is_old && (protocol->is_old)(mailserver_socket,ctl,num));
2061 flag fetch_it = !toolarge
2062 && (ctl->fetchall || force_retrieval || !oldmsg);
2063 flag suppress_delete = FALSE;
2064 flag suppress_forward = FALSE;
2065 flag suppress_readbody = FALSE;
2066 flag retained = FALSE;
2069 * This check copes with Post Office/NT's
2070 * annoying habit of randomly prepending bogus
2071 * LIST items of length -1. Patrick Audley
2072 * <paudley@pobox.com> tells us: LIST shows a
2073 * size of -1, RETR and TOP return "-ERR
2074 * System error - couldn't open message", and
2075 * DELE succeeds but doesn't actually delete
2078 if (msgsizes && msgsizes[num-1] == -1)
2080 if (outlevel >= O_VERBOSE)
2082 _("Skipping message %d, length -1\n"),
2088 * We may want to reject this message if it's old
2089 * or oversized, and we're not forcing retrieval.
2093 if (outlevel > O_SILENT)
2095 report_build(stdout,
2096 _("skipping message %d (%d octets)"),
2097 num, msgsizes[num-1]);
2098 if (toolarge && !check_only)
2103 /* convert sz to string */
2104 sprintf(size, "%d", msgsizes[num-1]);
2106 /* build a list of skipped messages
2107 * val.id = size of msg (string cnvt)
2108 * val.status.num = warning_poll_count
2109 * val.status.mask = nbr of msg this size
2112 current = ctl->skipped;
2114 /* initialise warning_poll_count to the
2115 * current value so that all new msg will
2116 * be included in the next mail
2118 cnt = current? current->val.status.num : 0;
2120 /* if entry exists, increment the count */
2122 str_in_list(¤t, size, FALSE))
2125 current = current->next)
2127 if (strcmp(current->id, size) == 0)
2129 current->val.status.mark++;
2134 /* otherwise, create a new entry */
2135 /* initialise with current poll count */
2138 tmp = save_str(&ctl->skipped, size, 1);
2139 tmp->val.status.num = cnt;
2142 report_build(stdout, _(" (oversized, %d octets)"),
2149 flag wholesize = !protocol->fetch_body;
2151 /* request a message */
2152 ok = (protocol->fetch_headers)(mailserver_socket,ctl,num, &len);
2156 /* -1 means we didn't see a size in the response */
2157 if (len == -1 && msgsizes)
2159 len = msgsizes[num - 1];
2163 if (outlevel > O_SILENT)
2165 report_build(stdout, _("reading message %d of %d"),
2169 report_build(stdout, _(" (%d %soctets)"),
2170 len, wholesize ? "" : _("header "));
2171 if (outlevel >= O_VERBOSE)
2172 report_complete(stdout, "\n");
2174 report_complete(stdout, " ");
2178 * Read the message headers and ship them to the
2181 ok = readheaders(mailserver_socket, len, msgsizes[num-1],
2183 if (ok == PS_RETAINED)
2184 suppress_forward = retained = TRUE;
2185 else if (ok == PS_TRANSIENT)
2186 suppress_delete = suppress_forward = TRUE;
2187 else if (ok == PS_REFUSED)
2188 suppress_forward = TRUE;
2189 else if (ok == PS_TRUNCATED)
2190 suppress_readbody = TRUE;
2195 * If we're using IMAP4 or something else that
2196 * can fetch headers separately from bodies,
2197 * it's time to request the body now. This
2198 * fetch may be skipped if we got an anti-spam
2199 * or other PS_REFUSED error response during
2202 if (protocol->fetch_body && !suppress_readbody)
2204 if (outlevel >= O_VERBOSE && !isafile(1))
2206 fputc('\n', stdout);
2210 if ((ok = (protocol->trail)(mailserver_socket, ctl, num)))
2213 if (!suppress_forward)
2215 if ((ok=(protocol->fetch_body)(mailserver_socket,ctl,num,&len)))
2218 * Work around a bug in Novell's
2219 * broken GroupWise IMAP server;
2220 * its body FETCH response is missing
2221 * the required length for the data
2222 * string. This violates RFC2060.
2225 len = msgsizes[num-1] - msglen;
2226 if (outlevel > O_SILENT && !wholesize)
2227 report_complete(stdout,
2228 _(" (%d body octets) "), len);
2232 /* process the body now */
2235 if (suppress_readbody)
2237 /* When readheaders returns PS_TRUNCATED,
2238 the body (which has no content
2239 has already been read by readheaders,
2240 so we say readbody returned PS_SUCCESS */
2245 ok = readbody(mailserver_socket,
2250 if (ok == PS_TRANSIENT)
2251 suppress_delete = suppress_forward = TRUE;
2255 /* tell server we got it OK and resynchronize */
2256 if (protocol->trail)
2258 if (outlevel >= O_VERBOSE && !isafile(1))
2260 fputc('\n', stdout);
2264 ok = (protocol->trail)(mailserver_socket, ctl, num);
2270 /* count # messages forwarded on this pass */
2271 if (!suppress_forward)
2275 * Check to see if the numbers matched?
2277 * Yes, some servers foo this up horribly.
2278 * All IMAP servers seem to get it right, and
2279 * so does Eudora QPOP at least in 2.xx
2282 * Microsoft Exchange gets it completely
2283 * wrong, reporting compressed rather than
2284 * actual sizes (so the actual length of
2285 * message is longer than the reported size).
2286 * Another fine example of Microsoft brain death!
2288 * Some older POP servers, like the old UCB
2289 * POP server and the pre-QPOP QUALCOMM
2290 * versions, report a longer size in the LIST
2291 * response than actually gets shipped up.
2292 * It's unclear what is going on here, as the
2293 * QUALCOMM server (at least) seems to be
2294 * reporting the on-disk size correctly.
2296 if (msgsizes && msglen != msgsizes[num-1])
2298 if (outlevel >= O_DEBUG)
2300 _("message %d was not the expected length (%d actual != %d expected)\n"),
2301 num, msglen, msgsizes[num-1]);
2304 /* end-of-message processing starts here */
2305 if (!close_sink(ctl, &msgblk, !suppress_forward))
2308 suppress_delete = TRUE;
2314 * At this point in flow of control, either
2315 * we've bombed on a protocol error or had
2316 * delivery refused by the SMTP server
2317 * (unlikely -- I've never seen it) or we've
2318 * seen `accepted for delivery' and the
2319 * message is shipped. It's safe to mark the
2320 * message seen and delete it on the server
2324 /* tell the UID code we've seen this */
2329 for (sdp = ctl->newsaved; sdp; sdp = sdp->next)
2330 if ((sdp->val.status.num == num)
2331 && (!toolarge || oldmsg))
2332 sdp->val.status.mark = UID_SEEN;
2335 /* maybe we delete this message now? */
2338 if (outlevel > O_SILENT)
2339 report(stdout, _(" retained\n"));
2341 else if (protocol->delete
2343 && (fetch_it ? !ctl->keep : ctl->flush))
2346 if (outlevel > O_SILENT)
2347 report_complete(stdout, _(" flushed\n"));
2348 ok = (protocol->delete)(mailserver_socket, ctl, num);
2352 delete_str(&ctl->newsaved, num);
2353 #endif /* POP3_ENABLE */
2355 else if (outlevel > O_SILENT)
2356 report_complete(stdout, _(" not flushed\n"));
2358 /* perhaps this as many as we're ready to handle */
2359 if (maxfetch && maxfetch <= fetches && fetches < count)
2361 report(stdout, _("fetchlimit %d reached; %d messages left on server\n"),
2362 maxfetch, count - fetches);
2368 if (!check_only && ctl->skipped
2369 && run.poll_interval > 0 && !nodetach)
2371 clean_skipped_list(&ctl->skipped);
2372 send_size_warnings(ctl);
2377 * Only re-poll if we either had some actual forwards and
2378 * either allowed deletions and had no errors.
2379 * Otherwise it is far too easy to get into infinite loops.
2381 (dispatches && protocol->retry && !ctl->keep && !ctl->errcount);
2385 /* ordinary termination with no errors -- officially log out */
2386 ok = (protocol->logout_cmd)(mailserver_socket, ctl);
2388 * Hmmmm...arguably this would be incorrect if we had fetches but
2389 * no dispatches (due to oversized messages, etc.)
2392 ok = (fetches > 0) ? PS_SUCCESS : PS_NOMAIL;
2393 SockClose(mailserver_socket);
2397 /* we only get here on error */
2398 if (ok != 0 && ok != PS_SOCKET)
2400 stage = STAGE_LOGOUT;
2401 (protocol->logout_cmd)(mailserver_socket, ctl);
2403 SockClose(mailserver_socket);
2406 msg = (const char *)NULL; /* sacrifice to -Wall */
2413 msg = _("missing or bad RFC822 header");
2419 msg = _("client/server synchronization");
2422 msg = _("client/server protocol");
2425 msg = _("lock busy on server");
2428 msg = _("SMTP transaction");
2431 msg = _("DNS lookup");
2434 report(stderr, _("undefined error\n"));
2437 /* no report on PS_MAXFETCH or PS_UNDEFINED or PS_AUTHFAIL */
2438 if (ok==PS_SOCKET || ok==PS_SYNTAX
2439 || ok==PS_IOERR || ok==PS_ERROR || ok==PS_PROTOCOL
2440 || ok==PS_LOCKBUSY || ok==PS_SMTP || ok==PS_DNS)
2444 if (phase == FORWARDING_WAIT || phase == LISTENER_WAIT)
2445 stem = _("%s error while delivering to SMTP host %s\n");
2447 stem = _("%s error while fetching from %s\n");
2448 report(stderr, stem, msg, ctl->server.pollname);
2452 /* execute wrapup command, if any */
2453 if (ctl->postconnect && (ok = system(ctl->postconnect)))
2455 report(stderr, _("post-connection command failed with status %d\n"), ok);
2456 if (ok == PS_SUCCESS)
2460 signal(SIGALRM, alrmsave);
2461 signal(SIGPIPE, pipesave);
2465 int do_protocol(ctl, proto)
2466 /* retrieve messages from server using given protocol method table */
2467 struct query *ctl; /* parsed options with merged-in defaults */
2468 const struct method *proto; /* protocol method table */
2473 if (ctl->server.authenticate == A_KERBEROS_V4)
2475 report(stderr, _("Kerberos V4 support not linked.\n"));
2478 #endif /* KERBEROS_V4 */
2481 if (ctl->server.authenticate == A_KERBEROS_V5)
2483 report(stderr, _("Kerberos V5 support not linked.\n"));
2486 #endif /* KERBEROS_V5 */
2488 /* lacking methods, there are some options that may fail */
2491 /* check for unsupported options */
2494 _("Option --flush is not supported with %s\n"),
2498 else if (ctl->fetchall) {
2500 _("Option --all is not supported with %s\n"),
2505 if (!proto->getsizes && NUM_SPECIFIED(ctl->limit))
2508 _("Option --limit is not supported with %s\n"),
2514 * If no expunge limit or we do expunges within the driver,
2515 * then just do one session, passing in any fetchlimit.
2517 if (proto->retry || !NUM_SPECIFIED(ctl->expunge))
2518 return(do_session(ctl, proto, NUM_VALUE_OUT(ctl->fetchlimit)));
2520 * There's an expunge limit, and it isn't handled in the driver itself.
2521 * OK; do multiple sessions, each fetching a limited # of messages.
2522 * Stop if the total count of retrieved messages exceeds ctl->fetchlimit
2523 * (if it was nonzero).
2529 int expunge = NUM_VALUE_OUT(ctl->expunge);
2530 int fetchlimit = NUM_VALUE_OUT(ctl->fetchlimit);
2533 ok = do_session(ctl, proto, expunge);
2534 totalcount += expunge;
2535 if (NUM_SPECIFIED(ctl->fetchlimit) && totalcount >= fetchlimit)
2537 if (ok != PS_LOCKBUSY)
2539 else if (lockouts >= MAX_LOCKOUTS)
2541 else /* ok == PS_LOCKBUSY */
2544 * Allow time for the server lock to release. if we
2545 * don't do this, we'll often hit a locked-mailbox
2546 * condition and fail.
2552 (ok == PS_MAXFETCH || ok == PS_LOCKBUSY);
2558 #if defined(HAVE_STDARG_H)
2559 void gen_send(int sock, const char *fmt, ... )
2561 void gen_send(sock, fmt, va_alist)
2562 int sock; /* socket to which server is connected */
2563 const char *fmt; /* printf-style format */
2566 /* assemble command in printf(3) style and send to the server */
2568 char buf [MSGBUFSIZE+1];
2571 if (protocol->tagged && !suppress_tags)
2572 (void) sprintf(buf, "%s ", GENSYM);
2576 #if defined(HAVE_STDARG_H)
2581 #ifdef HAVE_VSNPRINTF
2582 vsnprintf(buf + strlen(buf), sizeof(buf), fmt, ap);
2584 vsprintf(buf + strlen(buf), fmt, ap);
2588 strcat(buf, "\r\n");
2589 SockWrite(sock, buf, strlen(buf));
2591 if (outlevel >= O_MONITOR)
2595 if (shroud[0] && (cp = strstr(buf, shroud)))
2599 sp = cp + strlen(shroud);
2605 buf[strlen(buf)-2] = '\0';
2606 report(stdout, "%s> %s\n", protocol->name, buf);
2610 int gen_recv(sock, buf, size)
2611 /* get one line of input from the server */
2612 int sock; /* socket to which server is connected */
2613 char *buf; /* buffer to receive input */
2614 int size; /* length of buffer */
2616 int oldphase = phase; /* we don't have to be re-entrant */
2618 phase = SERVER_WAIT;
2619 set_timeout(mytimeout);
2620 if (SockRead(sock, buf, size) == -1)
2629 if (buf[strlen(buf)-1] == '\n')
2630 buf[strlen(buf)-1] = '\0';
2631 if (buf[strlen(buf)-1] == '\r')
2632 buf[strlen(buf)-1] = '\0';
2633 if (outlevel >= O_MONITOR)
2634 report(stdout, "%s< %s\n", protocol->name, buf);
2640 #if defined(HAVE_STDARG_H)
2641 int gen_transact(int sock, const char *fmt, ... )
2643 int gen_transact(int sock, fmt, va_alist)
2644 int sock; /* socket to which server is connected */
2645 const char *fmt; /* printf-style format */
2648 /* assemble command in printf(3) style, send to server, accept a response */
2651 char buf [MSGBUFSIZE+1];
2653 int oldphase = phase; /* we don't have to be re-entrant */
2655 phase = SERVER_WAIT;
2657 if (protocol->tagged && !suppress_tags)
2658 (void) sprintf(buf, "%s ", GENSYM);
2662 #if defined(HAVE_STDARG_H)
2667 #ifdef HAVE_VSNPRINTF
2668 vsnprintf(buf + strlen(buf), sizeof(buf), fmt, ap);
2670 vsprintf(buf + strlen(buf), fmt, ap);
2674 strcat(buf, "\r\n");
2675 SockWrite(sock, buf, strlen(buf));
2677 if (outlevel >= O_MONITOR)
2681 if (shroud && shroud[0] && (cp = strstr(buf, shroud)))
2685 sp = cp + strlen(shroud);
2691 buf[strlen(buf)-1] = '\0';
2692 report(stdout, "%s> %s\n", protocol->name, buf);
2695 /* we presume this does its own response echoing */
2696 ok = (protocol->parse_response)(sock, buf);
2702 /* driver.c ends here */