Есть ли ошибка в функции PHP mail ()? - PullRequest
9 голосов
/ 03 июня 2011

Я надеюсь, что кто-то сможет мне помочь, так как я не знаю, что является причиной проблемы. Наш веб-сайт имеет форму обратной связи с полями для имени, адреса электронной почты, имени ребенка, идентификатора ребенка и сообщения.

Когда форма отправляется, php-код на стороне сервера проверяет поля формы, и, если все хорошо, использует встроенную функцию php mail () для отправки 2 электронных писем.

Электронная почта 1 отправляется в почтовый ящик на хост-сервере Exchange, содержащий значения в полях формы.

Электронное письмо 2 отправляется лицу, отправляющему форму, с благодарностью - мы скоро свяжемся с вами.

Для электронной почты 1 заголовки From, Reply-To и Return-Path устанавливаются на адрес электронной почты, введенный в форме, а параметр To в функции mail () является адресом электронной почты входящей почты размещенного обмена. сервер.

Для электронной почты 2 заголовки From, Reply-To и Return-Path устанавливаются на адрес электронной почты входящей почты на размещенном сервере обмена, а параметр To в функции mail () - это адрес электронной почты, введенный в форма.

Хост веб-сайта имеет правильно настроенные записи MX, PTR, SPF и TXT, позволяющие отправлять электронные письма на адрес электронной почты, входящий в почтовый ящик хост-сервера обмена, и с него. Хост веб-сайта использует QMail в качестве службы SMTP, которая фактически отправляет электронные письма, и во всех тестах QMail получает успех при отправке электронной почты 1 и 2. Функция mail () не выдает ошибку.

Локальные тесты проводились с IE8, Chrome и FF3.6.17. Код не был изменен между тестами, показывающими эту проблему.

Во всех тестовых случаях электронное письмо 2 (обратно человеку, отправляющему форму) отправляется просто отлично. Электронная почта 1, с другой стороны, работает только периодически. Общая схема такова, что в первый раз, когда контактная форма используется с каждым отдельным адресом электронной почты в форме, электронное письмо отправляется нормально, а заголовки и - верны.

Во второй раз, когда форма контакта используется с ранее использованным адресом электронной почты в форме, параметру Кому присваивается адрес электронной почты в форме, все заголовки пустые, несмотря на неправильный адрес электронной почты Кому Электронная почта

не получено. Персонал службы поддержки хоста веб-сайта, возможно, обнаружил еще один потенциальный симптом, который заключается в том, что после очистки файлов cookie все письма 2 прошли нормально. Тем не менее, страница не использует куки в отношении формы. Наконец, я попытался снова некоторое время (30 минут?) После того, как электронная почта 2 не прошла, затем сработала другая попытка, после которой электронная почта 2 облажалась, как описано выше.

Есть ли известная ошибка с функцией php mail () по этим направлениям? Существует ли максимальная частота использования mail ()? Я в недоумении, почему код иногда работает, а иногда нет. Персонал сайта также в растерянности. Попытка решить эту проблему в Google, похоже, поднимает форумы людей, которые говорят, что используют разные модули (Swift Mailer, PHPMailer, Pear Mail и т. Д.), Но поскольку веб-сайт работает, я опасаюсь, что перестройка кода автоматической рассылки

вносить ошибки, помимо описанных выше.

... отредактировано 6jun11 ...

извините, я не знал, что могу отредактировать свое сообщение ...

Вот самый подходящий код:

function UserToSiteEmail( $name, $fromEmail, $message, $kidID, $kidName )
{
    $subject = "Face of Kinder - contact us";
    $headers = GetEmailHeaders($fromEmail);
    $imageFilename = constant("URL_ROOT")."/kidimages/".$kid->ImageFilename;
    $profileUrl = constant("URL_ROOT")."/profile.php?k=".$kid->KidID;
    $body = file_get_contents("EmailTemplates/ContactUs.html");
    $body = str_replace("#FromName#",$name,$body);
    $body = str_replace("#FromEmail#",$fromEmail,$body);
    $body = str_replace("#KidName#",$kidName,$body);
    $body = str_replace("#KidID#",$kidID,$body);
    $body = str_replace("#Message#",$message,$body);
    $body = str_replace("#SiteRoot#",constant("URL_ROOT"),$body);
    return mail(constant("FROM_EMAIL"),$subject,$body,$headers);
}

