%20%E3%81%8A%E3%82%88%E3%81%B3%20msmtp%20%E3%81%8B%E3%82%89%E3%81%AE%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB%20%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
cron で電子メールを送信するのに問題がありました。私の ISP では、「From:」フィールドが電子メールの送信元の電子メール アドレスと一致する必要があります。一致しない場合は電子メールが拒否されます。cron は「From:」フィールドを「root (Cron Daemon)」にハードコードするため、これらの電子メールは送信されません。
msmtp をセットアップし、コマンド ラインから問題なく電子メールを送信できます。実際、電子メール自体を送信するスクリプトにいくつかの cron ジョブをラップしました。これは問題なく動作しますが、より洗練されたソリューションが必要です。
当初は、パッケージ を使用しましたがmsmtp-mta
、これは/usr/lib/sendmail
へのシンボリックリンクで、cron が msmtp を使用してメールを送信するようになっています。これが機能しなかったため、パッケージを削除し、代わりに標準入力から読み取り、適切なヘッダーを持つメールを送信する/usr/bin/msmtp
bash スクリプトを配置しました。/usr/lib/sendmail
#!/bin/bash
HEADERS="To: <myemail>
From: Cron <myotheremail>
Subject: Vixie-cron snooper ($@)
"
INPUT=$( cat /dev/stdin )
echo -e "$HEADERS""Stdin:\n$INPUT\n" | msmtp <myemail>
echo "$HEADERS""Stdin:\n$INPUT\n" > /tmp/vixielog
しかし、これは期待した効果がありません。ほとんど空のメールが届き、/tmp/vixielog
そこには次のような内容が書かれています。
To: <myemail>
From: Cron <myotheremail>
Subject: Vixie-cron snooper (-i -FCronDaemon -oem <myemail>)
Stdin:
メールは適切なタイミングで届くので、cron ジョブが適切に実行されていることはわかりますが、出力を取得できません。このアプローチを調整して、コマンドの出力をメールで取得するにはどうすればよいでしょうか?
答え1
最終的に、次の解決策にたどり着きました。 を使用する代わりにmstmp-mta
、MTA として機能する独自のシンプルな bash スクリプトを作成しました。 に配置すると/usr/sbin/sendmail
、From ヘッダーが置き換えられ、電子メールが に送信されます。
#!/bin/bash
sed -e "s/From: root (Cron Daemon)/From: WHATEVER YOU LIKE/" | msmtp $BASH_ARGV
この問題に対する簡単な解決策を求めている他の人にとって、これが役立つことを願っています。
答え2
メール ヘッダーから送信元を知る必要はありません (以前の投稿では From: root (Cron Daemon) となっています):
#!/bin/bash
# /usr/sbin/sendmail
# We write the sent letter to the stdin variable
stdin=$(cat)
# Text to which we will replace the From header:
__REPLACE_WITH="sender name <[email protected]>"
# Find the text between From: and To :, write it to the __FIND_WHAT variable.
__FIND_WHAT=$(echo $stdin | grep -o -P '(?<=From: ).*(?=To:)')
# grep command (above) adds a space to the variable at the end of the line. It must be deleted, otherwise the text replacement will not work.
# Remove the space at the end of the variable
__FIND_WHAT=$( echo $__FIND_WHAT | sed -e 's/\s$//g' )
# Replace the text __FIND_WHAT with __REPLACE_WITH
mail=$(echo "$stdin" | sed -e "s/$__FIND_WHAT/$__REPLACE_WITH/" )
# Send a letter, with the correct sender in the header of the letter.
echo -e "$mail" | msmtp $BASH_ARGV
答え3
システムメール用の小さなラッパーを作成しました。これは /etc/aliases を解析し、正しい形式でメールを送信します (/usr/sbin/sendmail 経由)。
#!/bin/bash
stdin=$(cat)
mail=$(echo "$stdin" | sed "s/From: root (Cron Daemon)/From: ${4} ${4}@domain.com/g")
if [ -f /etc/aliases ]; then
if [ "grep ${1} /etc/aliases" != "" ]; then
exec < /etc/aliases
while read line
do
if [[ $line =~ ^${1}:\ (.*)$ ]] ; then
addr=${BASH_REMATCH[1]}
else
if [[ $line =~ ^default:\ (.*)$ ]] ; then
addr=${BASH_REMATCH[1]}
fi
fi
done
echo $addr
fi
else
addr="[email protected]"
fi
mail=$(echo "$mail" | sed "s/To: ${4}/To: ${addr} /g")
echo -e "$mail" | msmtp --auto-from=on --read-envelope-from --maildomain=domain.com -t
デフォルトのメールとメールドメインを変更するだけです
答え4
msmtp-mtaから送信されるすべてのメールに同じ「From」ヘッダーを付けても構わない場合は、次の設定を使用できます。エイリアスファイルは、ローカル受信者(例:)が機能するのに便利ですroot
。
/etc/msmtprc:
account default
...
from [email protected]
# or from %[email protected]
set_from_header on
aliases /etc/aliases
/etc/エイリアス
default: [email protected]