通知メールを送信するためにLinuxシステムプログラムが使用する標準インターフェースは何ですか?

通知メールを送信するためにLinuxシステムプログラムが使用する標準インターフェースは何ですか?

私の電子メールの要件は簡単です。 SMTPではなくフックを介してのみシステム通知を送信したいと思います。 (Hookはhttpsを介してmailgunアカウントに送信されます。)

私はすべてのLinuxプログラム(例えばcron)が「(送信)メール[オプション]コンテンツ」のようなものを呼び出すと想像しています。それともSMTPサービスを直接呼び出すのですか?

彼らが「(送信)メール[オプション]コンテンツ」を呼び出すと、その呼び出しを自分のフックに変換するシェルスクリプトまたはプログラムを簡単に適用/作成できるはずです。

私が見つけたこの参照:

Linux標準基本PDA仕様3.0RC1

まとめ/usr/sbin/sendmail [オプション] [住所...]説明

電子メール(電子メール)を送信するには、アプリケーションがsendmailによって提供されるインターフェース(ここで説明されている)をサポートする必要があります。このインターフェイスはアプリケーションの基本的な配信方法でなければなりません。

プログラムは必要に応じてメッセージをルーティングし、1 人以上の受信者に電子メールを送信します。このプログラムはユーザー・インターフェース・ルーチンではありません。

オプションがない場合、sendmailはファイルの最後まで、または1つのドットのみを含む行まで標準入力を読み取り、そこにあるメッセージのコピーをリストされているすべてのアドレスに送信します。アドレスの構文と内容に基づいて使用するネットワークを決定します。

アドレスの前にバックスラッシュ「\」がある場合、そのアドレスがローカルエイリアス拡張の宛先かどうかは指定されません。

メッセージ形式はRFC 2822:インターネットメッセージ形式で定義されています。

オプション

-bmは
標準入力からメールを読み取り、それを受信者アドレスに転送します。これが基本動作モードです。

...(等)...

私が探しているのはこれが正しいのでしょうか?つまり、「sendmail」というプログラムを呼び出すと、stdinはRFC2882準拠の電子メールの内容になります。

注: "nullmail"というプログラムがあることはわかっていますが、このプログラムはアウトバウンドメールを送信するためにSMTPを使用すると思うので、そのようなプログラムは望ましくありません。 RFC2822 構文解析 フロントエンドに適用することも可能です。


これを教えてくれた@ivanivanに感謝します。メールを送信~である実は相互作用。したがって、すべての通知は固定メールアドレスを介して送信されます。無料 メールガンアカウントを作成して記録するには、次のコードで十分です。

#!/bin/bash
Logfile=/var/log/sendmail-dummy.log
Tmpf=$(mktemp -t sendmail-dummy-XXXXXX.txt)
TmpCurlLog=$(mktemp -t sendmail-dummy-XXXXXX.txt)
trap 'rm -f ${Tmpf} ${TmpCurlLog}' 0

Date=$(date +%F-%T)
echo "[$Date] Caller: $(caller)" >>${Tmpf}
echo "[$Date] Caller: $0" >>${Tmpf}
echo "[$Date] Args: ${@}" >>${Tmpf}
echo "[$Date] Content:" >>${Tmpf}
while read line ; do
    echo $line  >>${Tmpf}
done
echo "" >>${Tmpf}

MailgunDomain="example.com"
# The key is assigned by Mailgun when signing up for free account 
Key="key-<some hex string>"
# not sure if the from-mail-addr has to belong to example.com
FromAddr="[email protected]"
# the to-mail-addr must be registered on Mailgun by showing you own it 
ToAddr="[email protected]"

curl -s --user "api:${Key}" "https://api.mailgun.net/v3/${MailgunDomain}/messages" \
     -F from=" <$FromAddr>" \
     -F to="${ToAddr}" \
     -F subject='Notification' \
     -F text="<${Tmpf}" > ${TmpCurlLog}
rc=$?

echo "----------------------------------------" >> ${Logfile}
echo "[$Date] curl result = $rc" >> ${Logfile}
cat ${Tmpf} >> ${Logfile}
echo "----------------------------------------" >> ${Logfile}
cat ${TmpCurlLog} >> ${Logfile}
echo "" >> ${Logfile}
echo "++++++++++++++++++++++++++++++++++++++++" >> ${Logfile}

次のように使用できます。ポイント

ご覧のとおり、sendmailパラメータを解釈したり、本文から意味情報を抽出したりしません。すべての元の情報をEメール本文の序文に送信するだけです。

欠点は、いつか消える可能性のある商業企業の無料の非公開ソフトウェアサービスに依存することです。しかし、単純さを考慮すると、実際に失われることはありません。

背景情報で削除しました。サフィックス(sendmailを置き換えます)再起動時にネットワークエラーが発生したためです。これは、仮想マシンの実行のいくつかのあいまいな副作用が原因で発生する可能性がありますsystemd-nspawn。 (systemd-nspawnところで見事に動作します)。考えるとメールを送信この機能は、システム通知を送信する簡単な要件に比べて少し過剰です。喜んでダンプします。メールを送信機能は上記のソリューションを容易にし、デバッグを防ぎます。

答え1

はい。 Good Oldsendmailは初期のメールプログラムの1つであり、内部システムメッセージ(cron出力、ユーザー対ユーザー、root対ユーザーなど)とネットワークベースのメール。ネットワークインターフェイスでリッスンし、SMTPサーバーとして機能するように構成することが/usr/bin/sendmailできます。

これで、Postfix、Eximなど、選択できる他のメールサーバーが多すぎます。 2つのメールシステムが共存する必要があるか、または他のメールシステムがsendmail内部システムに関連する損傷を防ぐために、まったく同じオプション/動作を提供する必要があります。メッセージ。

したがって、いくつかのオプションがあります。

一部のメールプログラムをインストールおよび/または構成し、スマートホストまたはリレーホストとして機能するように設定します。その役割はメールを受け入れることです。受信者がローカルでない場合、smtpdはメールクライアントとして機能し、ISP(または他のプロバイダ)メールサーバーに接続してメールを送信します。クイックGoogleは、mailgunを使用してPostfixを設定することはよく文書化されており、メールサーバーの設定に関する限り非常に簡単であることを示しました。私はpostfixが好きなので、他のメーラーオプションをチェックしていません。ローカル受信者は別のアドレスのエイリアスを使用したり、~/.forwardファイルを使用したりできます。

互換性のある代替ユーティリティを提供し、/usr/bin/sendmailHTTPS呼び出しを介してメールを送信するように構成できる他のユーティリティを見つけます。 (API呼び出しがサービスのようなRESTfulのようなものですか?)

それでも機能しない場合は、もう1つのオプションがあります。お気に入りのテキストエディタを実行し、インクルードパスを確認してください。sendmail指定された動作の実装を直接作成してください。マニュアルページは、cron(例えば)他のプログラム/システムで予想される動作とオプションに関する良いアイデアを提供する必要があり、必要に応じていつでもソースコードを確認できます。

関連情報