function GetEmailHeaders( $fromEmail )
{
    $headers = "From: Face of Kinder <" . $fromEmail . ">" . PHP_EOL;
    $headers .= "Reply-To: " . $fromEmail . PHP_EOL;
    $headers .= "Return-Path: " . $fromEmail . PHP_EOL;
    $headers .= 'MIME-Version: 1.0' . PHP_EOL;
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL;

    return $headers;
}

Функция UserToSiteEmail () использует данные из формы обратной связи, где параметром $ fromEmail является адрес электронной почты, введенный в форму. Из того, что Rackspace мог найти в журналах QMail, было то, что, когда отправляется 2-е использование того же адреса электронной почты в форме контакта, электронное письмо в форме заканчивается в поле «Кому», а не в заголовках, и адрес почтового ящика не указывается. не показывать нигде (даже заголовки - то есть, это не поменялось). Это несмотря на то, что один и тот же код правильно помещает электронную почту формы в заголовок и адрес электронной почты в поле «Кому» при первой отправке формы (для браузера).

Я могу добавить сторону HTML формы, если необходимо, но с точки зрения ее обработки, после того, как форма отправлена ​​обратно себе, после проверки и отправки по электронной почте, php перенаправляет на страницу благодарности. Я не уверен, как переменные GET & POST сохранятся после страницы благодарности, так как единственный способ вернуться на страницу - это снова щелкнуть ссылку для контактной формы. Чтобы увидеть текущий процесс (без проблем - поскольку он, кажется, только появляется при использовании домена почтового ящика), вот ссылка на страницу со ссылкой «Свяжитесь с нами» в нижнем колонтитуле: http://www.faceofkinder.com/home.php.

Я полагаю, что журнал QMail, указывающий на сбой, тоже может помочь ...

342812-web2 qmail-queue-handlers[1147]: Handlers Filter before-queue for qmail started ...
342812-web2 qmail-queue-handlers[1147]: from=
342812-web2 qmail-queue-handlers[1147]: to=orionculver@b-street.co.uk
342812-web2 qmail-queue-handlers[1147]: hook_dir = '/var/qmail//handlers/before-queue'
342812-web2 qmail-queue-handlers[1147]: recipient[3] = 'orionculver@b-street.co.uk'
342812-web2 qmail-queue-handlers[1147]: handlers dir = '/var/qmail//handlers/before-queue/recipient/orionculver@b-street.co.uk'
342812-web2 qmail-queue-handlers[1147]: starter: submitter[1148] exited normally
342812-web2 qmail: 1307092428.798059 bounce msg 18353656 qp 1147
342812-web2 qmail: 1307092428.798116 end msg 18353656
342812-web2 qmail: 1307092428.798338 new msg 18353663
342812-web2 qmail: 1307092428.798366 info msg 18353663: bytes 4902 from <> qp 1148 uid 2522
342812-web2 qmail: 1307092428.800937 starting delivery 2481: msg 18353663 to remote orionculver@b-street.co.uk
342812-web2 qmail: 1307092428.801071 status: local 0/10 remote 2/20
342812-web2 qmail-remote-handlers[1149]: Handlers Filter before-remote for qmail started ...
342812-web2 qmail-remote-handlers[1149]: from=
342812-web2 qmail-remote-handlers[1149]: to=orionculver@b-street.co.uk
342812-web2 qmail: 1307092430.526801 delivery 2481: success: 98.129.184.131_accepted_message./Remote_host_said:_250_OK_BD/F0-16184-DC5A8ED4/
342812-web2 qmail: 1307092430.526909 status: local 0/10 remote 1/20
342812-web2 qmail: 1307092430.526938 end msg 18353663
342812-web2 qmail: 1307092430.576988 delivery 2480: success: 98.129.184.131_accepted_message./Remote_host_said:_250_2.0.0_Ok:_queued_as_6D/F0-16184-DC5A8ED4/
  • О8

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Основываясь на вашем описании, я подозреваю, что проблема может заключаться в конце строки ваших заголовков.

Из руководства:

дополнительные_заголовки (необязательно)

... Несколько дополнительные заголовки должны быть разделены a CRLF (\ r \ n).

... Примечание: если сообщения не получены, попробуйте использовать только LF (\ n). Некоторые бедные качественные агенты пересылки почты Unix заменить LF на CRLF автоматически (что приводит к удвоению CR, если CRLF используемый). Это должно быть последним средством, как это не соответствует »RFC 2822.

Я не уверен, что вы определили как PHP_EOL, но вы можете попробовать только CRLF или LF.

0 голосов
/ 03 июня 2011

Похоже, что вы не очищаете некоторые записи $_GET или $_POST между отправками.

Можете ли вы скопировать / вставить нарушающий код для проверки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...