Hi David,
mail()
and imap_mail() both call's the internal function TSendMail(). This
is the function that generates the error. the imap version does some
additional chacks for headers. I'll take a look to see if we can make the
error message more informative.
- Frank
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:
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 "useini_set()
", but that seems messy, especially for distributed
scripts to do a check everytime they sendmail()
:
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
message ("custom "From:" header missing") or the documentation could
be
altered.thanks.