12 Raspberry Piからメールを送れるようにする その2/2 (postfix簡易設定,mailコマンドの導入)

前回独自ドメインのメールアドレスを作成してレンタルサーバーからメールが送れるように設定しました。

今回はRaspberri Piからこのメールアドレスを使ってメールを送れるようにPsotfixの設定を行います。受信はセキュリティ設定とかが大変なのでレンタルサーバーに任せることにします。

プロバイダのメールやGmailを使ってRaspberry Piからメールを送信する場合の設定も記載しているので参考にどうぞ。(ただしこちらは普段使っていないので送信できることを確認したのみです)

参考URL
Lab Notebook:
お便利サーバー.com

なんでRaspberry Piからメールを送れるようにするかというと、Piサーバー上で動いているサービスプログラムからログやエマージェンシーの情報をメールで送りたい場合があるからです。
これらサービスは主にmailコマンドでメールを送ることになりますが、
mailコマンドはそのサーバ内のメールサーバ(MTA:Mail Transfer Agent)を使ってメールを送ります。
Raspbianでは標準でメールサーバが動いていないのでそのままではmailコマンドは使えません。
パソコンではメールソフトで直接プロバイダのメールサーバに接続してメールの送受信を行うのでパソコン内にメールサーバは必要ありません。
というのが色々調べてわかりました。

絵にするとこんな感じ
メール送信の流れ1

一方でメールサーバとして通常使われるsendmailやpostfixなどは高機能な反面、設定がとてもめんどくさいです。
メールサーバーを自前で立てるメリットはありますが(容量無制限でメアド作り放題とか)
きちんと設定しないとスパムメールの送信サーバとして使われたり、サーバが壊れたときにメールを失ったりと
正直苦労に見合うメリットがあるとは(私の場合は)思えない。

やりたいことはmailコマンドでメール送信できるようにしたいだけなので、
プロバイダやレンタルサーバーやGmailのメールサーバに転送させる(リレーさせる)ように設定します。
本当は設定が簡単なssmtpを使いたかったのですが、rootへのメール転送設定がうまくいかない。。。
仕方がないのでpostfixを簡易設定してLAN内からの送信のみを許可し、外部から接続しての送信や受信はできない設定にします。

一応今後の読みとしてはVPN(バーチャルプライベートネットワーク)の設定をして外部からLAN内のような操作ができるようになるはずなので
外部からのメール送信もそれで解消できるはず。(もっとも外部からRaspberry Pi経由でメールを送る場面ってのもあまり考えられないけど)

設定後のイメージは以下
メール送信の流れ2

まずは、local(Rasberry Piのユーザー間)でのメールやり取りができるように設定します。
プログラムからroot宛にメールを送りたい時があるので。

①postfixインストール

postfixをインストールします。

sudo apt-get install postfix

途中で設定画面が出ますが、no configurationを選んで設定はデフォルトのままにします。

②postfixの設定

設定ファイルサンプルをコピー
sudo cp /usr/lib/postfix/main.cf /etc/postfix/

設定ファイルサンプルを元に修正していきます。
sudo vi /etc/postfix/main.cf

—- ここから —-
【ホストネーム】
一応設定しておく
75行目/83行目付近
myhostname = raspberrypi.example.com ←自分のドメインに変更したほうがよい?要調査
mydomain = example.com

【mailコマンドで@以後が省略されたときにつけるホスト名】
102行目付近
myorigin = /etc/mailname

【Raspberry Pi内からのみメールを送る】
120行目付近に追加
inet_interfaces = loopback-only
254行目付近 コメント解除
mynetworks_style = host
270行目付近(確認のみで変更なし)
mynetworks = 127.0.0.0/8

【自分宛と認識するドメイン名】
170行目付近に追加
mydestination = $myhostname, localhost

【他ソフトやコマンドと互換性確保】
# Sendmail
633行目付近に=以下を追加
sendmail_path = /usr/sbin/sendmail

# newaliases コマンド
638行目付近に=以下を追加
newaliases_path = /usr/bin/newaliases

# mailq
643行目付近
mailq_path = /usr/bin/mailq.postfix

【グループ設定】
# /etc/group に postdrop グループが追加されているはずです。
649行目付近
setgid_group = postdrop

【パスの設定】
# Postfix HTMLファイルを置くパス。使わないので no
653行目付近
html_directory = no

# man の設置パス
657行目付近
manpage_directory = /usr/share/man

