Регистрация...

Eserv Forum / E2 / Eserv 2 support / Падение скорости отправки (через SMTPSend) больших сообщений

imported // (v1)
Продукты и услуги Скачать Документация Купить Поддержка Форумы Партнёрам Статьи О компании
Eserv v2.99 build 3521
SMTPsend v1.9998

Заметил иттересную особенность — небольшие сообщения (ну скажем до 30кб) уходят на хорошей скорости (смотрю в хвосте файла *.smtp, да в принципе и визуально заметно при отправке). С увеличением размера скорость падает просто до неприличия (Send bps=9292). Пробовал отправить такой же большой файл через Аутлук (с той же машины, где и EServ, но мимо его) — все идет со свистом. Это как-то победимо? В запуске SMTPSend вроде ничего лишнего: agents\smtpsend.exe -dw -z -s %Server% -p 2500 -helo domainname -ehlo -u %Login% -w %Password% -o temp\%TempFile%.smtp.
К провайдеру/хостеру скорее всего проблема отношения не имеет — аналогичный результат у троих протестированных.
 
Комментарии к этой версии (14.07.2008 17:52) [~Moor] 8ee89e55
АвторДатаТекстtags
ac14.07.2008 19:18
Это может зависеть от размера буфера отправки (в smtpsend). По умолчанию он несколько килобайт, но в некоторых WAN роутеры настроены так, что Windows лучше с ними работает при отправке 30-60кбайтными кусками. Наблюдал такое несколько лет назад, когда eserv.ru в Штатах хостился.

Сейчас под рукой исходников старого smtpsend нет, и я не вспомню, какой командой буфер подкрутить Попробуйте SmtpSend4 из Eserv/3, там по умолчанию больше.
imported
Moor16.07.2008 08:40
Спасибо, в выходные обязательно попробую — в рабочее время экспериментировать с исходящей почтой не представляется возможным.
Пользуясь доброжелательной обстановкой на форуме рискну задать в таком случае несколько вопросов по SMTPSend4:

    1. Какой DNS нужно указать в -s ?
    2. для чего служит ключ -ir ?
    3. для чего служит ключ -sm ?
    4. для чего служит ключ -dc ?
    5. для чего служит ключ -s3 ?
    6. для чего служит ключ -sh ?
    7. для чего служит ключ -ll ?
    8. Можно ли его настроить, чтобы он работал как и старый SMTPSend, через SMTP провайдера, ну или какой режим для него будет проще, надежнее, быстрее? Может быть можно обойтись малой кровью, слегка подправив командную строку (см. первый пост)?

Прошу прощения за ламерские вопросы, в этой области я не специалист, а решить проблему с отправкой почты надо. Если все это где-то подробно описано — ткните носом пожалуйста, с удовольствием прочту и изучу.
imported
pig16.07.2008 09:24
  1. Ближайший надёжно работающий. Обычно провайдерский.
  2. Немедленный возврат письма по ошибке, которая в принципе может быть временной (например, 4xx в ответе сервера или сервер вообще недоступен)
  3. Отправлять всю почту на указанный (обычно провайдерский) сервер
  4. Отключить проверку работоспособности DNS
  5. Перевод: отправлять на A (на хост), если все MX отказываются принимать письмо (по умолчанию отправка на хост используется только если список MX пуст)
  6. Альтернативный (обычно провайдерский) сервер — если все отказали, попробовать отправить на него
  7. Это для "тройки", вам не надо
  8. Можно:
  9. agents\smtpsend4 -dw -dc -z -sm %Server% -p 2500 -helo domainname -ehlo -u %Login% -w %Password% -o temp\%TempFile%.smtp
