Может ли sendmail пересылать электронную почту сразу, а не в очереди?

Часть почты, проходящей через мой сервер, пересылается на внешние учетные записи.

К сожалению, мой вышестоящий SMTP-сервер очень требователен к спаму и отклоняет некоторые легитимные сообщения как таковые. Когда это происходит с перенаправленной почтой, я получаю отскоки (как почтмейстер), а не отправители.

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

Можно ли что-то настроить таким образом, чтобы пересылка начиналась немедленно (как только будет определен пункт назначения пересылки)? Статус - успех или неудача - может быть передан непосредственно на предыдущее реле, все еще находящееся на линии...

Если sendmail не может это сделать, могут ли другие MTA? Спасибо!

2 ответа

Решение

Нет, это невозможно, так как оно не реализовано ни с каким распространенным программным обеспечением SMTP; вам придется запрограммировать свой собственный SMTP-сервер, поддерживающий такого рода поведение, которое будет выходить за рамки Serverfault. В этом ответе я объясняю, почему все адаптеры MTA реализовали протокол SMTP очень схожим образом, используя очередь, и как это является наилучшим способом выполнения всех требований протокола.

Агент почтовой транспортировки MTA всегда либо отклоняет сообщение, либо принимает и ставит его в очередь на основе своих собственных настроек. Затем он ретранслируется или доставляется из очереди.

Это потому что

  • Могут быть как постоянные, так и временные ошибки. Если MTA не может подключиться к следующему переходу немедленно, он попытается позже и отскочит, только если задержка достигнет установленного предела. Также он не может дождаться ответа другого MTA перед закрытием соединения, так как он может иметь другие сообщения для доставки в первую очередь.

  • может быть несколько получателей. В то время как клиент может просто перечислить всех получателей одновременно с RCPT TO командами, сообщение может быть наконец доставлено на несколько других серверов, некоторые из которых могут быть доступны сейчас, а некоторые позже. Кроме того, MTA не может открыть все эти соединения сразу во время начального соединения и ждать их ответов. Нет практической причины иметь совершенно другой рабочий процесс для сообщений с одним получателем.

  • всегда должно быть ясно, какой MTA в настоящее время несет ответственность за доставку сообщения. (Это было объяснено примерами в ответе MadHatter.)

Вот так был разработан SMTP. Вместо синтаксического требования к командам соединения это приводит к очень похожим архитектурам; Sendmail, Postfix и даже MS Exchange имеют отдельные компоненты для отправки и получения почты.

  1. Компонент SMTP-сервера получает почту и добавляет ее в очередь.
  2. Затем отдельный SMTP-клиент пытается отправить его дальше другим MTA, или, если получатель является локальным, сообщение может быть сохранено в файл или передано агенту доставки почты MDA, например, Procmail.

Требование по-прежнему исходит из спецификации SMTP; RFC 5321 2.1 по базовой структуре модели SMTP:

Ожидается, что реализации SMTP с полной поддержкой, включая ретрансляторы, используемые этими менее активными, и их места назначения, будут поддерживать все функции организации очередей, повторных попыток и альтернативных адресов, описанные в этой спецификации. Во многих ситуациях и конфигурациях рассмотренные выше клиенты с меньшей способностью ДОЛЖНЫ использовать протокол передачи сообщений ( RFC 4409), а не SMTP.

И немного дальше:

Другими словами, передача сообщения может происходить в одном соединении между исходным SMTP-отправителем и конечным SMTP-получателем или может происходить в серии переходов через промежуточные системы. В любом случае, после того как сервер отправил ответ об успешном завершении в конце почтовых данных, происходит официальная передача ответственности за сообщение: протокол требует, чтобы сервер ДОЛЖЕН был принять на себя ответственность либо за доставку сообщения, либо за надлежащее сообщение о сбое. сделать это (см. разделы 6.1, 6.2 и 7.8).

Я думаю, что ответ Эсы превосходен, но я собираюсь не согласиться с некоторыми из них. Я думаю, что то, что вы хотите , возможно, но это плохая идея, и она вам не поможет. По его словам, RFC5321 s2.1 отмечает, что

после того как сервер отправил ответ об успешном завершении в конце почтовых данных, происходит официальная передача ответственности за сообщение: протокол требует, чтобы сервер ДОЛЖЕН был принять на себя ответственность либо за доставку сообщения, либо за надлежащее сообщение об отказе сделать это.

В том случае, если сервер B получает сообщение от сервера A и доставляет его на сервер C, я не вижу, чтобы это препятствовало тому, чтобы B ожидал подтверждения получения до A, пока не получило подтверждение получения от C - что вы и делаете просишь. Но проблема в том, что между двумя серверами 250 OK является атомарным (либо получатель принял его, и поэтому отвечает за доставку, либо нет, поэтому отправитель остается ответственным), а между тремя - нет.

