Re: mail() on windows

php.internals

Frank M. Kromann

22 years ago
These extra parameters to the TSendMail function are used by imap_mail(). To use this function you need to load the imap extension but you get a few more options that are not available in the standard mail function. See http://php.net/imap_mail for more information. - Frank
> sorry in advance for the length, formatting and possible redundancy of > this message. > > Anyway, on Windows, leaving "sendmail_from" blank and setting a "From:" > header in the extra headers parameter doesn't work. > > test.php: > <?php > mail('example@php.com','subject','body',"From: me@example.com\r\n"); > /* > Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" > header missing in C:\dev\quiktests\test.php on line 3 > */ > > ??--> http://bugs.php.net/bug.php?id=28976 > there are also a couple user notes on the mail manual page to the
effect
> of "use ini_set()", but that seems messy, especially for distributed > scripts to do a check everytime they send mail(): > if(PHP_OS == 'Win' && empty(ini_get("sendmail_from")){ > ini_set("sendmail_from", $tempFromAddress); > } > > > I don't know C (or any cvs/patch tools), but here's what I think is
going on:
> > in ext/standard/mail.c we find the following code (notice the last > argument to TSendMail() is NULL): > > [code] > .... > PHPAPI int php_mail(char *to, char *subject, char *message, char
*headers,
> char *extra_cmd TSRMLS_DC) { > ..... > 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) == FAILURE) { > .... > [/code] > > > unfortunately, in win32/sendmail.c we find this: > > [code] > .... > PHPAPI int TSendMail(char *host, int *error, char **error_message, > char *headers, char *Subject, char *mailTo, char *data, > char *mailCc, char *mailBcc, char *mailRPath) > { > .... > /* Fall back to sendmail_from php.ini setting */ > 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_lc); > } > *error = W32_SM_SENDMAIL_FROM_NOT_SET; return FAILURE; > } > .... > [/code] > > it seems mailRPath will always be NULL and "sendmail_from" will always
be
> "fallen back" to, and thus you get an error. > > maybe, probably, i'm missing something, but at the very least, the
error

Unnamed Person

22 years ago
ok thanks. but still, how is it that mail('example@php.com','subject','body',"From: me@example.com\r\n"); should produce an error message stating "custom "From:" header missing"? and is there any reason the custom header can't be parsed, and if a "From:" header is found, to use that instead of sendmail_from value? thanks again. On Wed, August 18, 2004 6:11 pm, Frank M. Kromann said: