diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2009-01-09 15:00:36 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2009-01-09 15:00:36 +0000 |
commit | 968e7af6cffda22f1512f2ab775b96024b43fd05 (patch) | |
tree | 440a2e866147d07f19244cad157520c88a521a51 | |
parent | 3bc6285560ecf182f0e30ca9999e2810b09b87e4 (diff) | |
download | php-git-968e7af6cffda22f1512f2ab775b96024b43fd05.tar.gz |
MFB: Added mail logging functionality that allows logging of mail sent via
mail() function
-rw-r--r-- | ext/standard/mail.c | 62 | ||||
-rw-r--r-- | main/main.c | 2 | ||||
-rw-r--r-- | main/php_globals.h | 3 | ||||
-rw-r--r-- | php.ini-dist | 6 | ||||
-rw-r--r-- | php.ini-recommended | 6 |
5 files changed, 68 insertions, 11 deletions
diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 9793fe9476..472f1f0cb6 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -23,6 +23,8 @@ #include <stdio.h> #include "php.h" #include "ext/standard/info.h" +#include "ext/standard/php_string.h" +#include "ext/standard/basic_functions.h" #if HAVE_SYSEXITS_H #include <sysexits.h> @@ -66,6 +68,8 @@ *p = ' '; \ } \ +extern long php_getuid(void); + /* {{{ proto int ezmlm_hash(string addr) U Calculate EZMLM list hash value. */ PHP_FUNCTION(ezmlm_hash) @@ -193,25 +197,61 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char int ret; char *sendmail_path = INI_STR("sendmail_path"); char *sendmail_cmd = NULL; + char *mail_log = INI_STR("mail.log"); + char *hdr = headers; #if PHP_SIGCHILD void (*sig_handler)() = NULL; #endif +#define MAIL_RET(val) \ + if (hdr != headers) { \ + efree(hdr); \ + } \ + return val; \ + + if (mail_log) { + char *tmp; + int l = spprintf(&tmp, 0, "mail() on [%s:%d]: To: %s -- Headers: %s\n", zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C), to, hdr ? hdr : ""); + if (hdr) { /* find all \r\n instances and replace them with spaces, so a log line is always one line long */ + char *p = tmp; + while ((p = strpbrk(p, "\r\n"))) { + *p = ' '; + } + tmp[l - 1] = '\n'; + } + _php_error_log(3, tmp, mail_log, NULL TSRMLS_CC); + efree(tmp); + } + if (PG(mail_x_header)) { + char *tmp = zend_get_executed_filename(TSRMLS_C); + char *f; + size_t f_len; + + php_basename(tmp, strlen(tmp), NULL, 0,&f, &f_len); + + if (headers != NULL) { + spprintf(&hdr, 0, "%s\r\nX-PHP-Originating-Script: %ld:%s\n", headers, php_getuid(), f); + } else { + spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n", php_getuid(), f); + } + efree(f); + } + if (!sendmail_path) { #if (defined PHP_WIN32 || defined NETWARE) /* handle old style win smtp sending */ - if (TSendMail(INI_STR("SMTP"), &tsm_err, &tsm_errmsg, headers, subject, to, message, NULL, NULL, NULL TSRMLS_CC) == FAILURE) { + if (TSendMail(INI_STR("SMTP"), &tsm_err, &tsm_errmsg, hdr, subject, to, message, NULL, NULL, NULL TSRMLS_CC) == FAILURE) { if (tsm_errmsg) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", tsm_errmsg); efree(tsm_errmsg); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", GetSMErrorText(tsm_err)); } - return 0; + MAIL_RET(0); } - return 1; + MAIL_RET(1); #else - return 0; + MAIL_RET(0); #endif } if (extra_cmd != NULL) { @@ -255,13 +295,13 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char signal(SIGCHLD, sig_handler); } #endif - return 0; + MAIL_RET(0); } #endif fprintf(sendmail, "To: %s\n", to); fprintf(sendmail, "Subject: %s\n", subject); - if (headers != NULL) { - fprintf(sendmail, "%s\n", headers); + if (hdr != NULL) { + fprintf(sendmail, "%s\n", hdr); } fprintf(sendmail, "\n%s\n", message); ret = pclose(sendmail); @@ -284,9 +324,9 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char #endif #endif { - return 0; + MAIL_RET(0); } else { - return 1; + MAIL_RET(1); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not execute mail delivery program '%s'", sendmail_path); @@ -295,10 +335,10 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char signal(SIGCHLD, sig_handler); } #endif - return 0; + MAIL_RET(0); } - return 1; /* never reached */ + MAIL_RET(1); /* never reached */ } /* }}} */ diff --git a/main/main.c b/main/main.c index e78d483873..97750a29ad 100644 --- a/main/main.c +++ b/main/main.c @@ -539,6 +539,8 @@ PHP_INI_BEGIN() PHP_INI_ENTRY("SMTP", "localhost",PHP_INI_ALL, NULL) PHP_INI_ENTRY("smtp_port", "25", PHP_INI_ALL, NULL) + STD_PHP_INI_BOOLEAN("mail.add_x_header", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, mail_x_header, php_core_globals, core_globals) + STD_PHP_INI_ENTRY("mail.log", NULL, PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateString, mail_log, php_core_globals, core_globals) PHP_INI_ENTRY("browscap", NULL, PHP_INI_SYSTEM, NULL) PHP_INI_ENTRY("memory_limit", "128M", PHP_INI_ALL, OnChangeMemoryLimit) PHP_INI_ENTRY("precision", "14", PHP_INI_ALL, OnSetPrecision) diff --git a/main/php_globals.h b/main/php_globals.h index 3fbecbb3b0..4d918bc0a2 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -151,6 +151,9 @@ struct _php_core_globals { long user_ini_cache_ttl; char *request_order; + + zend_bool mail_x_header; + char *mail_log; }; diff --git a/php.ini-dist b/php.ini-dist index f44014dc96..dcc89147a0 100644 --- a/php.ini-dist +++ b/php.ini-dist @@ -669,6 +669,12 @@ smtp_port = 25 ; the 5th parameter to mail(), even in safe mode. ;mail.force_extra_parameters = +; Add X-PHP-Originaiting-Script: that will include uid of the script followed by the filename +mail.add_x_header = Off + +; Log all mail() calls including the full path of the script, line #, to address and headers +mail.log = + [SQL] sql.safe_mode = Off diff --git a/php.ini-recommended b/php.ini-recommended index 313273af0e..646b0779b9 100644 --- a/php.ini-recommended +++ b/php.ini-recommended @@ -706,6 +706,12 @@ smtp_port = 25 ; the 5th parameter to mail(), even in safe mode. ;mail.force_extra_parameters = +; Add X-PHP-Originaiting-Script: that will include uid of the script followed by the filename +mail.add_x_header = On + +; Log all mail() calls including the full path of the script, line #, to address and headers +mail.log = + [SQL] sql.safe_mode = Off |