2010-11-10 3 views
1

Я использую библиотеку SwiftMailer PHP для массового отправки писем (следуя CANSPAM и RFC).Sendmail зависает, когда домен MX не существует

Все работает нормально, пока я не перейду через домен, у которого нет соответствующей записи MX в DNS. В этот момент мой скрипт просто зависает - я предполагаю, что это потому, что sendmail не вернулся. Это может продолжаться всего несколько минут, или это может продолжаться много часов.

Я подтвердил, что адреса, которые мой скрипт (косая черта sendmail) зависают, - это те, у которых нет записи DNS MX. Все остальное отправляет штраф.

Есть ли способ проверить, существует ли DNS MX внутри PHP, прежде чем я попытаюсь отправить сообщение? Является ли это масштабируемым (т. Е. Будет ли дополнительный поиск в DNS действительно замедлить меня, или это будет нормально b/c, тогда MX кэшируется локально для sendmail для использования при доставке сообщения)?

Спасибо за вашу помощь

--- UPDATE --- Я попытался ниже решения, которые помогли мне сузить, в чем проблема. Кажется, дело не в том, существует ли запись MX. Проблема в том, что поиск DNS навсегда возвращается. Есть ли простой способ установить таймаут, так что если DNS не вернется в < 5s, я могу двигаться дальше?

ответ

3
getmxrr(substr($email,strrpos($email,'@')+1),$hosts); 
if (!$hosts) 
    echo 'No MX record found'; 

Вы также можете попробовать это, чтобы предотвратить блокирование (нет опции для настройки getmxrr таймаута):

if ([email protected](substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5)) 
    echo 'No MX record found'; 
+0

спасибо! это помогло; теперь кажется, что проблема не в том, существует ли она или нет, это отставание в возвращении этого значения. Обновленный вопрос выше, любые предложения о том, как сделать этот тайм-аут запроса после 5 секунд? –

+0

См. Мое дополнительное предложение – stillstanding

+0

Так что, не попробуете просто открыть сокет-соединение с доменом электронной почты? Моя проблема в том, что (часто) я отправляю на onedomain.com (который может иметь или не иметь запись A), но MX для two.onedomain.com. Поэтому, когда я открываю сокет, он все равно не будет (точно) сказать мне, нужно ли отправлять это письмо (это говорит мне, что есть запись A для onedomain.com, где я действительно хочу знать [с коротким таймаутом, установленным на поиск MX], если для этого домена есть запись MX). Правильно ли я думаю, что эти два не одно и то же? –

2

Вы можете использовать getmxrr:

if (getmxrr($hostname, $mxhosts)) { 
    // MX record exists 
    var_dump($mxhosts); 
} 
+0

спасибо! PLS см. мое обновление по вопросу - любые мысли? –

+0

'fsockopen' будет делать трюк. См. [Ответ на вопрос выше] (http://stackoverflow.com/questions/4148135/sendmail-hangs-when-domain-mx-doesnt-exist/4148273#4148273). – netcoder

1

поиск DNS масштабируется на повторные запросы. Ближайший DNS-сервер будет кэшировать просмотренные значения за период. Использование локального сервера кеша DNS может повысить производительность, но будет использовать больше памяти (немного или много в зависимости от программного обеспечения и количества адресов, кэшированных.

Если я правильно помню RFC, то хосты с записью A должны быть действительны адреса электронной почты также, но домены с только записью A могут не иметь почтового сервера по этому адресу. (То же самое относится к объектам MX, но это должно быть значительно реже и обычно временным.)

Надлежащие почтовые службы должен сгенерировать почту и повторить доставку с течением времени.Если ваш sendmail не делает этого, то вы должны проверить его конфигурацию. Вам также необходимо будет рассмотреть, что делать с адресами электронной почты, на которые не может быть доставлено электронное письмо.

Смежные вопросы