Когда я выполняю свой скрипт электронной почты через браузер, возвращается фатальная ошибка (если я не увеличиваю время выполнения, то он будет работать нормально, а не решение, которое я ищу). Электронная почта отправляется tho , но она берет навсегда (5 минут в среднем), чтобы прибыть (в мой почтовый ящик)!
(Учитывая, что через командную строку он отлично работает, я думаю, что SMTP на php.ini, безусловно, хорошо настроен.)
Таким образом, это код, выполняемый запросом браузера:
<?php mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>'); ?>
и когда я запускаю это же (действительно ли это то же самое? Я начинаю сомневаться в себе) код через командную строку:
php -r "mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>');"
он отлично работает! Скрипт работает, он останавливается, и сообщение электронной почты приходит мгновенно (2/3 секунды).
Итак, что может вызвать эту разницу и как ее исправить? Есть идеи?
Заранее спасибо.
[править] Дополнительная информация:
– машина – это окна
– сервер – localhost
– php.ini одинаково для браузера и для экземпляра cli
[Edit2]
Спасибо всем, что пытались угадать, в чем была проблема. Я поставил вопрос, скажем, что у кого-то была проблема раньше и что-то было известно. Учитывая, что ничего особенного не появилось, и ни одно из предложений действительно не сработало, я решил принять тот, который позволил мне сделать больше выводов о проблеме … +1 Для всех ваших полезных знаний / мыслей (/ догадок) 🙂
Я предположил, что некоторые кошки, но я использовал для linux и на окнах, которые я могу догадаться:
Учитывая это примечание из http://php.net/manual/en/function.mail.php , кажется очень вероятным, что проблема связана с MTA, а не с PHP напрямую:
Реализация Windows mail () во многом отличается от реализации Unix. Во-первых, он не использует локальный двоичный код для составления сообщений, а работает только с прямыми сокетами, что означает, что MTA необходимо прослушивать в сетевом сокете (который может либо на локальном, либо на удаленном компьютере).
Возможно, это имеет какое-то отношение к тому, как MTA отвечает конкретному пользователю или правилам брандмауэра конкретного пользователя для исходящих почтовых подключений на вашем компьютере. Можете ли вы запустить командную строку как пользователь веб-сервера, а не самостоятельно? Если да, то это заново воссоздает проблему из командной строки?
Как насчет того, что веб-сервер выполняет PHP-версию командной строки, а не анализируемый PHP-файл? (Например, возможно, вы можете запустить пакетный скрипт через CGI.) Решает ли эта проблема?
(Извините, что это больше догадок, чем определенные ответы.)
Просто чтобы быть ясным: php-экземпляр, используемый сценарием, такой же, как тот, который используется кодом командной строки?
Многие веб-хосты используют smtp-relay, которые собирают кучу писем и отправляют их сразу, поэтому это не будет странным поведением, если ваша почта опаздывает. Однако длительное время выполнения не является нормальным.
Прежде чем отправлять почту в скрипте, обязательно распечатайте ini_get()
переменных SMTP
, smtp_port
и sendmail_from
и будьте уверены, что это рабочие значения. PHP, работающий в Windows, не имеет возможности отправлять почту через Sendmail, и все, что захочет PHP-разработчики, это в лучшем случае отрывочно.
Мне всегда нравится проверять почту через telnet, поэтому я могу проверить, не сообщает ли сервер ошибке, которая не возвращается должным образом клиенту:
c:\> telnet smtp.domain.com 25 220 smtp.domain.com ESMTP Postfix helo mailtest 250 smtp.domain.com mail from: user@local.com 250 2.1.0 Ok rcpt to: user@remote.com 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> from: user@local.com to: user@remote.com subject: test mail this is a test message . 250 2.0.0 Ok: queued as 42AD8364FE0E quit 221 2.0.0 Bye
Попробуйте указать имя пользователя и пароль для «От» почтового идентификатора. поэтому он может аутентифицироваться и быстро отправлять почту.
Вы пробовали PHP-почерк ?
В моих наблюдениях он отправляет письма в течение нескольких секунд. Ниже приведен пример быстрого изучения того, как использовать класс почтовой программы php.
include "class.phpmailer.php"; $msg="Hello! This is a test..." $mail=new PHPMailer(); $email="someone@friend.com"; //person who receives your mail $mail->IsSMTP(); $mail->Host = "localhost"; $mail->SMTPAuth = true; $mail->Username = "admin@example.com"; //your mail id $mail->Password = "sdfsd441"; //password for your mail id $mail->SetFrom('admin@example.com', 'admin'); //from address $mail->AddAddress($email); $mail->Subject ="Test Mail"; $mail->Body = $msg; $mail->IsHTML(true); $mail->MsgHTML($msg); $mail->Send();
РЕДАКТИРОВАТЬ :
В руководстве по PHP они заявили вот так:
Реализация Windows mail () во многом отличается от реализации Unix. Во-первых, он не использует локальный двоичный код для составления сообщений, а работает только с прямыми сокетами, что означает, что MTA необходимо прослушивать в сетевом сокете (который может либо на локальном, либо на удаленном компьютере).
так что может вызвать задержку? Я думаю, эта ссылка может вам помочь.
Мое первое предположение было бы в том, что версия браузера вашей рассылки уже имеет контекст или соединения, готовые для отправки. Напротив, прямое (php -r) выполнение должно загрузить контекст почтовой рассылки.
Чтобы подтвердить эту идею, вы можете создать цикл для отправки 10 писем и проверить почту после первого намного быстрее.