imported
Moor16.07.2008 11:42
pig
Огромное спасибо ! В выходные поэкспериментирую. Результат Вас интересует (по изменению скорости)? Могу сообщить
imported
ac16.07.2008 11:51
Да, конечно, будет интересно узнать, правильно ли я локализовал источник проблемы.
imported
Moor19.07.2008 14:40
Результат не порадовал. Командой agents\smtpsend4 -dw -dc -z -sm %Server% -p 2500 -helo domainname -ehlo -u %Login% -w %Password% -o temp\%TempFile%.smtp отправилось так же медленно (Send bps=2063) как и простым SMTPSend. Тогда в меру своих неглубоких познаний в этой области попытался настроить отправку напрямую. С командной строкой agents\smtpsend4.exe -dw -z -s dns_server_name -sh %Server% -p 25 -helo my_domain_name -ehlo -u %Login% -w %Password% -o temp\%TempFile%.smtp отправляется со свистом (Send bps=25508). Поправьте, пожалуйста, если я здесь чего-то лишнего наблудил. По моим рассуждениям при невозможности отправить напрямую письмо будет отправлено через почтовый сервер моего хостера (-sh %Server% -helo my_domain_name -ehlo -u %Login% -w %Password%) — эти ключи я оставил именно с этой целью. Только вот почту мой хостер принимает по 2500-порту, а попытка отправлять через этот порт заканчиваются вот чем:

<?xml version='1.0' encoding='windows-1251'?>
<?xml-stylesheet href='atom.xsl' type='text/xsl'?>
<feed version='0.3' xmlns='http://purl.org/atom/ns#' xmlns:s='http://www.eserv.ru/smtpsend/log'>
<title>SMTPSEND v4.43 log</title>
<modified>2008-07-19T14:08:44Z</modified>
<author><name>smtpsend4 at </name></author>
<!— -dw -z -s dns_server_name -sh smtp_server_name -p 2500 -helo my_domain_name -ehlo -u my_login -w my_password -o temp\10.1.180869781.smtp -->
<s:Dns>Checking DNS settings.
Server: dns_server_name
DNS settings seem OK</s:Dns>
<entry>
<link rel='alternate' type='message/rfc822' href='sender_address!178775359!1' />
<id><![CDATA[000b01c8e98b$02423b00$0200a8c0@my_name]]></id>
<author><name>my_name</name><email>recipient_address</email></author>
<summary>To: recipient_address </summary>
<title></title>
<s:to>recipient_address</s:to>
<s:mx>MX: mxs.mail.ru</s:mx>
<content type='text/plain'><![CDATA[
]]></content>
<s:ior>Error: 10060 <s:log>2 </s:log>
</s:ior>
<s:host>Send to smarthost: smtp_server_name</s:host>
<content type='text/plain'><![CDATA[
220 mars.neolocation.net ESMTP Exim 4.66 Sat, 19 Jul 2008 14:09:07 +0300
EHLO my_domain_name
250-mars.neolocation.net Hello my_domain_name [IP_ADDRESS]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN CRAM-MD5
250-STARTTLS
(TLS supported)
250 HELP
MAIL FROM:<sender_name>
250 OK
RCPT TO:<recipient_name>
550 relay not permitted
]]></content>
<s:ior>Error: 550 <s:log>2 </s:log>
</s:ior>
<s:err>ERR:10060 </s:err>

<s:result>FAILED. Error code: 10060 </s:result>
</entry>
<s:exit>Exit OK</s:exit></feed>

Как я понял, при невозможности отправить напрямую была предпринята попытка отправить через почтовый сервер хостера, но она тоже завершилась ошибкой. Т.е. через 2500 порт не уходит ни напрямую, ни через SMTPserver. А хотелось бы иметь возможность при каких-то затыках с прямой отправкой отправить хоть по-старинке через SMTPserver. Что подкрутить в командной строке, пожалуйста подскажите если не трудно! И вообще как можете прокомментировать такую ситуацию с разницей в скорости отправки (имея ввиду, что через Аутлук тоже уходит со свистом)?
imported
pig19.07.2008 17:35
С портами подкрутить не получится, ключ -p может быть только один.
А в отношении скорости — видимо, провайдерский сервер начинает тормозить на больших письмах. Интересно, как Outlook письма на него загоняет. Может, использует pipelining на полную катушку?
imported
ac19.07.2008 18:38
Outlook отправляет также как smtpsend4, это видно по его логам. Если у него на тот же сервер получается быстрее, то это либо случайность, либо он просто неправильную скорость показывает (что не удивительно, учитывая как он "далёк от народа", в смысле от нижнего сетевого уровня).
imported
Moor21.07.2008 11:32
pig пишет:
С портами подкрутить не получится, ключ -p может быть только один

