-void smtp_try(const char *key, const char *addr, int *status,
- char *dsn, size_t n, long msgnum, char *envelope_from)
-{
- int sock = (-1);
- char mxhosts[1024];
- int num_mxhosts;
- int mx;
- int i;
- char user[1024], node[1024], name[1024];
- char buf[1024];
- char mailfrom[1024];
- char mx_user[256];
- char mx_pass[256];
- char mx_host[256];
- char mx_port[256];
- int lp, rp;
- char *msgtext;
- const char *ptr;
- size_t msg_size;
- int scan_done;
- CitContext *CCC=CC;
-
-
- /* Parse out the host portion of the recipient address */
- process_rfc822_addr(addr, user, node, name);
-
- syslog(LOG_DEBUG, "SMTP client: Attempting delivery to <%s> @ <%s> (%s)\n",
- user, node, name);
-
- /* Load the message out of the database */
- CCC->redirect_buffer = NewStrBufPlain(NULL, SIZ);
- CtdlOutputMsg(msgnum, MT_RFC822, HEADERS_ALL, 0, 1, NULL, (ESC_DOT|SUPPRESS_ENV_TO) );
- msg_size = StrLength(CC->redirect_buffer);
- msgtext = SmashStrBuf(&CC->redirect_buffer);
-
- /* If no envelope_from is supplied, extract one from the message */
- if ( (envelope_from == NULL) || (IsEmptyStr(envelope_from)) ) {
- strcpy(mailfrom, "");
- scan_done = 0;
- ptr = msgtext;
- do {
- if (ptr = cmemreadline(ptr, buf, sizeof buf), *ptr == 0) {
- scan_done = 1;
- }
- if (!strncasecmp(buf, "From:", 5)) {
- safestrncpy(mailfrom, &buf[5], sizeof mailfrom);
- striplt(mailfrom);
- for (i=0; mailfrom[i]; ++i) {
- if (!isprint(mailfrom[i])) {
- strcpy(&mailfrom[i], &mailfrom[i+1]);
- i=0;
- }
- }
-
- /* Strip out parenthesized names */
- lp = (-1);
- rp = (-1);
- for (i=0; mailfrom[i]; ++i) {
- if (mailfrom[i] == '(') lp = i;
- if (mailfrom[i] == ')') rp = i;
- }
- if ((lp>0)&&(rp>lp)) {
- strcpy(&mailfrom[lp-1], &mailfrom[rp+1]);
- }
-
- /* Prefer brokketized names */
- lp = (-1);
- rp = (-1);
- for (i=0; mailfrom[i]; ++i) {
- if (mailfrom[i] == '<') lp = i;
- if (mailfrom[i] == '>') rp = i;
- }
- if ( (lp>=0) && (rp>lp) ) {
- mailfrom[rp] = 0;
- strcpy(mailfrom, &mailfrom[lp + 1]);
- }
-
- scan_done = 1;
- }
- } while (scan_done == 0);
- if (IsEmptyStr(mailfrom)) {
- char badmail_filename[128];
- snprintf(badmail_filename, sizeof badmail_filename, "/tmp/badmail.%d.%ld",
- getpid, time(NULL)
- );
- FILE *badmail_fp = fopen(badmail_filename, "w");
- fwrite(msgtext, msg_size, 1, badmail_fp);
- fclose(badmail_fp);
- }
- stripallbut(mailfrom, '<', '>');
- envelope_from = mailfrom;
- }
-
- /* Figure out what mail exchanger host we have to connect to */
- num_mxhosts = getmx(mxhosts, node);
- syslog(LOG_DEBUG, "Number of MX hosts for <%s> is %d [%s]\n", node, num_mxhosts, mxhosts);
- if (num_mxhosts < 1) {
- *status = 5;
- snprintf(dsn, SIZ, "No MX hosts found for <%s>", node);
- return;
- }