Рассмотрим случай, когда клиент А непреднамеренно отключается после отправки письма, но до того, как 250 OK, в то время как B доставляет его на C. C затем подтверждает получение от B своим 250 OK, так что B знает, что у C это есть. Но A этого не делает, поэтому A по-прежнему должен нести ответственность и продолжать передачу к B. Если есть некоторая систематическая проблема связи между A и B (например, один из тех прекрасных брандмауэров, которые считают, что их работа - связываться с содержимым SMTP-разговоров), это может привести к доставке очень большого количества копий одного и того же сообщения.

Более того, sendmail уже делает то, что, по вашему мнению, не делает: в случае неудачной доставки в C он попытается вернуть обратно деньги A. Обычно это происходит только в том случае, когда A является вредоносным, и либо лежит в конверте-From. (кому такое уведомление должно быть сделано) или вообще не запускает почтовый сервер. В таких случаях почта должна быть доставлена ​​почтмейстеру B, так как B отвечает за доставку 250 OK к A, но не получил его от C), не может доставить C (он попробовал и получил постоянный сбой 5xx) и не может передать обратно A (потому что A сделал это невозможным), так что никто больше не может передать его. Вот пример, который я получил этим утром:

Date: Tue, 8 Aug 2017 02:53:55 +0100
From: Mail Delivery Subsystem <MAILER-DAEMON@lory.teaparty.net>
To: mailman-bounces@teaparty.net
Subject: Returned mail: see transcript for details
Parts/Attachments:
   1   Shown     17 lines  Text
   2   Shown    407 bytes  Message, "Delivery Status"
   3   Shown     15 KB     Message
   3.1           10 KB     Application
----------------------------------------

The original message was received at Tue, 8 Aug 2017 02:53:53 +0100
from localhost [IPv6:::1]

   ----- The following addresses had permanent fatal errors -----
<redacted@googlemail.com>
    (reason: 550-5.7.1 Unauthenticated email from aol.com is not accepted due to domain's)

   ----- Transcript of session follows -----
... while talking to gmail-smtp-in.l.google.com.:
>>> DATA
<<< 550-5.7.1 Unauthenticated email from aol.com is not accepted due to domain's
<<< 550-5.7.1 DMARC policy. Please contact the administrator of aol.com domain if
<<< 550-5.7.1 this was a legitimate mail. Please visit
<<< 550-5.7.1  https://support.google.com/mail/answer/2451690 to learn about the
<<< 550 5.7.1 DMARC initiative. 53si155585wrc.260 - gsmtp
554 5.0.0 Service unavailable

    [ Part 2: "Delivery Status" ]

Reporting-MTA: dns; lory.teaparty.net
Received-From-MTA: DNS; localhost
Arrival-Date: Tue, 8 Aug 2017 02:53:53 +0100

Final-Recipient: RFC822; redacted@googlemail.com
Action: failed
Status: 5.7.1
Remote-MTA: DNS; gmail-smtp-in.l.google.com
Diagnostic-Code: SMTP; 550-5.7.1 Unauthenticated email from aol.com is not accepted due to domain's
Last-Attempt-Date: Tue, 8 Aug 2017 02:53:55 +0100

    [ Part 3: "Included Message" ]

Date: Tue, 08 Aug 2017 01:53:46 -0000
From: rmusic80proof@aol.com
To: redacted@stphilipschurch.org.uk
[...]

Обратите внимание на то, как оригинальное электронное письмо направлено с адреса aol.com. Как же тогда я не пытаюсь доставить им отчет об ошибках? Потому что они лгали в своей первоначальной SMTP-транзакции:

Aug  8 02:53:51 lory sendmail[9457]: v781rmjA009457: from=<rmusic80proof@stphilipschurch.org.uk>, size=14095, class=0, nrcpts=1, msgid=<150215722683.22237.12283849532100059916@37.114.157.178>, proto=SMTP, daemon=MTA-v6, relay=[37.114.157.178]

Я виноват, что я еще не настроил SPF для этого конкретного домена (stphilipschurch.org.uk), но так как у меня нет, ничто не мешает мне принять эту ложь - и затем я застреваю с недоставленным сообщением, которое не может быть возвращено отправителю, поскольку отправитель злонамеренный и незаинтересованный (будучи подключенным через интернет-провайдера в Азербайджане),

ТЛ; dr: sendmail уже делает то, что вы просите, когда это возможно. То, что вы хотите сделать, не поможет, если не поможет, и создаст проблемы. Не делай этого.

Другие вопросы по тегам