Спасибо, понял. Ладно, посмотрим как он напрямую работать будет. Но командная строка у меня правильная-то хоть, аль чего подкрутить надо? Если письмо нескольким получателям, это в нем грамотно отрабатывается?

ac пишет: Outlook отправляет также как smtpsend4, это видно по его логам. Если у него на тот же сервер получается быстрее, то это либо случайность, либо он просто неправильную скорость показывает (что не удивительно, учитывая как он "далёк от народа", в смысле от нижнего сетевого уровня).

Outlook по-моему скорость вообще не показывает (может упустил чего?), я по часам засекал и потом высчитывал. Случайностью здесь не пахнет, эксперимент повторен не раз. Конечно такой скорости как у smtpsend4 при отправке напрямую нет, этот шпарит на полную катушку, но разница заметна. Если интересуют конкретные цифры — могу на досуге (в конце рабочего дня) повторить и доложить результаты.
imported
pig21.07.2008 12:39
Командная строка нормальная. Единственно — из-за особенности хостерского почтового сервера можно убрать всё, что с ним связано (-sh, -ehlo, -u, -w). Тем более, что авторизация в таком режиме всё рано не работает, это по логу видно.
imported
Moor24.07.2008 17:44
pig пишет: Единственно — из-за особенности хостерского почтового сервера можно убрать всё, что с ним связано (-sh, -ehlo, -u, -w). Тем более, что авторизация в таком режиме всё рано не работает, это по логу видно.

Да, это само собой разумеется.

Наконец-то выбрал время повторить тестирование скорости отправки для разных вариантов. Было создано одно письмо размером 2.089.739.
Отправлялось следующими способами (последовательность сохранена):

  1. Через SMTPsend4 напрямую на сервер получателя: 2мин. 07 сек.
  2. Через Outlook на SMTP-сервер хостера: 3 мин. 29 сек.
  3. Через SMTPsend4 на SMTP-сервер хостера: 8 мин. 38 сек.
Так что отправляю только первым способом. Пока все без сюрпризов, только сегодня один литовский сервер отказался принимать:
450 Client host rejected: cannot find your hostname, [195.222.75.238], но пока это не приняло размеров эпидемии — не смертельно...
imported
Moor29.07.2008 10:43
И еще попутный вопрос (всвязи с тем, что все чаще стал случаться отлуп при отправке — 450 4.7.1 Client host rejected: cannot find your hostname, [195.222.75.238]) :
Возвращает ли SMTPSend4 какой-нибудь ERRORLEVEL при ошибке отправки? Идея проста — запускать SMTPSend4 из батника на отправку напрямую, в случае ошибки там же запустить отправку через SMTPserver хостера.
imported
pig29.07.2008 11:18
А может, вам имеет смысл в публичном DNS нормально прописаться?
imported
Moor29.07.2008 11:56
DNS для нашего домена прописан, а 195.222.75.238 это наш статический (ну почти, правда и он имеет тенденцию время от времени изменяться, например, при переходе на другие тарифные планы) адрес у провайдера.
Если подскажете как это сделать или тыкнете носом что почитать на эту тему — буду премного благодарен
А по результатам теста (тремя постами выше) что-нибудь прокомментировать можете?
imported
pig29.07.2008 12:36
За тесты ничего не скажу, я так глубоко в потроха не залезаю.
А в DNS надо обязательно обратную зону прописать, за этим нынче строго следят.
imported
ac29.07.2008 14:12
ERRORLEVEL процесс smtpsend4 возвращает — тот же код, который в логе в конце пишется ("Exit error code:...", а при "Exit OK" соответственно ноль).

