Xpoint
   [напомнить пароль]

AnyEvent::SMTP::Client проблема с MX

Метки: [без меток]
2012-04-18 09:16:57 [обр] Евгений Седов aka KPbIC(9/187)[досье]
сообщение промодерировано
Если не указать хост, вылезает ошибка "Неправильный аргумент". Есть подозрение, что доменная часть email'а не резольвится как надо, поэтому нет коннекта. Никто не сталкивался с подобным?
#! /usr/bin/perl

use strict;
use warnings;

use AnyEvent::SMTP::Client 'sendmail';

sendmail
#   host => 'smtp.example.org',
    from => 'script@example.org',
    to   => 'test@example.org',
    data => 'test',
    cb   => sub {
        if (my $ok = shift) {
            warn "Ok\n";
        }
        if (my $err = shift) {
            warn "Fail\n";
        }
    }
;
AnyEvent->condvar->recv;
спустя 6 часов [обр] Thirteensmay(0/157)[досье]
Может конечно глупость скажу, но откуда известно что у example.org есть smtp? для этого по моему и надо указывать хост, по крайней мере я сколько с клиентами работал, на перле с Net::SMTP_auth, да и в других средах, везде указание хоста требуется.
спустя 38 минут [обр] Евгений Седов aka KPbIC(9/187)[досье]
Если указан хост, то модуль должен коннектиться к хосту. Если хост не указан, то сначала модуль должен получить список MX для домена получателя, и коннектиться к хостам из списка. Это написано в description модуля:
Asyncronously connect to SMTP server, resolve MX, if needed, then send HELO => MAIL => RCPT => DATA => QUIT and return responce
спустя 1 час 17 минут [обр] Thirteensmay(0/157)[досье]
сообщение промодерировано
Ну загадочно, я всегда со "своим" сервером работал, единственно что, а этот ваш example.org МХ записи вообще отдает?
спустя 1 минуту [обр] Роман Чемисов(36/350)[досье]
Евгений Седов aka KPbIC[досье]
Скажите версию модуля и покажите, пожалуйста, оригинальный текст ошибки.
спустя 30 минут [обр] Евгений Седов aka KPbIC(9/187)[досье]

Thirteensmay[досье] Я тоже на свой сервер посылаю. И, естественно, MX есть, правильно отдается, и на хосте работает мой постфикс. Пробема возникает еще до общения с сервером - с клиента никакие пакеты на 25-й порт не уходят. Скорее всего, неприятность возникает при коннекте, из-за неправильно определенного удаленного хоста или при попытке получить адрес хоста по имени.

Роман Чемисов[досье] Версия берется из $AnyEvent::SMTP::VERSION а там our $VERSION = '0.08'. Оригинальный текст ошибки в английской консоле: Invalid argument.

спустя 1 день 19 часов [обр] Евгений Седов aka KPbIC(9/187)[досье]

Проблема была в следующем: AnyEvent::SMTP::Client сам не резольвит, а использует для этого AnyEvent::DNS. Функция resolve() этого модуля представляет каждую MX-запись в виде ссылки на массив:

[$domain, $type, $class, $ttl, $pref, $smtp_server]

То есть, имя SMTP-сервера находится на 5-ом индексе. Но в модуле AnyEvent::SMTP::Client имя сервера выбирается из 4-го индекса:

$dns->resolve( $domain => mx => sub {                                                                                                                                                                                
    @_ = map $_->[4], sort { $a->[3] <=> $b->[3] } @_;
    ...

К сожалению, я не догадался посмотреть в баг-лист AnyEvent::SMTP::Client, где эта проблема описана уже неделю назад. Понятное дело, что и сортировка производится неправильно, не по приоритету. Но я еще заметил, что и TTL возвращается странное.

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

Powered by POEM™ Engine Copyright © 2002-2005