web-dev-qa-db-ja.com

cronがMTAを使用してメールを送信するのに、MUAを使用してメールを送信するのはなぜですか?

たとえば、MTA、MUA、MDAの定義を見てきました https://ccm.net/contents/116-how-email-works-mta-mda-mua and https://en.wikipedia.org/wiki/Email_agent_(infrastructure)

  • Lubuntuでは、デフォルトの電子メールクライアントはSylpheedであり、多くはThunderbirdも使用しています。私が正しければ、SylpheedとThunderbirdの両方がMUAです。

  • https://unix.stackexchange.com/a/479613/674 で、Stephenは、cronがMTA(postfixやsendmailなど)を使用してジョブの出力を電子メールとして送信すると述べました。

私の質問は次のとおりです。

  • Cronがメールの送信にMUAではなくMTAを使用するのはなぜですか? cronがMUAを使用して電子メールを送信できる場合、どのようにしたらよいでしょうか。

  • メールの送信にMTAの代わりにMUA(SylpheedまたはThunderbird)を使用するのはなぜですか? MTAを使用してメールを送信できるとしたら、どうすればよいでしょうか。

  • MUA(SylpheedまたはThunderbird)をインストールする場合、SylpheedまたはThunderbirdは、電子メールを送信するために同じマシンにMTAをインストールする必要がありますか?

ありがとう。

2
Tim

基本的に、Unix上のメールはローカルな現象です。同じホスト上のユーザーは、ネットワークがなくても相互にメールを送信できます。 (「アドレス」は単なるユーザー名であり、@はありません。)これはもちろん、MUAからMTAにメッセージを通信する方法がローカルでなければならないことを意味します。通常、そのメソッドはsendmailという名前のプログラムへのパイプです。

@記号を含むアドレスをMTAに認識させることにより、純粋にローカルメールを拡張してインターネットメールシステムに参加させることができます。 MUAは、ネットワークの存在について知る必要はありません。アドレスを不透明な文字列として扱い、ローカルMTAにネットワークを経由する必要があるアドレスを特定させる必要があります。

MTAは、システム上に1つしかないため、明らかにネットワーク構成に適した場所ですが、複数のMUAを異なるユーザー、または同じユーザーが使用することもできます。それらすべてのネットワーク関連のものを処理する単一のプログラムは、構成を複数回行う必要がないことを意味します。

送信メッセージをリモートサーバーに挿入するMUAは、「Unixライクな」システムがMTAなしで正しく動作するふりをすることを可能にすることを目的としています。この構成は、従来のスキームを拒否したものです。これは、メールシステムの心臓部(ローカルユーザーにメッセージを送信する機能)を切り取り、適切な代替手段を提供しません。

CronはMUAとして機能しているため、「MUAを使用」せず、Unix MUAが常に行ってきたことを実行し、ネットワークが存在することを知らずにメールを送信し、ローカルMTAに依存してそれを把握します。 。また、cronジョブはローカルユーザーに代わって実行され、そのユーザーがリモートホストでどのアドレスを持っているかを知る方法がないため、ローカルユーザー名で受信者をアドレス指定することが唯一の妥当なデフォルトです。

7
user41515

CronおよびMUA-MTA接続の場合

実用的な回答

私は通常、cronユーザーの接尾辞エイリアスを作成します。このようにして、すべてのcronジョブメールがルックアップテーブルのエイリアスアドレスに配信されます。

  • したがって、実用的な答えは次のとおりです。

cronメッセージは、サーバー/ドメイン/マシンから任意のインターネット全体の電子メールアドレスに送信できます。


さらに、cron自体は任意の任意のものを使用するように構成できます メーラー MTA。

Debian Busterのcronソースツリーから:

cron-3.0pl1/config.h

45 #define MAILCMD _PATH_SENDMAIL                   /*-*/
46 /* #define MAILARGS "%s -i -FCronDaemon -odi -oem  %s"       /*-*/
47 #define MAILARGS "%s -i -FCronDaemon -B8BITMIME -oem  %s"        /*-*/
48          /* -i    = don't terminate on "." by itself
49                         * -Fx     = set full-name of sender
50           * -odi  = Option Deliverymode Interactive
51           * -oem  = Option Errors Mailedtosender
52           * -t    = read recipient from header of message
53           * -or0s = Option Readtimeout -- don't time out
54           * XXX: sendmail doesn't allow -or0s when invoked
55           * by joe user.  --okir
56           */
57
58 /* #define MAILCMD "/bin/mail"           -*/
59 /* #define MAILARGS "%s -d  %s"          -*/
60          /* -d = undocumented but common flag: deliver locally?
61           */
62
63 /* #define MAILCMD "/usr/mmdf/bin/submit"    -*/
64 /* #define MAILARGS "%s -mlrxto %s"      -*/

  • したがって、2番目の実用的な答え:

cronは任意のMTAを使用するようにコンパイルできます


理論的回答

コメントやその他の回答で述べられているように、cronはMUAとして機能しています。独自の論理マシン上にある所定のMTAを除いて、実際にメッセージを送信するためのコードベースはありません。論理マシンは実際には同じ物理マシンではない可能性があることに注意してください。

MTAを使用した電子メールの送信について

SMTPポートを介してMTAに直接接続

SMTP.URL:portに接続し、任意の認証を手動で行うことにより、MTAを介して電子メールを直接送信できます。

telnet example.com 25

ISPに接続してポート25にブロックされていないアクセスがある場合は、通常は機能します。そして、次のようなメッセージが表示されます。

Trying xxxx:xxxx::xxxx:xxxx:xxxx:xxxx...
Trying xxx.xxx.xxx.xxx...
Connected to example.com.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix (Debian/GNU)

しかし...ほとんどのISPはポート25接続をブロックします。また、この電子メールの送信方法は煩雑であるため、一般に、sylpheedThunderbirdなどの適切に設計されたMUAが使用されます。

ISPが標準のSMTPポートをブロックする理由:25

ほとんどのインターネットユーザーは、インターネットサービスプロバイダー(ISP)を介してワイドエリアネットワーク(WAN)に接続します。これらのISPは通常、HTTP(80)SMTP(25)やその他のいくつかの可能なインターネットサービスの実行に使用される一般的なポートをブロックします。

一般に、ISPは顧客と契約条件を結んでおり、ネットワークからインターネットサービスを実行することはできません。この一般的なISPポリシーには、少なくとも2つの理由があります。

  1. インターネットサービスは帯域幅を消費します。
  2. ISPは、多くの電子メールスパマーや悪意のあるWebサービスに対する最小限の障壁として機能します。

ISPは通常、独自の動的IPアドレスプールをブラックリストに登録します。そのため、ISPの動的IPアドレスから実行されているメールサービスは、拒否されるか、大規模な電子メールプロバイダーの「スパム」フォルダーに直接配置される可能性が非常に高くなります。

ブラックリストに登録されたIPブロッキング

IPブラックリストは非常にシンプルで効果的です。これはMTA構成で使用され、ブラックリストに登録されたドメインから発信された受信メールを即座に拒否します。

/etc/postfix/main.cf

...
smtpd_client_restrictions = ...
                            reject_rbl_client cbl.abuseat.org
                            reject_rbl_client pbl.spamhaus.org
                            reject_rbl_client sbl.spamhaus.org
                            reject_rbl_client bl.blocklist.de
...

私の実際のサーバーログの1つからの例:

Oct 14 04:45:23 xxxx postfix/smtpd[17679]: NOQUEUE: reject: RCPT from xxxxx.xxxx.xxxx.jp[xxx.149.xxx.xxx]: 554 5.7.1 Service unavailable; Client Host [xxx.149.xxx.xxx] blocked using sbl.spamhaus.org; https://www.spamhaus.org/sbl/query/SBL319039; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<xxxx.xxx.xxx.jp>

ボットネット時代のポートブロッキングとRBLの有効性

これらのポリシーは、現在のオンデマンドWebサーバーの時代より前に効果的でした。私の経験では、スパマーと悪意のある攻撃者は、ISPに接続されたサービスからボットネットとオンデマンドのコマンドアンドコントロール(C&C)サーバーに移行しただけです。

私自身のサーバーに対するスパムまたはブルートフォース攻撃のほとんどは、通常Amazon EC2 IPアドレスから実行されるC&Cプローブから始まります。続いて、どこか遠くの国のアドレスから送信される一連のボットネットが続きます。

ポートをブロックしないISP