Для IP 195.222.75.238 попросите своего провайдера вместо "ppp-195-222-75-238.pe1-static.solo.by" указать в PTR-записи имя вашего хоста из вашего домена (т.е. то, которое в HELO пишете, и которое резолвится обратно в 195.222.75.238).

Результаты отправки с секундомером могу прокомментировать только по логам, если вы их пришлете. Сравнить, чем отличается сам протокол. Например, аутлук указывает в HELO тот домен, который сам вычислит (часто просто netbios-имя машины или вовсе 'localhost'), а smtpsend берет из опции -helo. Соответственно у принимающего сервера проверка HELO может занять сильно разное время. Вообще в таких ситуациях, когда участвуют случайные сетевые задержки, тесты надо гонять многократно для каждого случая и брать среднее. Одно могу сказать точно — в smtpsend нет никакой "закладки", которая, встретив сервер вашего хостера, намеренно замедляла бы отправку письма в 4 раза. Все зависит от внешних причин, а не от реализации команды DATA. Он и гигабит в секунду отдаст, если диск успеет прочесть, а сеть успеет принять — для процессора это пустяк.
imported
Moor29.07.2008 16:24
ac пишет: ERRORLEVEL процесс smtpsend4 возвращает — тот же код, который в логе в конце пишется ("Exit error code:...", а при "Exit OK" соответственно ноль).

Великолепно, значит идея запустить через батник разные командные строки должна сработать безотказно

ac пишет:
Для IP 195.222.75.238 попросите своего провайдера вместо "ppp-195-222-75-238.pe1-static.solo.by" указать в PTR-записи имя вашего хоста из вашего домена (т.е. то, которое в HELO пишете, и которое резолвится обратно в 195.222.75.238).

В HELO при отправке напрямую я могу писать свое имя домена, могу нет — от этого результат не изменяется. Только в логе вижу "HELO ppp-195-222-75-238.pe1-static.solo.by" если не указал, или "HELO мой домен" если указал. А при отправке через SMTP хостера я обязательно пишу свое имя домена, без HELO + EHLO не катит. Т.е. это наше имя домена провайдер и должен прописать в PTR для того, чтобы "nslookup 195.222.75.238" выдал наше имя домена — я правильно понимаю смысл обратного просмотра DNS? Только не ясно, как это повлияет на результат — если сейчас "nslookup 195.222.75.238" отдает "ppp-195-222-75-238.pe1-static.solo.by", а после изменения PTR станет отдавать "имя нашего домена". Ведь если я правильно понимаю, принимающая сторона вообще ничего не может узнать по адресу 195.222.75.238 — "cannot find your hostname, [195.222.75.238]". В чем-то я путаюсь/ошибаюсь/не прав?

ac пишет:
Результаты отправки с секундомером могу прокомментировать только по логам, если вы их пришлете.

Логи SMTPsend'a с удовольствием пришлю когда повторю тест (жалею что не сделал этого сразу), а вот как добыть лог отправки Outlook'а не знаю — я ведь им отправлял минуя EServ.

ac пишет:
Одно могу сказать точно — в smtpsend нет никакой "закладки", которая, встретив сервер вашего хостера, намеренно замедляла бы отправку письма в 4 раза.

Упаси Боже, у меня и мыслей таких небыло ...
imported
ac29.07.2008 17:31
Про включение лога Outlook: http://support.microsoft.com/kb/300479 и Outlook Express: http://support.microsoft.com/kb/176442

Ведь если я правильно понимаю, принимающая сторона вообще ничего не может узнать по адресу 195.222.75.238 — "cannot find your hostname, [195.222.75.238]". В чем-то я путаюсь/ошибаюсь/не прав?

