-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);
-
- CtdlLogPrintf(CTDL_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)) strcpy(mailfrom, "someone@somewhere.org");
- stripallbut(mailfrom, '<', '>');
- envelope_from = mailfrom;
- }
-
- /* Figure out what mail exchanger host we have to connect to */
- num_mxhosts = getmx(mxhosts, node);
- CtdlLogPrintf(CTDL_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;
- }
-
- sock = (-1);
- for (mx=0; (mx<num_mxhosts && sock < 0); ++mx) {
- char *endpart;
- extract_token(buf, mxhosts, mx, '|', sizeof buf);
- strcpy(mx_user, "");
- strcpy(mx_pass, "");
- if (num_tokens(buf, '@') > 1) {
- strcpy (mx_user, buf);
- endpart = strrchr(mx_user, '@');
- *endpart = '\0';
- strcpy (mx_host, endpart + 1);
- endpart = strrchr(mx_user, ':');
- if (endpart != NULL) {
- strcpy(mx_pass, endpart+1);
- *endpart = '\0';
- }
- }
- else
- strcpy (mx_host, buf);
- endpart = strrchr(mx_host, ':');
- if (endpart != 0){
- *endpart = '\0';
- strcpy(mx_port, endpart + 1);
- }
- else {
- strcpy(mx_port, "25");
- }
- CtdlLogPrintf(CTDL_DEBUG, "SMTP client: connecting to %s : %s ...\n", mx_host, mx_port);
- sock = sock_connect(mx_host, mx_port);
- snprintf(dsn, SIZ, "Could not connect: %s", strerror(errno));
- if (sock >= 0)
- {
- CtdlLogPrintf(CTDL_DEBUG, "SMTP client: connected!\n");
- int fdflags;
- fdflags = fcntl(sock, F_GETFL);
- if (fdflags < 0)
- CtdlLogPrintf(CTDL_DEBUG,
- "unable to get SMTP-Client socket flags! %s \n",
- strerror(errno));
- fdflags = fdflags | O_NONBLOCK;
- if (fcntl(sock, F_SETFL, fdflags) < 0)
- CtdlLogPrintf(CTDL_DEBUG,
- "unable to set SMTP-Client socket nonblocking flags! %s \n",
- strerror(errno));
- }
- if (sock < 0) {
- if (errno > 0) {
- snprintf(dsn, SIZ, "%s", strerror(errno));
- }
- else {
- snprintf(dsn, SIZ, "Unable to connect to %s : %s\n", mx_host, mx_port);
- }
- }
- }
-
- if (sock < 0) {
- *status = 4; /* dsn is already filled in */
- return;
- }