ローカル環境でJenkinsを動かす時のSMTPサーバの設定
<記事概要>
ローカル環境でJenkinsを動かしたかったが、Jenkinsからのメール通知の設定で詰まったので、その備忘録。
GmailのSMTPサーバが使えるみたいだが、Gmail側の設定でセキュリティ強度を下げる必要があるそうで、それは個人的に嫌なので別の方法を試す。
最終的にはJenkinsとPostfixを使って、Jenkinsからの通知メールを確認できるようにした。
<動作環境>
■操作端末(ブラウザでJenkinsを操作するために使用)
OS:Windows10
■Jenkinsインストール端末兼、SMTPサーバ用端末
OS:CentOS7

<作業手順>
Linux端末にJenkinsをインストール
以下のサイトを参考にした。一応実行コマンドを載せておく。コマンドはrootユーザで実行
https://weblabo.oscasierra.net/jenkins-install-centos7/
僕の環境ではファイアウォールが有効で、そのままだとウェブブラウザからJenkinsのダッシュボード画面にアクセスできなかったので、ポートの設定も変更。(ローカル環境で動かすだけなのでセキュリティのことはあんまり考えていない…)
# Jenkinsおじさんは実行にJREが必要
yum -y install java-1.8.0-openjdk
# yumリポジトリの追加
curl -o /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# Jenkinsインストール時に使用する公開鍵をインストール
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# Jenkinsのインストール
yum -y install jenkins
# ポート開放。ポート8080はJenkinsのデフォルトの利用ポート番号
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# ファイアウォールの設定を反映
firewall-cmd --reload
# Jenkinsの起動
systemctl start jenkins
Windows端末からブラウザ経由でJenkinsにアクセス
URLは”http://Linux端末のIP:8080/”

Postfixの設定
僕のLinux環境にはすでにPostfixがインストールされていたので、インストールは省略して設定ファイルを変更。以下コマンドを実行して設定ファイルを変更。
# Postfixの設定ファイルの変更
vi /etc/postfix/main.cf
設定に関しては以下サイトを参考にした。③のリンクで変更する設定項目を確認。①のリンクと②のリンクで設定項目がどのような意味を持つのか確認。
①http://www.postfix-jp.info/trans-2.1/jhtml/postconf.5.html
②https://www.rem-system.com/mail-postfix01/#3_postfix
③https://www.kagoya.jp/howto/webhomepage/postfix/
ひとまずローカル環境でJenkinsのビルド結果通知メールが確認できさえすればよいので、設定の変更は最低限にした。
行 | 変更前設定項目 | 変更後設定項目 |
75 | #myhostname = host.domain.tld | myhostname = localhost |
98 | #myorigin = $myhostname | myorigin = $myhostname |
113 | #inet_interfaces = all | inet_interfaces = all |
164 | #mydestination = $myhostname, localhost.$mydomain, localhost | mydestination = $myhostname, localhost.$mydomain, localhost |
419 | #home_mailbox = Maildir/ | home_mailbox = Maildir/ |
■設定項目に関して
・myhostname
ホスト名ということでlocalhostを設定。後述のmyoriginの値となる。
・myorigin
上記参照リンクの①を見ると、”ローカルで投函されたメールはそこから来たように見え、 またローカルで投かんされたメールはそこに配送されます。”と記載あり。今回の環境では送信元も送信先もLinux端末なので、myorigin = $myhostnameで問題なし。
・inet_interfaces
上記参照リンクの①を見ると、”このメールシステムがメールを受け取るネットワークインターフェース アドレス”との記載あり。メールの送受信はLinux端末内で完結しているので、”inet_interfaces = localhost”でいけると思ったが、テストしてみたらダメだった。”inet_interfaces = 「hostnameコマンドの戻り値」”でもダメ。”inet_interfaces = 「Linux端末のIPアドレス」”ならメール送信ができた。名前解決できていなかったのが原因か?面倒なので設定値を”all”に。
・mydestination
メール宛先の@以降とmydestinationの設定値が一致する場合は、Postfix(MTA)はメールを自ホスト宛のメールと判断。ローカルで送信されたメールの@以降は、myoriginの値となる。
・home_mailbox
メールの格納先を表す。Linuxユーザのホームディレクトリからの相対パスで記載。表の設定だと、”/home/ユーザー/Maildir/”配下にメールが格納される。設定値の末尾の”/”の有無でメールの格納の方法が変わる。”/”有りの場合は1メールが1つのファイルとして格納される。”/”無しの場合はすべてのメールが1つのファイルに格納される。
Jenkinsからテストメールを送信
①ダッシュボードから「Jenkinsの管理」
②「システムの設定」
③画面最下部の「E-mail 通知」の「SMTPサーバ」にLinux端末のIPアドレスを指定、
「メールを送信して設定を確認」のチェックボックスをチェック、
「テストメールの宛先」に適当なLinuxユーザ名を指定する。(ex…ルートユーザならrootだけで大丈夫。
※宛先の@以降はPostfixの設定ファイルに記載されたmyoriginの値が自動的に付与される。前述のmyoriginの説明参照)
最後に「設定を確認」ボタン押下。



「メールを正常に送信しました」と画面に表示されるが、実際にはメールが送信されていないこともあるので、メールログとメールボックスを確認する。
メールの確認
とりあえず、メールログを確認。メールログの場所はだいたいここ。”/var/log/maillog”
送信ステータスが”sent”になっているので送信されているっぽい。

実際のメール確認。メール格納場所は”/home/適当なユーザ/Maildir/new”。1つのメールの内容が1つのファイルに格納される。
メールの中身をのぞいて見ると、ヘッダとボディ部の中身が格納されていることが分かる。ただ件名やメッセージの内容など一部Base64でエンコードされているので、これを読むには面倒だがデコードする必要がある。


上記画像の赤破線部がメールのヘッダで、赤実線部がメールのボディ、黄色実線部がBase64でエンコードされた部分。多分・・・。
試しにメールボディ部をデコードしてみる。
コマンドは「echo ‘base64文字列’ | base64 -d」。ちゃんとJenkinsからのテストメールが届いているが確認できる