米国のISPがすべてのポートを許可しているかどうかはわかりません。しかし、ポートやフィルターがブロックされていないインターネット消防ホースを消費者に渡すだけのヨーロッパのISPを見たことがあります。

ですから、「ISPに確認する」以外に答えはありません。

2
RubberStamp

簡単な答えは次のようになります。それはunix哲学です " 1つのことを実行してそれをうまく実行してください "。

まず、MTAとMUAの違いを理解します。

  • MUA(メールユーザーエージェント)(Thunderbirdなど)は、ユーザーと簡単にやり取りできるようにするプログラムです。このプログラムは、主にユーザーの操作に焦点を当てています。さまざまなメールボックス内の現在のメールをユーザーに提示し、ユーザーが特定のメールアドレスにメールを送信できるようにします。追加機能が可能です。主に、ユーザーを満足させるために、すべての下位レベルのものを処理します。
  • MTAはバックグラウンドのプログラムです。その唯一の目的は、ある「場所」から別の「場所」にメールを転送するための安定したバックエンドを提供することです。 (ここでの「場所」とは、ホスト、人、またはその他のことを意味する場合があります。その背後にある考え方を理解するためです。)そのインターフェイスはほとんどがプログラムAPIです( SMTPプロトコル を参照)。もちろん、人間はそのようなテキストを偽造することができますが、実際の郵送の例を行う場合、手動で仕様に保持することはそれほど簡単ではありません。
  • MDA(メール配信エージェント)は、ユーザーのメールボックスへのアクセスを提供するプログラムです。プログラマティックインターフェイスも使用します。このようなインターフェイスの例は、POP3またはIMAPです。

ユーザーが自分のMUAでメールを送信する場合、MUAは自分のISPのMTAに接続します。 MTAはユーザーの資格情報を確認し、メールの配信を受け入れます。これで、メールはユーザーに送信されたものとして報告されます。 ISPのMTAは、メールの配信方法をチェックし、メールを送信する次のステーションを見つける可能性があります。メールは、メールの最終的な宛先であるホストが見つかる前に、この方法で複数のホップを作成できます。このMTAは、宛先ユーザーのメールボックス(通常はサーバー上でローカル)に配置する方法を認識します。これで、受信者はMUAを開き、ISPのMDAに接続できます。 MDAはローカルファイルシステムを調べて、新しいメッセージとその内容があったことを報告します。

したがって、簡単な答えは次のとおりです。Cronはプログラムであるため、MUAではなくMTAのプログラムインターフェイスを使用します。 (cronはこれらのプログラムとどのように相互作用する必要がありますか?)

MTAを使用してメールを送信するには:ポート25、578、または使用するものに接続し、SMTP(S)プロトコルを使用します。これは、MUAが内部で行うことです。 MUAの設定で使用するのと同じ資格情報/ホスト/ポート設定を使用できます/使用する必要があります。

MUAは、MTAとのネットワーク通信を行うことができます。したがって、各マシンにローカルMTAは必要ありません(Thunderbirdを実行するためにローカルでpostfixを実行する必要はありませんよね?)。

ただし、どこにでもメールを送信できるはずのマシン上のサービスについて話している場合、実際には2つのオプションがあります。

  1. プログラム(例:cron)は、メールを受け入れるリモートMTAを認識しています。これは、プログラムごとに個別に実行する必要があり、多くのサービスを管理する場合はせいぜい面倒です。
  2. すべてのメールには「デフォルトルート」があります。そうすれば、ローカルプログラムは、手動で構成しなくても、このルートを簡単に使用できます。

ここで、上記のUNIX哲学が機能します。すべてのプログラムに通信(および承認など)を実装する代わりに、一度実装され(MTA)、このプログラムは、ローカルサービスからのメールを受け入れるデフォルトのインターフェイスを提供します(unixソケットを介して、コマンドまたはネットワークポートにパイプします)。これが、ほとんどのサービスがローカルMTAが実行されていると想定している理由です。このMTAは、並べ替えなどのためにメールをより大きなMTAに転送するだけの非常に最小限のMTAである可能性があります。

ここでの事実上の標準は、最近のプログラムsendmail(これもMTA)でした。それに関する大きな問題のために、それはまだ古いsendmailインターフェースを提供するpostfixのような他のMTAによってスーパーシードされました(postfixパケット内にsendmailラッパーが存在する理由)。

1
Christian Wolf