Sendmail зависает, когда домен MX не существует - PullRequest
1 голос
/ 10 ноября 2010

Я использую PHP-библиотеку SwiftMailer для массовой отправки писем (в соответствии с CANSPAM и RFC).

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

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

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

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

--- ОБНОВЛЕНИЕ --- Я попробовал решения ниже, которые помогли мне сузить, в чем проблема. Кажется, это не вопрос того, существует ли запись MX. Проблема в том, что поиск в DNS требует вечного возврата. Есть ли простой способ установить время ожидания, поэтому, если DNS не вернется через <5 с, я могу двигаться дальше? </p>

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010
getmxrr(substr($email,strrpos($email,'@')+1),$hosts);
if (!$hosts)
    echo 'No MX record found';

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

if (!@fsockopen(substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5))
    echo 'No MX record found';
2 голосов
/ 10 ноября 2010

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

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}
1 голос
/ 10 ноября 2010

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

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

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

...