Да, из сообщения следует так. Может в тот раз DNS-сервер вашего провайдера был недоступен принимающей стороне. А вообще проверка HELO принимающими серверами обычно устроена так: по указанному в HELO имени они получают IP (если не могут — отлуп), сравнивают IP с реальным IP соединившегося отправителя (если не совпадает — отлуп), по IP отправителя ищут имя (как "nslookup IP"; если нет имени — отлуп), сравнивают полученное имя с предъявленным именем (если не совпадает — отлуп). Могут быть и фильтры на подстроки "ppp", "dialup" и т.п. — у тех, кто считает всех диалапщиков спамерами — они обычно и RBL'ы соответствующие злые используют.
imported
Moor30.07.2008 09:23
ac пишет: Про включение лога Outlook: http://support.microsoft.com/kb/300479 и Outlook Express: http://support.microsoft.com/kb/176442

APPLIES TO
• Microsoft Outlook Express 4.01
• Microsoft Outlook Express 4.0
• MSN 2.5 Software
• Microsoft Windows 98 Standard Edition
В 6-м OutlookExpress'e это оказалось немного не там — Сервис -> Параметры -> Обслуживание -> нижняя строка (на случай если еще кому понадобится ). Как только вырву время повторить эксперимент, все логи тут же выложу. Большое спасибо за пояснения
imported
Moor05.08.2008 09:16
ac пишет: ERRORLEVEL процесс smtpsend4 возвращает — тот же код, который в логе в конце пишется ("Exit error code:...", а при "Exit OK" соответственно ноль).

Вот такой фокус наблюдается

<s:result>FAILED. Error code: 550 </s:result>
</entry>
<s:exit>Exit OK</s:exit></feed>

т.е. вроде как FAILED. Error code: 550, а по выходу — ОК.
Так что похоже ERRORLEVEL использовать не удастся...
imported
ac05.08.2008 22:57
Бывают и не Ok-выходы. В этом подходе с кодами выхода из smtpsend4 другая основная проблема: он отправляет не одно письмо, а по умолчанию пытается отправить всю ожидающую очередь. Как вы собирались вычислять, к которому из писем относится код ошибки? Надежнее было бы проверять существование файлов: если после прохода smtpsend'а файлы остались в очереди, значит с каждым из них стряслась какая-то беда. А сам smtpsend может вернуть только одну из всех возникших ошибок. И надо еще подумать (раз уж появилась потенциальная применимость), какую из ошибок правильнее возвращать в итоге. Или может возвращать просто счетчик ошибок. По умолчанию возвращается исключение всего процесса — такие как "файлы заняты другим процессом".
imported
Moor06.08.2008 11:16
ac пишет: В этом подходе с кодами выхода из smtpsend4 другая основная проблема: он отправляет не одно письмо, а по умолчанию пытается отправить всю ожидающую очередь.

Да, Вы правы, не учел

ac пишет: Надежнее было бы проверять существование файлов: если после прохода smtpsend'а файлы остались в очереди, значит с каждым из них стряслась какая-то беда

Тоже IMHO не универсальный алгоритм — в случае, когда письмо возвращено отправителю, в очереди его уже не окажется. У нас такая ситуация последнее время не редкость — кто-то шпарит спам от нашего имени (адреса), и он (адрес) попадает в спам-листы, в таком случае при попытке отправки письмо немедленно возвращается отправителю.
Кстати, не помню как на практике — если в течение отправки в очереди появляются еще письма — они уходят следующей сессией или этой же?

ac пишет: И надо еще подумать (раз уж появилась потенциальная применимость), какую из ошибок правильнее возвращать в итоге. Или может возвращать просто счетчик ошибок

Потенциальная применимость IMHO возникнет только при отправке напрямую, чтобы при ошибке попытаться отправить стандартным способом (через сервер провайдера/хостера). Может быть просто при наличии ошибок просто вернуть не-нулевой ERRORLEVEL — тогда уж то, что осталось в папке, можно попробовать отправлять стандартным способом. Все равно какое-то универсальное решение здесь наврядли найдется. Да и стоит ли вообще ломать копья — системы контроля почты становятся все жестче, и похоже не за горами момент, когда для определенных ситуаций (отправителей) прямая отправка станет совсем невозможна...
imported
ac07.08.2008 00:06
Moor пишет: Тоже IMHO не универсальный алгоритм — в случае, когда письмо возвращено отправителю, в очереди его уже не окажется.

Обратно возвращается тоже через очередь.

Moor пишет: Кстати, не помню как на практике — если в течение отправки в очереди появляются еще письма — они уходят следующей сессией или этой же?

Обычно сразу же параллельной сессией, если флага -z у smtpsend в ком.строке нет.

Moor пишет: Может быть просто при наличии ошибок просто вернуть не-нулевой ERRORLEVEL — тогда уж то, что осталось в папке, можно попробовать отправлять стандартным способом.


http://www.eserv.ru/download/smtpsend445.rar

Moor пишет: Да и стоит ли вообще ломать копья — системы контроля почты становятся все жестче, и похоже не за горами момент, когда для определенных ситуаций (отправителей) прямая отправка станет совсем невозможна...


Прямая отправка намного надежнее (и лучше контролируется), поэтому при наличии выделенного канала стоит побороться за "право" прямой доставки. Т.е. получить выделенный реальный IP, правильное доменное имя к нему, и исключиться из всех черных списков, куда попали из-за предыдущего владельца IP или всей провайдерской подсетью. Эти вопросы обычно можно решить взаимодействием с провайдером.
imported
Moor07.08.2008 09:15
ac пишет:
Обратно возвращается тоже через очередь.

Спасибо, а я думал что они сразу в spool\to_check уходят...

ac пишет:
Обычно сразу же параллельной сессией, если флага -z у smtpsend в ком.строке нет.

Нет, я использую -z. В этом случае они следующей сессией уходят, да?

ac пишет:
http://www.eserv.ru/download/smtpsend445.rar

Большое спасибо, попробую — отправка у меня уже сделана через батник, только по-моему условие IF ERRORLEVEL в нем не срабатывало (сколько я просматривал SMTP-логи).

ac пишет:
Т.е. получить выделенный реальный IP, правильное доменное имя к нему

У на есть реальный выделенный IP, но к нему имя ppp-*-*--.pe1-static.solo.by, надо попробовать уговорить провайдера сменить его на что-то более внятное, а домен наш у хостера совсем на другом IP. Но это уже не ваши проблемы, а мои...

Тестирование скорости отправки для разных способов видимо повторю уже после отпуска — ухожу с выходных отдыхать...
imported
ac07.08.2008 11:28
Moor пишет: Нет, я использую -z. В этом случае они следующей сессией уходят, да?

Да.
imported
Moor07.08.2008 15:57
Чего-то у меня и с новым SMTPSEND не удается в батнике ERRORLEVEL словить:

<s:ior>Error: 10060 <s:log>2 </s:log>
</s:ior>
<s:mx>MX: relay2.peterlink.ru</s:mx>
<content type='text/plain'><![CDATA[
]]></content>
<s:ior>Error: 10060 <s:log>2 </s:log>
</s:ior>
<s:err>ERR:10060 </s:err>

<s:result>FAILED. Error code: 10060 </s:result>
</entry>
<s:exit>Exit error cnt:1 </s:exit></feed>

Все равно то, что должно отработать по IF NOT ERRORLEVEL 0 (ну или IF ERRORLEVEL GOTO END) не отрабатывает . В чем я туплю?
imported
ac07.08.2008 16:45
А если echo %ERRORLEVEL% поставить после вызова smtpsend4?
imported
ac07.08.2008 16:53
И проверку делать как-то так: if %ERRORLEVEL%==0 echo ok
imported
Работает на Eserv/5.05567 (10.02.2020)