RaspberryPiやUbuntuなどのLinux環境において、スクリプトからメールを送信する方法を紹介します。
この方法では、postfixなどでMTAを構築せずとも、メールを送信することができます。
なお、メールを受信する方法ついてはこちらのページで解説しています。

前提:
・ここで紹介する方法は、Ubuntu、Raspbianで確認しました。その他のOS、ディストリビューションで正しく動作するかは未確認です。
・メール受信の方法についてはここでは紹介しません。こちらのページを参照ください。
・使用するSMTPサーバの認証方式によっては、ここで紹介する.mailrcの設定以外に、必要な項目がある可能性があります。ここでは楽天メールを使用した場合の一例に留めます。
(2021/02/07追記)Gmailの例も追記しました。

mailxコマンドのインストール:
メールを送るために、mailxコマンドを使用します。
mailxコマンドを使うことで、MTAを構築せずに、直接SMTPサーバへメールを転送することができます。
以下のコマンドでmailxコマンドをインストールしてください。
sudo apt-get install heirloom-mailx
なお、既にインストールされているかどうかは、下記のコマンドで確認してください。
sudo dpkg -l | grep mailx
ii  heirloom-mailx                        12.5-4                                    armhf        feature-rich BSD mail(1)
上記のように、 heirloom-mailx が出力された場合は、インストール済みなので不要です。

.mailrcの作成:
 スクリプトを実行するユーザーのホームディレクトリ(~)に、.mailrcを作成します。
内容は下記の通りです。
vim ~/.mailrc ←vimエディタで作成。viでもnanoでも何でも良いです。
.mailrcの内容:
set smtp=smtp://mail.gol.com:587
set from=xxxxxxx@gol.com
set smtp-auth-user=xxxxxxxx@gol.com
set smtp-auth-password="xxxxxxxx"
set smtp-use-starttls

(2021/02/07追記)Gmailの場合、.mailrcの内容は以下となります。
SMTPS(SMTP over SSL/TLS)を使う場合:
set smtp=smtps://smtp.gmail.com:465
set from=xxxxxxx@gmail.com
set smtp-auth-user=xxxxxxx@gmail.com
set smtp-auth-password="xxxxxxx"
STARTTLSを使う場合:
set smtp=smtp://smtp.gmail.com:587
set from=xxxxxxx@gmail.com
set smtp-auth-user=xxxxxxx@gmail.com
set smtp-auth-password="xxxxxxx"
set smtp-use-starttls

※注意※
Gmailの場合、安全性の低いアプリの許可をオフにしていると、認証で拒否されてしまい、メールを送ることができません(デフォルトでオフになっているため注意)。
こちら(Googleのサイト)を参照し、安全性の低いアプリの許可をオンにしてください。
これはGoogleがOAuth2.0という認証方式を推奨しているためで、現状mailxコマンドではOAuth2.0の認証を行うことができません。
mailxは開発が終了しており、s-nailというコマンドが現在活発に開発されているようなので、今後そちらでOAuth2.0に対応するかもしれません。続報があればまたこの記事を更新したいと思います。

.mailrcの解説:
これらの設定値は各メールサービスによって異なるので、利用するメールサービスごとに読み替えて設定してください。
set smtp=smtp://mail.gol.com:587
送信メール(SMTP)サーバの指定と、通信ポートの指定。
利用する送信元サーバーの暗号化通信方式によって指定が異なります。
この例の場合だと、暗号化通信方式がSTARTTLSという方式であり、587ポート(サーバによって異なる場合あり)を指定しています。
Gmailの場合は、SMTPS(SMTP over SSL/TLS)という方式もサポートしており、SMTPS(SMTP over SSL/TLS)を使う場合は smtps://と、sを付けてサーバーの指定を行い、ポート番号は465を指定します。
また、STARTTLSを利用する場合は、.mailrcに以下の指定を追加します。
set smtp-use-starttls
この指定をしなければ、以下のようなエラーメッセージが出て送信できない場合があります(これもサーバ側のセキュリティ機能です)。
smtp-server: 530 5.7.0 Must issue a STARTTLS command first.

set from=xxxxxxx@gol.com
送信元メールアドレス

set smtp-auth-user=xxxxxxxx@gol.com
SMTP認証のユーザ名。サーバーにもよりますが、一般的にはメールアドレスです。

set smtp-auth-password="xxxxxxxx"
SMTP認証のパスワード。
パスワードをファイルとして残すのに懸念がある場合は、以下のように-Sオプションを使うことでコマンドラインで指定することも可能です。
mail -s "SUBJECT" -S smtp-auth-password="xxxxxxxx" xxxxxxxx@hotmail.co.jp </home/hoge/msg.txt



メール送信:
ここまでで準備は完了したため、あとはメールを送るだけです。
以下のコマンドでメールを送信してください。
mailx -s "SUBJECT" xxxxxxxx@hotmail.co.jp < /home/hoge/msg.txt

SUBJECTがメールの件名です。
xxxxxxxx@hotmail.co.jpが宛先メールアドレスです。
/home/hoge/msg.txtの中身が本文です。

本文をファイルから入力しない場合、以下のようにパイプで渡すこともできます。
echo "HONBUN" | mailx -s "SUBJECT" xxxxxxxx@hotmail.co.jp

また、件名、宛先、本文を指定しなければ、対話モードでメールを作成します。この時、件名、宛先を入力した後のEnterで何も表示されなければ、本文入力の開始です。本文の入力の終了はCtrl+Dを入力します。

スクリプトでメールを作成する場合は、本文をテキストファイルで出力しておいて、mailxコマンドの入力にすることが多いでしょう。この時、cronなどでmailxコマンドを実行する場合は、ファイルの入出力は絶対パスで指定しないと、相対パスで意図しないパスを見てファイル入出力が正しく行われなかったりするので、気をつけましょう。

参考書籍:Linuxコマンドポケットリファレンス

この記事が参考になりましたら、他の方へもシェアしていただけると嬉しいです。

スポンサードリンク