cvs: php4 /win32 sendmail.c sendmail.h
| From: | Frank M. Kromann | Date: | Tue, 02 Jul 2002 22:29:13 +0000 |
| Subject: | cvs: php4 /win32 sendmail.c sendmail.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-12671@lists.php.net to get a copy of this message | ||
fmk Tue Jul 2 18:29:13 2002 EDT
Modified files:
/php4/win32 sendmail.c sendmail.h
Log:
Switch from imap_sendmail.* to sendmail.c under Win32
Index: php4/win32/sendmail.c diff -u php4/win32/sendmail.c:1.44 php4/win32/sendmail.c:1.45 --- php4/win32/sendmail.c:1.44 Fri Jun 14 01:42:08 2002 +++ php4/win32/sendmail.c Tue Jul 2 18:29:13 2002 @@ -17,7 +17,7 @@ * */ -/* $Id: sendmail.c,v 1.44 2002/06/14 05:42:08 sebastian Exp $ */ +/* $Id: sendmail.c,v 1.45 2002/07/02 22:29:13 fmk Exp $ */ #include "php.h" /*php specific */ #include <stdio.h> @@ -30,10 +30,10 @@ #include <winbase.h> #include "sendmail.h" #include "php_ini.h" - -#if HAVE_PCRE || HAVE_BUNDLED_PCRE -#include "ext/pcre/php_pcre.h" -#endif + +#if HAVE_PCRE || HAVE_BUNDLED_PCRE +#include "ext/pcre/php_pcre.h" +#endif /* extern int _daylight; @@ -104,77 +104,77 @@ {"Bad Mail Host"}, {"Bad Message File"}, {"\"sendmail_from\" not set in php.ini or custom \"From:\" header missing"}, - {"Mailserver rejected our \"sendmail_from\" setting"}, /* 20 */ + {"Mailserver rejected our \"sendmail_from\" setting"}, /* 20 */ {"Error while trimming mail header with PCRE, please file a bug report at http://bugs.php.net/"} /* 21 */ }; - -/* This pattern converts all single occurences of \n (Unix) - * withour a leading \r to \r\n and all occurences of \r (Mac) - * without a trailing \n to \r\n - * Thx to Nibbler from ircnet/#linuxger - */ -#define PHP_WIN32_MAIL_UNIFY_PATTERN "/(\r\n?)|\n/" -#define PHP_WIN32_MAIL_UNIFY_REPLACE "\r\n" - -/* This pattern removes \r\n from the start of the string, - * \r\n from the end of the string and also makes sure every line - * is only wrapped with a single \r\n (thus reduces multiple - * occurences of \r\n between lines to a single \r\n) */ -#define PHP_WIN32_MAIL_RMVDBL_PATTERN "/^\r\n|(\r\n)+$/m" -#define PHP_WIN32_MAIL_RMVDBL_REPLACE "" - -/* This function is meant to unify the headers passed to to mail() - * This means, use PCRE to transform single occurences of \n or \r in \r\n - * As a second step we also eleminate all \r\n occurences which are: - * 1) At the start of the header - * 2) At the end of the header - * 3) Two or more occurences in the header are removed so only one is left - * - * Returns NULL on error, or the new char* buffer on success. - * You have to take care and efree() the buffer on your own. - */ -static char *php_win32_mail_trim_header(char *header TSRMLS_DC) -{ - -#if HAVE_PCRE || HAVE_BUNDLED_PCRE - - char *result, *result2; - int result_len; - zval *replace; - - if (!header) { - return NULL; - } - - MAKE_STD_ZVAL(replace); - ZVAL_STRING(replace, PHP_WIN32_MAIL_UNIFY_REPLACE, 0); - - result = php_pcre_replace(PHP_WIN32_MAIL_UNIFY_PATTERN, sizeof(PHP_WIN32_MAIL_UNIFY_PATTERN)-1, - header, strlen(header), - replace, - 0, - &result_len, - -1 TSRMLS_CC); - if (NULL == result) { - FREE_ZVAL(replace); - return NULL; - } - - ZVAL_STRING(replace, PHP_WIN32_MAIL_RMVDBL_REPLACE, 0); - - result2 = php_pcre_replace(PHP_WIN32_MAIL_RMVDBL_PATTERN, sizeof(PHP_WIN32_MAIL_RMVDBL_PATTERN)-1, - result, result_len, - replace, - 0, - &result_len, - -1 TSRMLS_CC); - efree(result); - FREE_ZVAL(replace); - return result2; -#else - /* In case we don't have PCRE support (for whatever reason...) simply do nothing and return the unmodified header */ - return estrdup(header); -#endif + +/* This pattern converts all single occurences of \n (Unix) + * withour a leading \r to \r\n and all occurences of \r (Mac) + * without a trailing \n to \r\n + * Thx to Nibbler from ircnet/#linuxger + */ +#define PHP_WIN32_MAIL_UNIFY_PATTERN "/(\r\n?)|\n/" +#define PHP_WIN32_MAIL_UNIFY_REPLACE "\r\n" + +/* This pattern removes \r\n from the start of the string, + * \r\n from the end of the string and also makes sure every line + * is only wrapped with a single \r\n (thus reduces multiple + * occurences of \r\n between lines to a single \r\n) */ +#define PHP_WIN32_MAIL_RMVDBL_PATTERN "/^\r\n|(\r\n)+$/m" +#define PHP_WIN32_MAIL_RMVDBL_REPLACE "" + +/* This function is meant to unify the headers passed to to mail() + * This means, use PCRE to transform single occurences of \n or \r in \r\n + * As a second step we also eleminate all \r\n occurences which are: + * 1) At the start of the header + * 2) At the end of the header + * 3) Two or more occurences in the header are removed so only one is left + * + * Returns NULL on error, or the new char* buffer on success. + * You have to take care and efree() the buffer on your own. + */ +static char *php_win32_mail_trim_header(char *header TSRMLS_DC) +{ + +#if HAVE_PCRE || HAVE_BUNDLED_PCRE + + char *result, *result2; + int result_len; + zval *replace; + + if (!header) { + return NULL; + } + + MAKE_STD_ZVAL(replace); + ZVAL_STRING(replace, PHP_WIN32_MAIL_UNIFY_REPLACE, 0); + + result = php_pcre_replace(PHP_WIN32_MAIL_UNIFY_PATTERN, sizeof(PHP_WIN32_MAIL_UNIFY_PATTERN)-1, + header, strlen(header), + replace, + 0, + &result_len, + -1 TSRMLS_CC); + if (NULL == result) { + FREE_ZVAL(replace); + return NULL; + } + + ZVAL_STRING(replace, PHP_WIN32_MAIL_RMVDBL_REPLACE, 0); + + result2 = php_pcre_replace(PHP_WIN32_MAIL_RMVDBL_PATTERN, sizeof(PHP_WIN32_MAIL_RMVDBL_PATTERN)-1, + result, result_len, + replace, + 0, + &result_len, + -1 TSRMLS_CC); + efree(result); + FREE_ZVAL(replace); + return result2; +#else + /* In case we don't have PCRE support (for whatever reason...) simply do nothing and return the unmodified header */ + return estrdup(header); +#endif } /********************************************************************* @@ -191,11 +191,12 @@ // See SendText() for additional args! //********************************************************************/ int TSendMail(char *host, int *error, char **error_message, - char *headers, char *Subject, char *mailTo, char *data) + char *headers, char *Subject, char *mailTo, char *data, + char *mailCc, char *mailBcc, char *mailRPath) { int ret; char *RPath = NULL; - char *headers_lc = NULL; /* headers_lc is only created if we've a header at all */ + char *headers_lc = NULL; /* headers_lc is only created if we've a header at all */ TSRMLS_FETCH(); WinsockStarted = FALSE; @@ -212,17 +213,17 @@ if (headers) { char *pos = NULL; - size_t i; - - /* Use PCRE to trim the header into the right format */ - if (NULL == (headers = php_win32_mail_trim_header(headers TSRMLS_CC))) { - *error = W32_SM_PCRE_ERROR; - return FAILURE; - } + size_t i; + + /* Use PCRE to trim the header into the right format */ + if (NULL == (headers = php_win32_mail_trim_header(headers TSRMLS_CC))) { + *error = W32_SM_PCRE_ERROR; + return FAILURE; + } /* Create a lowercased header for all the searches so we're finally case * insensitive when searching for a pattern. */ - if (NULL == (headers_lc = estrdup(headers))) { + if (NULL == (headers_lc = estrdup(headers))) { efree(headers); *error = OUT_OF_MEMORY; return FAILURE; @@ -233,11 +234,14 @@ } /* Fall back to sendmail_from php.ini setting */ - if (INI_STR("sendmail_from")) { + if (mailRPath && *mailRPath) { + RPath = estrdup(mailRPath); + } + else if (INI_STR("sendmail_from")) { RPath = estrdup(INI_STR("sendmail_from")); } else { if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } *error = W32_SM_SENDMAIL_FROM_NOT_SET; @@ -251,26 +255,26 @@ efree(RPath); } if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } /* 128 is safe here, the specifier in snprintf isn't longer than that */ if (NULL == (*error_message = ecalloc(1, HOST_NAME_LEN + 128))) { return FAILURE; } - snprintf(*error_message, HOST_NAME_LEN + 128, - "Failed to connect to mailserver at \"%s\" port %d, verify your \"SMTP\"" - "and \"smtp_port\" setting in php.ini or use ini_set()", + snprintf(*error_message, HOST_NAME_LEN + 128, + "Failed to connect to mailserver at \"%s\" port %d, verify your \"SMTP\"" + "and \"smtp_port\" setting in php.ini or use ini_set()", MailHost, !INI_INT("smtp_port") ? 25 : INI_INT("smtp_port")); return FAILURE; } else { - ret = SendText(RPath, Subject, mailTo, data, headers, headers_lc, error_message); + ret = SendText(RPath, Subject, mailTo, mailCc, mailBcc, data, headers, headers_lc, error_message); TSMClose(); if (RPath) { efree(RPath); } if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } if (ret != SUCCESS) { @@ -341,7 +345,8 @@ // Author/Date: jcar 20/9/96 // History: //*******************************************************************/ -int SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *headers_lc, char **error_message) +int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, + char *headers, char *headers_lc, char **error_message) { int res, i; char *p; @@ -395,12 +400,12 @@ while(token != NULL) { snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); - if ((res = Post(Buffer)) != SUCCESS) { + if ((res = Post(Buffer)) != SUCCESS) { efree(tempMailTo); - return (res); + return (res); } if ((res = Ack(&server_response)) != SUCCESS) { - SMTP_ERROR_RESPONSE(server_response); + SMTP_ERROR_RESPONSE(server_response); efree(tempMailTo); return (res); } @@ -426,11 +431,35 @@ token = strtok(tempMailTo, ","); while(token != NULL) { - sprintf(Buffer, "RCPT TO:<%s>\r\n", token); - if ((res = Post(Buffer)) != SUCCESS) + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); return (res); + } if ((res = Ack(&server_response)) != SUCCESS) { SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); + return (res); + } + token = strtok(NULL, ","); + } + efree(tempMailTo); + } + + if (mailCc && *mailCc) { + tempMailTo = estrdup(mailCc); + /* Send mail to all rcpt's */ + token = strtok(tempMailTo, ","); + while(token != NULL) + { + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); + return (res); + } + if ((res = Ack(&server_response)) != SUCCESS) { + SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); return (res); } token = strtok(NULL, ","); @@ -498,6 +527,26 @@ } } } + if (mailBcc && *mailBcc) { + tempMailTo = estrdup(mailBcc); + /* Send mail to all rcpt's */ + token = strtok(tempMailTo, ","); + while(token != NULL) + { + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); + return (res); + } + if ((res = Ack(&server_response)) != SUCCESS) { + SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); + return (res); + } + token = strtok(NULL, ","); + } + efree(tempMailTo); + } if ((res = Post("DATA\r\n")) != SUCCESS) { efree(stripped_header); @@ -560,12 +609,12 @@ return (SUCCESS); } -int addToHeader(char **header_buffer, const char *specifier, char *string) { - if (NULL == (*header_buffer = erealloc(*header_buffer, strlen(*header_buffer) + strlen(specifier) + strlen(string) + 1))) { - return 0; - } +int addToHeader(char **header_buffer, const char *specifier, char *string) { + if (NULL == (*header_buffer = erealloc(*header_buffer, strlen(*header_buffer) + strlen(specifier) + strlen(string) + 1))) { + return 0; + } sprintf(*header_buffer + strlen(*header_buffer), specifier, string); - return 1; + return 1; } /********************************************************************* @@ -602,10 +651,10 @@ headers_lc[i] = tolower(headers_lc[i]); } } - - if (NULL == (header_buffer = ecalloc(1, MAIL_BUFFER_SIZE))) { - efree(headers_lc); - return OUT_OF_MEMORY; + + if (NULL == (header_buffer = ecalloc(1, MAIL_BUFFER_SIZE))) { + efree(headers_lc); + return OUT_OF_MEMORY; } zoneh /= (60 * 60); zonem = (abs(_timezone) / 60) - (zoneh * 60); @@ -624,52 +673,52 @@ zonem); } - if (!headers_lc || !strstr(headers_lc, "from:")) { - if (!addToHeader(&header_buffer, "From: %s\r\n", RPath)) { - goto PostHeader_outofmem; - } - } - if (!addToHeader(&header_buffer, "Subject: %s\r\n", Subject)) { - goto PostHeader_outofmem; - } - - /* Only add the To: field from the $to parameter if isn't in the custom headers */ - if ((headers_lc && (!strstr(headers_lc, "\r\nto:") && (strncmp(headers_lc, "to:", 3) != 0))) || !headers_lc) { - if (!addToHeader(&header_buffer, "To: %s\r\n", mailTo)) { - goto PostHeader_outofmem; - } - } - + if (!headers_lc || !strstr(headers_lc, "from:")) { + if (!addToHeader(&header_buffer, "From: %s\r\n", RPath)) { + goto PostHeader_outofmem; + } + } + if (!addToHeader(&header_buffer, "Subject: %s\r\n", Subject)) { + goto PostHeader_outofmem; + } + + /* Only add the To: field from the $to parameter if isn't in the custom headers */ + if ((headers_lc && (!strstr(headers_lc, "\r\nto:") && (strncmp(headers_lc, "to:", 3) != 0))) || !headers_lc) { + if (!addToHeader(&header_buffer, "To: %s\r\n", mailTo)) { + goto PostHeader_outofmem; + } + } + if (mailCc && *mailCc) { - if (!addToHeader(&header_buffer, "Cc: %s\r\n", mailCc)) { - goto PostHeader_outofmem; - } + if (!addToHeader(&header_buffer, "Cc: %s\r\n", mailCc)) { + goto PostHeader_outofmem; + } } if(xheaders){ - if (!addToHeader(&header_buffer, "%s\r\n", xheaders)) { - goto PostHeader_outofmem; - } - } - - if (headers_lc) { - efree(headers_lc); - } - if ((res = Post(header_buffer)) != SUCCESS) { + if (!addToHeader(&header_buffer, "%s", xheaders)) { + goto PostHeader_outofmem; + } + } + + if (headers_lc) { + efree(headers_lc); + } + if ((res = Post(header_buffer)) != SUCCESS) { efree(header_buffer); return (res); - } + } efree(header_buffer); if ((res = Post("\r\n")) != SUCCESS) { return (res); } - return (SUCCESS); - -PostHeader_outofmem: - if (headers_lc) { - efree(headers_lc); - } + return (SUCCESS); + +PostHeader_outofmem: + if (headers_lc) { + efree(headers_lc); + } return OUT_OF_MEMORY; } Index: php4/win32/sendmail.h diff -u php4/win32/sendmail.h:1.9 php4/win32/sendmail.h:1.10 --- php4/win32/sendmail.h:1.9 Wed Jun 5 13:08:38 2002 +++ php4/win32/sendmail.h Tue Jul 2 18:29:13 2002 @@ -27,15 +27,17 @@ #define BAD_MAIL_HOST 17 #define BAD_MSG_FILE 18 #define W32_SM_SENDMAIL_FROM_NOT_SET 19 -#define W32_SM_SENDMAIL_FROM_MALFORMED 20 +#define W32_SM_SENDMAIL_FROM_MALFORMED 20 #define W32_SM_PCRE_ERROR 21 #define MAX_ERROR_INDEX 22 /* Always last error message + 1 */ int TSendMail(char *smtpaddr, int *returnerror, char **error_message, - char *RPath, char *Subject, char *mailTo, char *data); + char *RPath, char *Subject, char *mailTo, char *data, + char *mailCc, char *mailBcc, char *mailRPath); void TSMClose(void); -int SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *headers_lc, char **error_message); +int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, + char *headers, char *headers_lc, char **error_message); char *GetSMErrorText(int index); int MailConnect();
Index: php4/win32/sendmail.c diff -u php4/win32/sendmail.c:1.44 php4/win32/sendmail.c:1.45 --- php4/win32/sendmail.c:1.44 Fri Jun 14 01:42:08 2002 +++ php4/win32/sendmail.c Tue Jul 2 18:29:13 2002 @@ -17,7 +17,7 @@ * */ -/* $Id: sendmail.c,v 1.44 2002/06/14 05:42:08 sebastian Exp $ */ +/* $Id: sendmail.c,v 1.45 2002/07/02 22:29:13 fmk Exp $ */ #include "php.h" /*php specific */ #include <stdio.h> @@ -30,10 +30,10 @@ #include <winbase.h> #include "sendmail.h" #include "php_ini.h" - -#if HAVE_PCRE || HAVE_BUNDLED_PCRE -#include "ext/pcre/php_pcre.h" -#endif + +#if HAVE_PCRE || HAVE_BUNDLED_PCRE +#include "ext/pcre/php_pcre.h" +#endif /* extern int _daylight; @@ -104,77 +104,77 @@ {"Bad Mail Host"}, {"Bad Message File"}, {"\"sendmail_from\" not set in php.ini or custom \"From:\" header missing"}, - {"Mailserver rejected our \"sendmail_from\" setting"}, /* 20 */ + {"Mailserver rejected our \"sendmail_from\" setting"}, /* 20 */ {"Error while trimming mail header with PCRE, please file a bug report at http://bugs.php.net/"} /* 21 */ }; - -/* This pattern converts all single occurences of \n (Unix) - * withour a leading \r to \r\n and all occurences of \r (Mac) - * without a trailing \n to \r\n - * Thx to Nibbler from ircnet/#linuxger - */ -#define PHP_WIN32_MAIL_UNIFY_PATTERN "/(\r\n?)|\n/" -#define PHP_WIN32_MAIL_UNIFY_REPLACE "\r\n" - -/* This pattern removes \r\n from the start of the string, - * \r\n from the end of the string and also makes sure every line - * is only wrapped with a single \r\n (thus reduces multiple - * occurences of \r\n between lines to a single \r\n) */ -#define PHP_WIN32_MAIL_RMVDBL_PATTERN "/^\r\n|(\r\n)+$/m" -#define PHP_WIN32_MAIL_RMVDBL_REPLACE "" - -/* This function is meant to unify the headers passed to to mail() - * This means, use PCRE to transform single occurences of \n or \r in \r\n - * As a second step we also eleminate all \r\n occurences which are: - * 1) At the start of the header - * 2) At the end of the header - * 3) Two or more occurences in the header are removed so only one is left - * - * Returns NULL on error, or the new char* buffer on success. - * You have to take care and efree() the buffer on your own. - */ -static char *php_win32_mail_trim_header(char *header TSRMLS_DC) -{ - -#if HAVE_PCRE || HAVE_BUNDLED_PCRE - - char *result, *result2; - int result_len; - zval *replace; - - if (!header) { - return NULL; - } - - MAKE_STD_ZVAL(replace); - ZVAL_STRING(replace, PHP_WIN32_MAIL_UNIFY_REPLACE, 0); - - result = php_pcre_replace(PHP_WIN32_MAIL_UNIFY_PATTERN, sizeof(PHP_WIN32_MAIL_UNIFY_PATTERN)-1, - header, strlen(header), - replace, - 0, - &result_len, - -1 TSRMLS_CC); - if (NULL == result) { - FREE_ZVAL(replace); - return NULL; - } - - ZVAL_STRING(replace, PHP_WIN32_MAIL_RMVDBL_REPLACE, 0); - - result2 = php_pcre_replace(PHP_WIN32_MAIL_RMVDBL_PATTERN, sizeof(PHP_WIN32_MAIL_RMVDBL_PATTERN)-1, - result, result_len, - replace, - 0, - &result_len, - -1 TSRMLS_CC); - efree(result); - FREE_ZVAL(replace); - return result2; -#else - /* In case we don't have PCRE support (for whatever reason...) simply do nothing and return the unmodified header */ - return estrdup(header); -#endif + +/* This pattern converts all single occurences of \n (Unix) + * withour a leading \r to \r\n and all occurences of \r (Mac) + * without a trailing \n to \r\n + * Thx to Nibbler from ircnet/#linuxger + */ +#define PHP_WIN32_MAIL_UNIFY_PATTERN "/(\r\n?)|\n/" +#define PHP_WIN32_MAIL_UNIFY_REPLACE "\r\n" + +/* This pattern removes \r\n from the start of the string, + * \r\n from the end of the string and also makes sure every line + * is only wrapped with a single \r\n (thus reduces multiple + * occurences of \r\n between lines to a single \r\n) */ +#define PHP_WIN32_MAIL_RMVDBL_PATTERN "/^\r\n|(\r\n)+$/m" +#define PHP_WIN32_MAIL_RMVDBL_REPLACE "" + +/* This function is meant to unify the headers passed to to mail() + * This means, use PCRE to transform single occurences of \n or \r in \r\n + * As a second step we also eleminate all \r\n occurences which are: + * 1) At the start of the header + * 2) At the end of the header + * 3) Two or more occurences in the header are removed so only one is left + * + * Returns NULL on error, or the new char* buffer on success. + * You have to take care and efree() the buffer on your own. + */ +static char *php_win32_mail_trim_header(char *header TSRMLS_DC) +{ + +#if HAVE_PCRE || HAVE_BUNDLED_PCRE + + char *result, *result2; + int result_len; + zval *replace; + + if (!header) { + return NULL; + } + + MAKE_STD_ZVAL(replace); + ZVAL_STRING(replace, PHP_WIN32_MAIL_UNIFY_REPLACE, 0); + + result = php_pcre_replace(PHP_WIN32_MAIL_UNIFY_PATTERN, sizeof(PHP_WIN32_MAIL_UNIFY_PATTERN)-1, + header, strlen(header), + replace, + 0, + &result_len, + -1 TSRMLS_CC); + if (NULL == result) { + FREE_ZVAL(replace); + return NULL; + } + + ZVAL_STRING(replace, PHP_WIN32_MAIL_RMVDBL_REPLACE, 0); + + result2 = php_pcre_replace(PHP_WIN32_MAIL_RMVDBL_PATTERN, sizeof(PHP_WIN32_MAIL_RMVDBL_PATTERN)-1, + result, result_len, + replace, + 0, + &result_len, + -1 TSRMLS_CC); + efree(result); + FREE_ZVAL(replace); + return result2; +#else + /* In case we don't have PCRE support (for whatever reason...) simply do nothing and return the unmodified header */ + return estrdup(header); +#endif } /********************************************************************* @@ -191,11 +191,12 @@ // See SendText() for additional args! //********************************************************************/ int TSendMail(char *host, int *error, char **error_message, - char *headers, char *Subject, char *mailTo, char *data) + char *headers, char *Subject, char *mailTo, char *data, + char *mailCc, char *mailBcc, char *mailRPath) { int ret; char *RPath = NULL; - char *headers_lc = NULL; /* headers_lc is only created if we've a header at all */ + char *headers_lc = NULL; /* headers_lc is only created if we've a header at all */ TSRMLS_FETCH(); WinsockStarted = FALSE; @@ -212,17 +213,17 @@ if (headers) { char *pos = NULL; - size_t i; - - /* Use PCRE to trim the header into the right format */ - if (NULL == (headers = php_win32_mail_trim_header(headers TSRMLS_CC))) { - *error = W32_SM_PCRE_ERROR; - return FAILURE; - } + size_t i; + + /* Use PCRE to trim the header into the right format */ + if (NULL == (headers = php_win32_mail_trim_header(headers TSRMLS_CC))) { + *error = W32_SM_PCRE_ERROR; + return FAILURE; + } /* Create a lowercased header for all the searches so we're finally case * insensitive when searching for a pattern. */ - if (NULL == (headers_lc = estrdup(headers))) { + if (NULL == (headers_lc = estrdup(headers))) { efree(headers); *error = OUT_OF_MEMORY; return FAILURE; @@ -233,11 +234,14 @@ } /* Fall back to sendmail_from php.ini setting */ - if (INI_STR("sendmail_from")) { + if (mailRPath && *mailRPath) { + RPath = estrdup(mailRPath); + } + else if (INI_STR("sendmail_from")) { RPath = estrdup(INI_STR("sendmail_from")); } else { if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } *error = W32_SM_SENDMAIL_FROM_NOT_SET; @@ -251,26 +255,26 @@ efree(RPath); } if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } /* 128 is safe here, the specifier in snprintf isn't longer than that */ if (NULL == (*error_message = ecalloc(1, HOST_NAME_LEN + 128))) { return FAILURE; } - snprintf(*error_message, HOST_NAME_LEN + 128, - "Failed to connect to mailserver at \"%s\" port %d, verify your \"SMTP\"" - "and \"smtp_port\" setting in php.ini or use ini_set()", + snprintf(*error_message, HOST_NAME_LEN + 128, + "Failed to connect to mailserver at \"%s\" port %d, verify your \"SMTP\"" + "and \"smtp_port\" setting in php.ini or use ini_set()", MailHost, !INI_INT("smtp_port") ? 25 : INI_INT("smtp_port")); return FAILURE; } else { - ret = SendText(RPath, Subject, mailTo, data, headers, headers_lc, error_message); + ret = SendText(RPath, Subject, mailTo, mailCc, mailBcc, data, headers, headers_lc, error_message); TSMClose(); if (RPath) { efree(RPath); } if (headers) { - efree(headers); + efree(headers); efree(headers_lc); } if (ret != SUCCESS) { @@ -341,7 +345,8 @@ // Author/Date: jcar 20/9/96 // History: //*******************************************************************/ -int SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *headers_lc, char **error_message) +int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, + char *headers, char *headers_lc, char **error_message) { int res, i; char *p; @@ -395,12 +400,12 @@ while(token != NULL) { snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); - if ((res = Post(Buffer)) != SUCCESS) { + if ((res = Post(Buffer)) != SUCCESS) { efree(tempMailTo); - return (res); + return (res); } if ((res = Ack(&server_response)) != SUCCESS) { - SMTP_ERROR_RESPONSE(server_response); + SMTP_ERROR_RESPONSE(server_response); efree(tempMailTo); return (res); } @@ -426,11 +431,35 @@ token = strtok(tempMailTo, ","); while(token != NULL) { - sprintf(Buffer, "RCPT TO:<%s>\r\n", token); - if ((res = Post(Buffer)) != SUCCESS) + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); return (res); + } if ((res = Ack(&server_response)) != SUCCESS) { SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); + return (res); + } + token = strtok(NULL, ","); + } + efree(tempMailTo); + } + + if (mailCc && *mailCc) { + tempMailTo = estrdup(mailCc); + /* Send mail to all rcpt's */ + token = strtok(tempMailTo, ","); + while(token != NULL) + { + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); + return (res); + } + if ((res = Ack(&server_response)) != SUCCESS) { + SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); return (res); } token = strtok(NULL, ","); @@ -498,6 +527,26 @@ } } } + if (mailBcc && *mailBcc) { + tempMailTo = estrdup(mailBcc); + /* Send mail to all rcpt's */ + token = strtok(tempMailTo, ","); + while(token != NULL) + { + snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token); + if ((res = Post(Buffer)) != SUCCESS) { + efree(tempMailTo); + return (res); + } + if ((res = Ack(&server_response)) != SUCCESS) { + SMTP_ERROR_RESPONSE(server_response); + efree(tempMailTo); + return (res); + } + token = strtok(NULL, ","); + } + efree(tempMailTo); + } if ((res = Post("DATA\r\n")) != SUCCESS) { efree(stripped_header); @@ -560,12 +609,12 @@ return (SUCCESS); } -int addToHeader(char **header_buffer, const char *specifier, char *string) { - if (NULL == (*header_buffer = erealloc(*header_buffer, strlen(*header_buffer) + strlen(specifier) + strlen(string) + 1))) { - return 0; - } +int addToHeader(char **header_buffer, const char *specifier, char *string) { + if (NULL == (*header_buffer = erealloc(*header_buffer, strlen(*header_buffer) + strlen(specifier) + strlen(string) + 1))) { + return 0; + } sprintf(*header_buffer + strlen(*header_buffer), specifier, string); - return 1; + return 1; } /********************************************************************* @@ -602,10 +651,10 @@ headers_lc[i] = tolower(headers_lc[i]); } } - - if (NULL == (header_buffer = ecalloc(1, MAIL_BUFFER_SIZE))) { - efree(headers_lc); - return OUT_OF_MEMORY; + + if (NULL == (header_buffer = ecalloc(1, MAIL_BUFFER_SIZE))) { + efree(headers_lc); + return OUT_OF_MEMORY; } zoneh /= (60 * 60); zonem = (abs(_timezone) / 60) - (zoneh * 60); @@ -624,52 +673,52 @@ zonem); } - if (!headers_lc || !strstr(headers_lc, "from:")) { - if (!addToHeader(&header_buffer, "From: %s\r\n", RPath)) { - goto PostHeader_outofmem; - } - } - if (!addToHeader(&header_buffer, "Subject: %s\r\n", Subject)) { - goto PostHeader_outofmem; - } - - /* Only add the To: field from the $to parameter if isn't in the custom headers */ - if ((headers_lc && (!strstr(headers_lc, "\r\nto:") && (strncmp(headers_lc, "to:", 3) != 0))) || !headers_lc) { - if (!addToHeader(&header_buffer, "To: %s\r\n", mailTo)) { - goto PostHeader_outofmem; - } - } - + if (!headers_lc || !strstr(headers_lc, "from:")) { + if (!addToHeader(&header_buffer, "From: %s\r\n", RPath)) { + goto PostHeader_outofmem; + } + } + if (!addToHeader(&header_buffer, "Subject: %s\r\n", Subject)) { + goto PostHeader_outofmem; + } + + /* Only add the To: field from the $to parameter if isn't in the custom headers */ + if ((headers_lc && (!strstr(headers_lc, "\r\nto:") && (strncmp(headers_lc, "to:", 3) != 0))) || !headers_lc) { + if (!addToHeader(&header_buffer, "To: %s\r\n", mailTo)) { + goto PostHeader_outofmem; + } + } + if (mailCc && *mailCc) { - if (!addToHeader(&header_buffer, "Cc: %s\r\n", mailCc)) { - goto PostHeader_outofmem; - } + if (!addToHeader(&header_buffer, "Cc: %s\r\n", mailCc)) { + goto PostHeader_outofmem; + } } if(xheaders){ - if (!addToHeader(&header_buffer, "%s\r\n", xheaders)) { - goto PostHeader_outofmem; - } - } - - if (headers_lc) { - efree(headers_lc); - } - if ((res = Post(header_buffer)) != SUCCESS) { + if (!addToHeader(&header_buffer, "%s", xheaders)) { + goto PostHeader_outofmem; + } + } + + if (headers_lc) { + efree(headers_lc); + } + if ((res = Post(header_buffer)) != SUCCESS) { efree(header_buffer); return (res); - } + } efree(header_buffer); if ((res = Post("\r\n")) != SUCCESS) { return (res); } - return (SUCCESS); - -PostHeader_outofmem: - if (headers_lc) { - efree(headers_lc); - } + return (SUCCESS); + +PostHeader_outofmem: + if (headers_lc) { + efree(headers_lc); + } return OUT_OF_MEMORY; } Index: php4/win32/sendmail.h diff -u php4/win32/sendmail.h:1.9 php4/win32/sendmail.h:1.10 --- php4/win32/sendmail.h:1.9 Wed Jun 5 13:08:38 2002 +++ php4/win32/sendmail.h Tue Jul 2 18:29:13 2002 @@ -27,15 +27,17 @@ #define BAD_MAIL_HOST 17 #define BAD_MSG_FILE 18 #define W32_SM_SENDMAIL_FROM_NOT_SET 19 -#define W32_SM_SENDMAIL_FROM_MALFORMED 20 +#define W32_SM_SENDMAIL_FROM_MALFORMED 20 #define W32_SM_PCRE_ERROR 21 #define MAX_ERROR_INDEX 22 /* Always last error message + 1 */ int TSendMail(char *smtpaddr, int *returnerror, char **error_message, - char *RPath, char *Subject, char *mailTo, char *data); + char *RPath, char *Subject, char *mailTo, char *data, + char *mailCc, char *mailBcc, char *mailRPath); void TSMClose(void); -int SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *headers_lc, char **error_message); +int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, + char *headers, char *headers_lc, char **error_message); char *GetSMErrorText(int index); int MailConnect();