⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncbi_sendmail.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 2 页
字号:
            if (isspace((unsigned char) c)) {                while (isspace((unsigned char)(*to)))                    to++;            }        }        if (k >= buf_size)            SENDMAIL_RETURN("Recepient address is too long");        buf[k] = 0;        if (quote) {            CORE_LOGF(eLOG_Warning, ("[SendMail]  Ubalanced delimiters in "                                     "recepient %s for %s: \"%c\" expected",                                     buf, what, quote));        }        if (!s_SockWrite(sock, "RCPT TO: <")  ||            !s_SockWrite(sock, buf)           ||            !s_SockWrite(sock, ">" MX_CRLF)) {            SENDMAIL_RETURN(write_error);        }        if (!s_SockReadResponse(sock, 250, 251, buf, buf_size))            SENDMAIL_RETURN2(proto_error, buf);        if (!c)            break;    }    return 0;}#define SENDMAIL_SENDRCPT(what, list, buffer)                              \    s_SendRcpt(sock, list, buffer, sizeof(buffer), what,                   \               "Write error in RCPT (" what ") command",                   \               "Protocol error in RCPT (" what ") command")#define SENDMAIL_READ_RESPONSE(code, altcode, buffer)                      \    s_SockReadResponse(sock, code, altcode, buffer, sizeof(buffer))const char* CORE_SendMailEx(const char*          to,                            const char*          subject,                            const char*          body,                            const SSendMailInfo* uinfo){    const SSendMailInfo* info;    SSendMailInfo ainfo;    char buffer[1024];    SOCK sock = 0;    info = uinfo ? uinfo : SendMailInfo_Init(&ainfo);    if (info->magic_number != MX_MAGIC_NUMBER)        SENDMAIL_RETURN("Invalid magic number");    if ((!to         ||  !*to)        &&        (!info->cc   ||  !*info->cc)  &&        (!info->bcc  ||  !*info->bcc)) {        SENDMAIL_RETURN("At least one message recipient must be specified");    }    /* Open connection to sendmail */    if (SOCK_Create(info->mx_host, info->mx_port, &info->mx_timeout, &sock)        != eIO_Success) {        SENDMAIL_RETURN("Cannot connect to sendmail");    }    SOCK_SetTimeout(sock, eIO_ReadWrite, &info->mx_timeout);    /* Follow the protocol conversation, RFC821 */    if (!SENDMAIL_READ_RESPONSE(220, 0, buffer))        SENDMAIL_RETURN2("Protocol error in connection init", buffer);    if (SOCK_gethostname(buffer, sizeof(buffer)) != 0)        SENDMAIL_RETURN("Unable to get local host name");    if (!s_SockWrite(sock, "HELO ")         ||        !s_SockWrite(sock, buffer)          ||        !s_SockWrite(sock, MX_CRLF)) {        SENDMAIL_RETURN("Write error in HELO command");    }    if (!SENDMAIL_READ_RESPONSE(250, 0, buffer))        SENDMAIL_RETURN2("Protocol error in HELO command", buffer);    if (!s_SockWrite(sock, "MAIL FROM: <")  ||        !s_SockWrite(sock, info->from)      ||        !s_SockWrite(sock, ">" MX_CRLF)) {        SENDMAIL_RETURN("Write error in MAIL command");    }    if (!SENDMAIL_READ_RESPONSE(250, 0, buffer))        SENDMAIL_RETURN2("Protocol error in MAIL command", buffer);    if (to && *to) {        const char* error = SENDMAIL_SENDRCPT("To", to, buffer);        if (error)            return error;    }    if (info->cc && *info->cc) {        const char* error = SENDMAIL_SENDRCPT("Cc", info->cc, buffer);        if (error)            return error;    }    if (info->bcc && *info->bcc) {        const char* error = SENDMAIL_SENDRCPT("Bcc", info->bcc, buffer);        if (error)            return error;    }    if (!s_SockWrite(sock, "DATA" MX_CRLF))        SENDMAIL_RETURN("Write error in DATA command");    if (!SENDMAIL_READ_RESPONSE(354, 0, buffer))        SENDMAIL_RETURN2("Protocol error in DATA command", buffer);    if (!info->mx_no_header) {        /* Follow RFC822 to compose message headers. Note that         * 'Date:'and 'From:' are both added by sendmail automatically.         */         if (!s_SockWrite(sock, "Subject: ")           ||            (subject && !s_SockWrite(sock, subject))  ||            !s_SockWrite(sock, MX_CRLF))            SENDMAIL_RETURN("Write error in sending subject");        if (to && *to) {            if (!s_SockWrite(sock, "To: ")            ||                !s_SockWrite(sock, to)                ||                !s_SockWrite(sock, MX_CRLF))                SENDMAIL_RETURN("Write error in sending To");        }        if (info->cc && *info->cc) {            if (!s_SockWrite(sock, "Cc: ")            ||                !s_SockWrite(sock, info->cc)          ||                !s_SockWrite(sock, MX_CRLF))                SENDMAIL_RETURN("Write error in sending Cc");        }    } else if (subject && *subject)        CORE_LOG(eLOG_Warning,"[SendMail]  Subject ignored in as-is messages");    if (!s_SockWrite(sock, "X-Mailer: CORE_SendMail (NCBI "                     NCBI_SENDMAIL_TOOLKIT " Toolkit)" MX_CRLF))        SENDMAIL_RETURN("Write error in sending mailer information");    assert(sizeof(buffer) > sizeof(MX_CRLF) && sizeof(MX_CRLF) >= 3);    if (info->header && *info->header) {        size_t n = 0, m = strlen(info->header);        int/*bool*/ newline = 0/*false*/;        while (n < m) {            size_t k = 0;            while (k < sizeof(buffer) - sizeof(MX_CRLF)) {                if (info->header[n] == '\n') {                    memcpy(&buffer[k], MX_CRLF, sizeof(MX_CRLF) - 1);                    k += sizeof(MX_CRLF) - 1;                    newline = 1/*true*/;                } else {                    if (info->header[n] != '\r'  ||  !newline)                        buffer[k++] = info->header[n];                    newline = 0/*false*/;                }                if (++n >= m)                    break;            }            buffer[k] = 0;            if (!s_SockWrite(sock, buffer))                SENDMAIL_RETURN("Write error while sending custom header");        }        if (!newline && !s_SockWrite(sock, MX_CRLF))            SENDMAIL_RETURN("Write error while finalizing custom header");    }    if (body) {        size_t n = 0, m = info->body_size ? info->body_size : strlen(body);        int/*bool*/ newline = 0/*false*/;        if (!info->mx_no_header  &&  m) {            if (!s_SockWrite(sock, MX_CRLF))                SENDMAIL_RETURN("Write error in message body delimiter");        }        while (n < m) {            size_t k = 0;            while (k < sizeof(buffer) - sizeof(MX_CRLF)) {                if (body[n] == '\n') {                    memcpy(&buffer[k], MX_CRLF, sizeof(MX_CRLF) - 1);                    k += sizeof(MX_CRLF) - 1;                    newline = 1/*true*/;                } else {                    if (body[n] != '\r'  ||  !newline) {                        if (body[n] == '.'  &&  (newline  ||  !n)) {                            buffer[k++] = '.';                            buffer[k++] = '.';                        } else                            buffer[k++] = body[n];                    }                    newline = 0/*false*/;                }                if (++n >= m)                    break;            }            buffer[k] = 0;            if (!s_SockWrite(sock, buffer))                SENDMAIL_RETURN("Write error while sending message body");        }        if ((!newline  &&  m  &&  !s_SockWrite(sock, MX_CRLF))            ||  !s_SockWrite(sock, "." MX_CRLF)) {            SENDMAIL_RETURN("Write error while finalizing message body");        }    } else if (!s_SockWrite(sock, "." MX_CRLF))        SENDMAIL_RETURN("Write error while finalizing message");    if (!SENDMAIL_READ_RESPONSE(250, 0, buffer))        SENDMAIL_RETURN2("Protocol error in sending message", buffer);    if (!s_SockWrite(sock, "QUIT" MX_CRLF))        SENDMAIL_RETURN("Write error in QUIT command");    if (!SENDMAIL_READ_RESPONSE(221, 0, buffer))        SENDMAIL_RETURN2("Protocol error in QUIT command", buffer);    SOCK_Close(sock);    return 0;}#undef SENDMAIL_READ_RESPONSE#undef SENDMAIL_SENDRCPT#undef SENDMAIL_RETURN2#undef SENDMAIL_RETURN/* * --------------------------------------------------------------------------- * $Log: ncbi_sendmail.c,v $ * Revision 1000.1  2004/02/12 21:52:59  gouriano * PRODUCTION: UPGRADED [CORE_001] Dev-tree R6.22 * * Revision 6.22  2004/01/07 19:51:36  lavr * Try to obtain user name from USERNAME env.var. on Windows, else fallback * * Revision 6.21  2003/12/09 15:38:39  lavr * Take advantage of SSendMailInfo::body_size;  few little makeup changes * * Revision 6.20  2003/12/04 14:55:09  lavr * Extend API with no-header and multiple recipient capabilities * * Revision 6.19  2003/04/18 20:59:51  lavr * Mixed up SMTP_BADCODE and SMTP_BADREPLY rearranged in order * * Revision 6.18  2003/03/24 19:46:17  lavr * Few minor changes; do not init SSendMailInfo passed as NULL * * Revision 6.17  2003/02/08 21:05:55  lavr * Unimportant change in comments * * Revision 6.16  2002/10/28 15:43:29  lavr * Use "ncbi_ansi_ext.h" privately and use strncpy0() * * Revision 6.15  2002/09/24 15:05:45  lavr * Log moved to end * * Revision 6.14  2002/08/14 18:55:39  lavr * Close socket on error return (was forgotten) * * Revision 6.13  2002/08/12 15:12:31  lavr * Use persistent SOCK_Write() * * Revision 6.12  2002/08/07 16:33:15  lavr * Changed EIO_ReadMethod enums accordingly; log moved to end * * Revision 6.11  2002/02/11 20:36:44  lavr * Use "ncbi_config.h" * * Revision 6.10  2001/07/13 20:15:12  lavr * Write lock then unlock when using not MT-safe s_ComposeFrom() * * Revision 6.9  2001/05/18 20:41:43  lavr * Beautifying: change log corrected * * Revision 6.8  2001/05/18 19:52:24  lavr * Tricks in macros to keep Sun C compiler silent from warnings (details below) * * Revision 6.7  2001/03/26 18:39:24  lavr * Casting to (unsigned char) instead of (int) for ctype char.class macros * * Revision 6.6  2001/03/06 04:32:00  lavr * Better custom header processing * * Revision 6.5  2001/03/02 20:09:06  lavr * Typo fixed * * Revision 6.4  2001/03/01 00:30:23  lavr * Toolkit configuration moved to ncbi_sendmail_.c * * Revision 6.3  2001/02/28 21:11:47  lavr * Bugfix: buffer overrun * * Revision 6.2  2001/02/28 17:48:53  lavr * Some fixes; larger intermediate buffer for message body * * Revision 6.1  2001/02/28 00:52:26  lavr * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -