none
Рассылка писем от нашего почтового ящика сторонним smtp сервисом RRS feed

  • Вопрос

  •       

    Добрый день профи. Хочу разобраться с проблемой. Есть почтовый сервер 2013SP1. К нему подключается сторонний smtp сервис что бы рассылать письма от имени нашего почтового ящика (более 1000 адресатов). Однако письма уходят не всем, а у разработчиков smtp сервиса ошибки типа, что превышен rate. 

    "Caused by: com.sun.mail.smtp.SMTPSendFailedException: 421 4.4.2 Message submission rate for this client has exceeded the configured limit"

    Открыв и проанализировав лог smtp соединений TransportRoles\Logs\FrontEnd\ProtocolLog\SmtpReceive, я выяснил к какому коннектору подключается smtp сервис, установил на прием 5000. Ошибки у них продолжаются.

    Вообще, не могу понять, что бы сторонний smtp отправлял письма от им нашего п/я допустим 1000 адресатам, он должен подключиться один раз и сказать "разослать 1000 таким то адресатам"? И тогда в логах smtp соединений будет всего одна сессия? Или smtp сервис подключиться 1000 раз для каждого адресата отдельно и в логах будет 1000 smtp сессий? (Это то, что я вижу сейчас, выгрузив логи в Excel, smtp сервис подключался в течении часа 1000 раз). Так и должно быть?


    • Изменено user00431 19 апреля 2019 г. 10:03
    19 апреля 2019 г. 10:02

Ответы

  • Как именно будет оформлена отправка сообщения 1000 получателям - это решает не сервер, а отправитель - человек или программа: он может создать как одно сообщение с 1000 адресатами, так и 1000 сообщений с одним адресатом, а также - и любую другую комбинацию:20 сообщений по 50 адресатов, 50 сообщений по 20 адресатов и т.д. А сервер SMTP просто отдельно перешлёт каждое такое сообщение указанным для него адресатам, а если нужно послать на разные серверы - разобьет его по одной части на каждый сервер получателя. 

    Какой именно вариант выбрать - это отправитель решает исходя из каких-то своих соображений. Например - предполагает, что антиспаму на стороне получателя может не понравиться большое число получателей в заголовках To/Cc письма или отсутствие получателя в этих заголовках (если использовался заголовок Bcc). Или просто потому что так программу писать легче.

    А судя по тому, что вполне нормальная при общении между двумя SMTP серверами 4XX ошибка вызывает потерю сообщений, у разработчиков там вообще нет нормального сервера SMTP (потому как сервер, получив в ответ 4XX,  повторил бы отправку через некоторое время), а отсылку ведет программа, к тому же - не умеющая обрабатывать подобные ошибки. А со стороны Exchange, кстати, такие ошибки могут появиться не только из-за превышения пределов, но и из-за слишком большой очереди ожидающих обработки сообщений в процессе появления такого всплеска (срабатывает механизм back pressure https://docs.microsoft.com/en-us/exchange/mail-flow/back-pressure?view=exchserver-2016 , а пороги этого механизма для отдельного коннектора не настраивается, только для сервера Exch целиком). Так что если сторонний отправитель не умеет ни контролировать скорость отправки сообщений, ни обрабатывать 4XX ошибки (типичный случай для всяких веб-приложений), то стоит между этим клиентом и Exchange поставить промежуточный сервер SMTP (на чем угодно - Windows Server SMTP, Postfix на *nix и т.д., возможно - прямо на том же сервере, где приложение, отправляющее письма, работает), который будет принимать эти всплески и отдавать их в Exchange в разумном темпе и без потерь..

       

    Слава России!

    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:48
  • Добрый день

    Вот это верно:
    'smtp сервис подключится 1000 раз для каждого адресата отдельно и в логах будет 1000 smtp сессий'

    Решение проблемы:
    - скорее всего нужно создать отдельный коннектор, только для этого сервиса
    на нём установить лимит, бОльший чем вы пытаетесь отправлять
    Set-recieveconnector "Server Name\Client Connector" -Messageratelimit 1500
    (указать цифру больше 1000)
    PS. На отдельном коннекторе можно вообще unlimited поставить.
    • Предложено в качестве ответа Egor Vasilev 19 апреля 2019 г. 10:22
    • Изменено Evgeny Vovney 19 апреля 2019 г. 10:23
    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:09
  • 1. Get-TransportServer | FT MaxOutboundConnections,MaxPerDomainOutboundConnections

    2. https://docs.microsoft.com/en-us/exchange/message-throttling-exchange-2013-help

    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:41

Все ответы

  • Добрый день

    Вот это верно:
    'smtp сервис подключится 1000 раз для каждого адресата отдельно и в логах будет 1000 smtp сессий'

    Решение проблемы:
    - скорее всего нужно создать отдельный коннектор, только для этого сервиса
    на нём установить лимит, бОльший чем вы пытаетесь отправлять
    Set-recieveconnector "Server Name\Client Connector" -Messageratelimit 1500
    (указать цифру больше 1000)
    PS. На отдельном коннекторе можно вообще unlimited поставить.
    • Предложено в качестве ответа Egor Vasilev 19 апреля 2019 г. 10:22
    • Изменено Evgeny Vovney 19 апреля 2019 г. 10:23
    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:09
  • 1. Get-TransportServer | FT MaxOutboundConnections,MaxPerDomainOutboundConnections

    2. https://docs.microsoft.com/en-us/exchange/message-throttling-exchange-2013-help

    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:41
  • Как именно будет оформлена отправка сообщения 1000 получателям - это решает не сервер, а отправитель - человек или программа: он может создать как одно сообщение с 1000 адресатами, так и 1000 сообщений с одним адресатом, а также - и любую другую комбинацию:20 сообщений по 50 адресатов, 50 сообщений по 20 адресатов и т.д. А сервер SMTP просто отдельно перешлёт каждое такое сообщение указанным для него адресатам, а если нужно послать на разные серверы - разобьет его по одной части на каждый сервер получателя. 

    Какой именно вариант выбрать - это отправитель решает исходя из каких-то своих соображений. Например - предполагает, что антиспаму на стороне получателя может не понравиться большое число получателей в заголовках To/Cc письма или отсутствие получателя в этих заголовках (если использовался заголовок Bcc). Или просто потому что так программу писать легче.

    А судя по тому, что вполне нормальная при общении между двумя SMTP серверами 4XX ошибка вызывает потерю сообщений, у разработчиков там вообще нет нормального сервера SMTP (потому как сервер, получив в ответ 4XX,  повторил бы отправку через некоторое время), а отсылку ведет программа, к тому же - не умеющая обрабатывать подобные ошибки. А со стороны Exchange, кстати, такие ошибки могут появиться не только из-за превышения пределов, но и из-за слишком большой очереди ожидающих обработки сообщений в процессе появления такого всплеска (срабатывает механизм back pressure https://docs.microsoft.com/en-us/exchange/mail-flow/back-pressure?view=exchserver-2016 , а пороги этого механизма для отдельного коннектора не настраивается, только для сервера Exch целиком). Так что если сторонний отправитель не умеет ни контролировать скорость отправки сообщений, ни обрабатывать 4XX ошибки (типичный случай для всяких веб-приложений), то стоит между этим клиентом и Exchange поставить промежуточный сервер SMTP (на чем угодно - Windows Server SMTP, Postfix на *nix и т.д., возможно - прямо на том же сервере, где приложение, отправляющее письма, работает), который будет принимать эти всплески и отдавать их в Exchange в разумном темпе и без потерь..

       

    Слава России!

    • Помечено в качестве ответа user00431 19 апреля 2019 г. 11:26
    19 апреля 2019 г. 10:48
  • Гениально! Спасибос. 
    19 апреля 2019 г. 11:06