На нашем веб-сервере PHP mail()
команда постоянно зависает на некоторых адресах электронной почты, но подходит для большинства. Он зависает более 2 минут, к этому времени скрипт PHP потерял соединение с БД, поэтому он возвращает ошибку в браузер.
Мы используем Отправить почту и я вижу задержку 2:36 в журнале почты (/ var / log / maillog) для адреса электронной почты, вызывающего проблему:
Dec 9 11:24:00 liveserver sendmail[12666]: nB9BLOHa012666: to=***blanked_out***, delay=00:02:36, mailer=esmtp, pri=31326, dsn=4.4.3, stat=queued
Воспроизвести проблему легко. Я могу отправить электронное письмо, которое хочу протестировать, с помощью следующей команды:
echo "Test message from sendmail." | sendmail -ffromtest@test.com problem@problememail.com
Большинство адресов электронной почты приводят к тому, что команда возвращается в течение 1 секунды (включая недопустимые адреса электронной почты). Но проблемный адрес электронной почты зависает на 2:36.
Примечание: Сейчас у нас в очереди 550 сообщений, но это число не превышает нормы (find /var/spool/mqueue -type f -name qf\* -print|wc -l|tr -d ' '
).
Возможно, это проблема с DNS, попробуйте покопать проблему mail.com.
Вы также можете попробовать strace и посмотреть, что делает процесс:
прикрепить к процессу:
strace -ff -s 512 -v -p pid
запустите процесс с помощью strace:
strace -ff -s 512 -v sendmail -ffromtest ...........
добавьте -o ~ / sendmail.strace для вывода в файл.
-ff заставляет его следовать за вилками
Обычно задержки электронной почты связаны с проблемами DNS.
Попробуйте запустить:
host -t mx problemdomain.com
Если это не проблема, используйте sendmail -bi -v
чтобы получить больше отладочных данных.
Чтобы ответить на свои вопросы (если это будет полезно другим):
Почему sendmail не помещает сообщение в очередь и не возвращает его немедленно, чтобы PHP мог продолжить работу?
Это должно сработать. Если это не так, это означает, что настройка DNS-сервера нарушена. Обычно поиск в DNS выполняется быстро - запрос на несуществующий MX / домен должен получить ответ NXDOMAIN в течение миллисекунд. Не следует ждать так долго - эта проблема, вероятно, вызывает другие проблемы со многими программами, например sshd и NFS?
Есть ли у кого-нибудь советы по устранению проблемы?
Попробуйте запустить:
host -t mx problemdomain.com
Затем запустите его снова, используя googledNS (IP-адрес 8.8.8.8) вместо текущей службы DNS:
host -t mx problemdomain.com 8.8.8.8
Если есть разница, это означает, что текущая настройка DNS-сервера нарушена. Проверьте серверы имен в /etc/resolv.conf и, возможно, обсудить проблему с хостинговой компанией или с тем, кто предоставляет серверы имен, которые вы используете?
В качестве временного решения попробуйте добавить тайм-аут DNS в /etc/resolv.conf:
timeout: n
sets the amount of time (in seconds) the resolver will wait for a response from a remote name server before retrying the query via a different name server.
Есть ли у кого-нибудь советы о том, как исследовать проблемный адрес электронной почты, чтобы понять, почему он вызывает задержку?
Пытаться dig
, служебную программу поиска DNS и отслеживание кода состояния. например NOERROR для успеха, NXDOMAIN для не найденного и т. Д .:
dig problemdomain.com
Пытаться nslookup
, программа для запроса серверов имен в Интернете:
nslookup problemdomain.com
Попробуйте рассчитать время sendmail
командовать и использовать -bi -v
чтобы получить больше информации:
time echo "This is a test message" | /usr/lib/sendmail -bi -v -ftest@test.com test@problemdomain.com