# サンプルとドキュメントのパス
662行目付近
sample_directory = /etc/postfix
666行目付近
readme_directory = /usr/share/doc/postfix

—- ここまで —-

一応ここまででローカルメールは送れるようになったはず。
postfixを起動
sudo service postfix start

メール送ろうとしてmailコマンドが無いと怒られた(汗
mailコマンドを入れるためにmailutilsをインストール
sudo apt-get install mailutils

う、送れない。。。
ログを確認
cat /var/log/mail.log

[12397]: error: open database /etc/aliases.db: No such file or directory

どうやらメールエイリアスデータベースというのを作成しないといけないらしいので作成します。
sudo service postfix stop
sudo newaliases

postfixを再起動
sudo service postfix start

ローカル内でメール送信のテスト
mail root
Cc:
Subject: test
local mail sending test
.
Ctrl+Dを押す

おぉ~送れた~!
ルートになってメールを確認
su –
Password: パスワードを入力

メール確認
mail

最初に送れなかったメールも含めて3通メールきた!
?のところにqを入力してmailコマンドから抜ける。

ルートからログオフ
exit

リレーSMTPとして設定

参考URL
Raspberry PiとArduinoの工作室
水銀室 SMTP-AUTHを使って上位メールサーバへ転送する

Localでメールの送信ができるようになったので本題のリレー設定(他のメールサーバーに処理を任せる)を行います。
本設定と参考URLとの違いは、Rasberry Pi~メールサーバ間の通信を暗号化するようにしてます。
暗号化しないとメール送付時にネット上をIDとパスが平文でやり取りされてしまいます。
スキルがあれば読み取られる可能性があります。ガクガク((( ;゚Д゚)))ブルブル
(※ちなみにメールサーバーから先に送られる内容(メール本文など)は暗号化されません。メールなんて実はプライバシーの無いものなんですね。怖い怖い)

設定ファイルの編集

再度設定ファイルを編集します。
sudo vi /etc/postfix/main.cf

————以下設定ファイルの変更内容—————-
【通信プロトコル】
667行目付近
inet_protocols = ipv4 (変更なしだったと思う。コメントアウトされていたら#を外す)

【リレー設定の追加】
以下設定を設定ファイルの最後に追加

relayhost=[mail.example.com]:587 ←[]内は自分のメールサーバを記入。[]付にするとIPアドレスへ自動変換してくれる。
sender_canonical_maps = regexp:/etc/postfix/canonical
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password ←アカウント情報のファイル(次に作成)
smtp_sasl_mechanism_filter = cram-md5 ←通信方式はMD5暗号化通信にする

——————ここまで———————-

【メモ】
参考URLの設定内容で”smtp_sasl_security_options = noanonymous”と記載している部分は平文での送信を可能にしている記述なので消してます。
この部分のデフォルト設定は”smtp_sasl_security_options = noanonymous,noplaintext”になっていて、匿名と平文での通信を禁止しています。
これを匿名での通信禁止のみで上書きすることで平文での通信を可能にしてるわけですが、嫌なのでデフォルト設定のままにしてます。

設定ファイルの編集はここまで。

【アカウント情報ファイルの作成】

次にアカウント情報のファイルを作成します。設定ファイルに記載したのと同じ場所に同じ名称でファイルを新規作成してアカウント情報を書きます。

sudo vi /etc/postfix/relay_password

記載方法は以下の書式です。
メールサーバ ログインID:ログインパス

記載例
mail.example.com yourID:yourpassword

元ファイルはIDとパスが平文で書かれているのでパーミッションを変更してroot以外のユーザーが読めないようにします。
root以外のユーザーが読めないようにします。(重要なので2回書きました。)
sudo chmod 400 /etc/postfix/relay_password

作成したファイルからhashを作成します。
sudo postmap hash:/etc/postfix/relay_password

送付時のFromの設定

次に送信時にメールサーバへ送られるFromの設定を書き換えるように変更します。
この設定をしないと、”RPiのユーザー名@myhostnameで設定したホスト”というメールアドレスでメールを送信しようとします。しかし、myhostnameを存在しないホスト名を設定していると、メールサーバに接続を弾かれてしまいます。そこで、Fromの情報を存在するメールサーバの情報に書き換えてあげることでこの問題を回避します。ちゃんとmyhostnameを設定すればこの設定は必要ないのかもしれませんが未検証です。

設定ファイルをsender_canonical_mapで設定したファイル名で作成します。

sudo vi /etc/postfix/canonical

新規でファイルが開くので以下を記載
/.*/ yourID@example.com

yourID@example.comの部分はFromに設定したい実在するメールアドレスに変更します。(実際はホスト名だけ実在すれば大丈夫と思います)
プロバイダのメールサーバを使う場合、ここをプロバイダのメールアドレスにしてください。そうしないと送れない場合があります。

設定は以上。Postfixを再起動します。
sudo service postfix restart

コマンドから外部へメールを送ってみます。
echo “test mail from RPi” | mail -s “test mail” yourID@example.com

ちなみにlocal内でのメール送付は上記の最後のメールアドレス部を送付先のユーザー名に変更
こんな感じ
echo “test mail from RPi” | mail -s “test mail” root

もし送れない場合に参照するログは/var/log/mail.logです。

root宛のメールを転送する

2014年4/26追記
参考URL
68user’s page UNIXの部屋

Postfixの設定で転送設定も可能なんだけど今回はホームディレクトリ以下に.forwardファイルを作る方法でやってみようと思う。
設定をいじるのが面倒なのと、root取られなきゃ見れないので比較的安全かなぁと思うので。

sudo vi /root/.forward

書式は単にメアドを書けばよいです。カンマで区切って複数のアドレスを指定できます。元のメールを残しておきたい場合はユーザー名の頭に\をつけて初めに記載。

記載例は↓こんな感じです
\root,yourmail1@example.com,yourmail2@example2.com

保存したらパーミッションを一応600にしておく
sudo chmod 600 /root/.forward

ルート宛にローカルメールを送って確認
echo “mail forward test” | mail -s “fw test” root
(2014年4/26追記ここまで)

mailコマンドで添付ファイルをつけられるようにする

(2014年4月27日追記)
参考URL
shibainu55日記
深森音欲

メールに添付ファイルをつけたい時があるのでmailコマンドと組み合わせて添付ファイルをつけられるuuencodeコマンドを使えるようにする為、sharutilsをインストールします。
また、ファイルの圧縮ができるようにzipをインストールします。(ちなみにunzipはインストールされてました)
sudo apt-get install sharutils
sudo apt-get install zip

添付ファイル付きメールのテスト用にファイル作成
vi ~/test.txt
新しいファイルができるので適当なテキストを入力して保存終了。

テスト用ファイルを圧縮
zip test.zip test.txt

添付ファイル送付のテスト(yourmail@example.comの部分は自分のメアドに変えてください)
test.zipをattach.zipとしてメールに添付してyourmail@example.comへ送付。
題名は「attachment test」
uuencode test.zip | mail -s “attachment test” yourmail@example.com

本文もつけて送る場合のコマンド例
本文:mail test with messages and attachment
添付ファイル:test.zipをattach.zipとして添付
題名:subject
送付先:yourmail@example.com

(echo “mail test with messages and attachment”; uuencode test.zip attach.zip) | mail -s “subject” yourmail@example.com

(2014年4月27日追記ここまで)

今回は以上です。
(と思ったけど、gmail向けのリレー設定例も以下に書いておきます)
———————————

【gmail向けのリレー設定例】

/etc/postfix/main.cfの最後のリレー設定部分。
relayhost = [smtp.gmail.com]:587
sender_canonical_maps = regexp:/etc/postfix/canonical
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_mechanism_filter = cram-md5, login, plain
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
smtp_use_tls = yes
smtp_sasl_security_options = noanonymous

/etc/postfix/relay_passwordの設定例
smtp.gmail.com yourID@gmail.com:yourpass

/etc/postfix/tls_policyを以下の内容で作成し、sudo postmap hash:/etc/postfix/tls_policyでhash化
[smtp.gmail.com]:587 encrypt

ポストフィックスを再起動すればいけるはず。
gmailでは暗号化通信の設定がうまくいかず。。無念。

ほんとにおしまい。

2014年4月13日作成
2014年4月26日追記 (ルート宛のメールを転送する追加)
2014年4月27日追記 (mailコマンドで添付ファイル送れるようにする追加)
2014年5月5日草稿公開
2014年6月15日誤記訂正
2018年6月10日リンク修正

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. […] 参考 12 Raspberry Piからメールを送れるようにする その2/2 (postfix簡易設定,mailコマンドの導入) Outlook を使ってメールを送信できません。”554 5.7.1 : Client host rejected: Access denied” とい […]