31#ifdef HAVE_SYS_SYSEXITS_H
32# include <sys/sysexits.h>
48#define SKIP_LONG_HEADER_SEP(str, pos) \
49 if (str[pos] == '\r' && str[pos + 1] == '\n' && (str[pos + 2] == ' ' || str[pos + 2] == '\t')) { \
51 while (str[pos + 1] == ' ' || str[pos + 1] == '\t') { \
112static bool php_mail_build_headers_check_field_name(
zend_string *
key)
133 if (php_mail_build_headers_check_field_name(
key) !=
SUCCESS) {
139 switch (error_type) {
149 zend_value_error(
"Header \"%s\" contains CRLF characters that are used as a line separator and are not allowed in the header",
ZSTR_VAL(
key));
159 smart_str_append(
s,
key);
160 smart_str_appendl(
s,
": ", 2);
162 smart_str_appendl(
s,
"\r\n", 2);
165 php_mail_build_headers_elems(
s,
key,
val);
188 php_mail_build_headers_elem(
s,
key, tmp_val);
192#define PHP_MAIL_BUILD_HEADER_CHECK(target, s, key, val) \
194 if (Z_TYPE_P(val) == IS_STRING) { \
195 php_mail_build_headers_elem(&s, key, val); \
196 } else if (Z_TYPE_P(val) == IS_ARRAY) { \
197 if (zend_string_equals_literal_ci(key, target)) { \
198 zend_type_error("Header \"%s\" must be of type string, array given", target); \
201 php_mail_build_headers_elems(&s, key, val); \
203 zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_value_name(val)); \
230 zend_value_error(
"The additional headers cannot contain the \"To\" header");
242 zend_value_error(
"The additional headers cannot contain the \"Subject\" header");
245 php_mail_build_headers_elem(&
s,
key,
val);
247 php_mail_build_headers_elems(&
s,
key,
val);
260 if (
s.s)
s.s->len -= 2;
275 size_t to_len, message_len;
276 size_t subject_len, i;
277 char *to_r, *subject_r;
294 }
else if (headers_ht) {
303 for (; to_len; to_len--) {
304 if (!isspace((
unsigned char) to_r[to_len - 1])) {
307 to_r[to_len - 1] =
'\0';
309 for (i = 0; to_r[i]; i++) {
310 if (iscntrl((
unsigned char) to_r[i])) {
323 if (subject_len > 0) {
324 subject_r =
estrndup(subject, subject_len);
325 for (; subject_len; subject_len--) {
326 if (!isspace((
unsigned char) subject_r[subject_len - 1])) {
329 subject_r[subject_len - 1] =
'\0';
331 for (i = 0; subject_r[i]; i++) {
332 if (iscntrl((
unsigned char) subject_r[i])) {
342 if (force_extra_parameters) {
344 }
else if (extra_cmd) {
364 if (subject_r != subject) {
371static void php_mail_log_crlf_to_spaces(
char *message) {
382static void php_mail_log_to_syslog(
char *message) {
390static void php_mail_log_to_file(
char *filename,
char *message,
size_t message_size) {
401static int php_mail_detect_multiple_crlf(
const char *hdr) {
404 if (!hdr || !
strlen(hdr)) {
410 if (*hdr < 33 || *hdr > 126 || *hdr ==
':') {
416 if (*(hdr+1) ==
'\0' || *(hdr+1) ==
'\r' || (*(hdr+1) ==
'\n' && (*(hdr+2) ==
'\0' || *(hdr+2) ==
'\n' || *(hdr+2) ==
'\r'))) {
422 }
else if (*hdr ==
'\n') {
423 if (*(hdr+1) ==
'\0' || *(hdr+1) ==
'\r' || *(hdr+1) ==
'\n') {
439PHPAPI bool php_mail(
const char *to,
const char *subject,
const char *message,
const char *headers,
const char *extra_cmd)
442 char *sendmail_path =
INI_STR(
"sendmail_path");
443 char *sendmail_cmd =
NULL;
444 char *mail_log =
INI_STR(
"mail.log");
445 const char *hdr = headers;
451#define MAIL_RET(val) \
452 if (ahdr != NULL) { \
457 if (mail_log && *mail_log) {
463 php_mail_log_crlf_to_spaces(logline);
466 if (!
strcmp(mail_log,
"syslog")) {
467 php_mail_log_to_syslog(logline);
480 php_mail_log_to_file(mail_log, tmp,
len);
482 zend_string_free(date_str);
493 char *line_sep =
PG(mail_mixed_lf_and_crlf) ?
"\n" :
"\r\n";
495 if (
PG(mail_x_header)) {
501 if (headers !=
NULL && *headers) {
510 if (hdr && php_mail_detect_multiple_crlf(hdr)) {
515 if (!sendmail_path) {
518 char *tsm_errmsg =
NULL;
535 if (extra_cmd !=
NULL) {
536 spprintf(&sendmail_cmd, 0,
"%s %s", sendmail_path, extra_cmd);
538 sendmail_cmd = sendmail_path;
552 sendmail = popen_ex(sendmail_cmd,
"wb",
NULL,
NULL);
558 sendmail =
popen(sendmail_cmd,
"w");
560 if (extra_cmd !=
NULL) {
561 efree (sendmail_cmd);
566 if (EACCES ==
errno) {
579 fprintf(sendmail,
"To: %s%s", to, line_sep);
580 fprintf(sendmail,
"Subject: %s%s", subject, line_sep);
582 fprintf(sendmail,
"%s%s", hdr, line_sep);
584 fprintf(sendmail,
"%s%s%s", line_sep, message, line_sep);
596#if defined(EX_TEMPFAIL)
597 if ((
ret != EX_OK)&&(
ret != EX_TEMPFAIL))
626 char *sendmail_path =
INI_STR(
"sendmail_path");
629 if (!sendmail_path) {
fprintf($stream, string $format, mixed ... $values)
mail(string $to, string $subject, string $message, array|string $additional_headers=[], string $additional_params="")
popen(string $command, string $mode)
strpbrk(string $string, string $characters)
PHPAPI zend_string * php_escape_shell_cmd(const zend_string *unescaped_cmd)
#define PHP_MAIL_BUILD_HEADER_CHECK(target, s, key, val)
zend_long php_getuid(void)
#define SKIP_LONG_HEADER_SEP(str, pos)
php_mail_header_value_error_type
PHPAPI bool php_mail(const char *to, const char *subject, const char *message, const char *headers, const char *extra_cmd)
PHPAPI zend_string * php_mail_build_headers(HashTable *headers)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
#define PHP_MINFO_FUNCTION
PHPAPI zend_string * php_format_date(const char *format, size_t format_len, time_t ts, bool localtime)
unsigned char key[REFLECTION_KEY_LEN]
struct _php_stream php_stream
#define php_stream_close(stream)
#define STREAM_DISABLE_OPEN_BASEDIR
#define php_stream_open_wrapper(path, mode, options, opened)
#define php_stream_write(stream, buf, count)
PHPAPI zend_string * php_basename(const char *s, size_t len, const char *suffix, size_t sufflen)
PHPAPI zend_string * php_trim(zend_string *str, const char *what, size_t what_len, int mode)
PHPAPI void php_syslog(int priority, const char *format,...)
PHPAPI char * GetSMErrorText(int index)
PHPAPI int TSendMail(const char *host, int *error, char **error_message, const char *headers, const char *Subject, const char *mailTo, const char *data, char *mailCc, char *mailBcc, char *mailRPath)
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
ZEND_API ZEND_COLD void zend_value_error(const char *format,...)
ZEND_API const char * zend_zval_value_name(const zval *arg)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define Z_PARAM_PATH_STR(dest)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_ARRAY_HT_OR_STR(dest_ht, dest_str)
#define Z_PARAM_PATH(dest, dest_len)
#define estrndup(s, length)
strcmp(string $string1, string $string2)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
ZEND_API uint32_t zend_get_executed_lineno(void)
ZEND_API const char * zend_get_executed_filename(void)
#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val)
#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val)
#define ZEND_HASH_FOREACH_END()
ZEND_API zend_string * zend_ini_str_ex(const char *name, size_t name_length, bool orig, bool *exists)
struct _zend_string zend_string
#define zend_string_equals_literal_ci(str, c)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable