またどこかのCTOになった人のブログ

またどこかのCTOになった人が書いてます。最近はCakePHP3とConoHaのネタが多いです。

稼働中のメールサーバ経由で、別サーバからメール送信してみた。

偉そうにサーバ構築なんてやっています。
まぁ常にタコ糸で綱渡りしているのは間違い無いのですが。
カンニングペーパー代わりのEvernoteが成長しています。

さて。
今回は偉そうなことをやってみました。

やりたかったこと

ConoHaで立てた稼働中のメールサーバ経由で、別サーバからメール送信する必要が出て来ました。
別サーバというのはWordpressのサーバなので、プラグイン使ってポイーっとメール送信すればいいのですが、そのサーバ上にランディングページ用の別ディレクトリを切って、そこに配置したお問い合わせフォームからメール送信という仕様です。

え。普通にWordpressに置けばいいじゃん。

とも思ったのですが仕方がありません。
あまり時間もなかったので、お問い合わせフォームはこちらを使わせて頂きました。

www.php-factory.net

どうもありがとうございます。

ちょっと考えてみた

アレです。
要はフォームが載っているサーバから、メールサーバの送信情報を使ってサクっとやればいいのです。
かんたん。かんたーん。

と思ったのが間違いでした。
よく思い出せばよかったのです。自分はインフラが嫌いだということを。
ここ最近、サーバをさわる機会が多かったので勘違いしていました。

以下、このように記載することにします。

・サーバA:Wordpressが載っているサーバ
・サーバB:メールサーバ(固定IPアドレスを振っています)

と、操作はrootでやってます。
OSはCentOS7です。
apacheは2.4です。

とりあえずsendmailをインストールしてみた

既に入っていればいいですが、入ってなかったらインストールしましょう。
CentOSって最初から入ってなかったっけ、などと思いながらyumちゃんにお願いしました。

$ yum install sendmail
$ yum install sendmail-cf

yumちゃんがいい感じにインストールしてくれます。
sendmail-cfの方は後で使うかもしれませんので、まとめて入れてしまいましょう。
ちなみに今回は使ってません。

何となくサーバAのホスト名を変更してみた

何かよくわかりませんが、ホスト名を変更してみました。

$ hostnamectl set-hostname xxxxx.com

上記のコマンドでホスト名が変わります。
変わるのですがこのままだとちょっと都合が悪いので、以下の処理も続けて実施します。

$ vim /etc/cloud/cloud.cfg

# 「- update-hostname」部分をコメントアウト
# - update-hostname

やってやりました。
ホスト名なのですが、自分の場合「メールドメインWordpressサーバドメインが同一」だったので、こちらのホスト名は別の名前に変えてしまいました。
srv.xxxxxxx.comみたいな感じです。

SMTP送信設定をしてみた

いよいよコアな部分です。ドキドキします。
sendmailをインストール後、「/etc/mail/」配下のファイルをごにょごにょします。

ここにsendmailの設定ファイルの数々がいらっしゃいます。
次にSMTP送信設定用の「authinfo」とかいうそれっぽい名前のファイルを開きましょう。
以降のvimコマンドなどは、こちらのディレクトリ内で叩いているという解釈でお願いします。

$ vim /etc/mail/authinfo

開いたらここにSMTP送信設定を記載します。
SMTP送信設定はメールサーバの方にきっとあることでしょう。
2行でセットです。

AuthInfo:SMTPサーバホスト名 "U:メール送信元の対象アドレス" "P:メール送信元の対象アドレスパスワード" "M:PLAIN"
AuthInfo:SMTPサーバホスト名:ポート番号 "U:メール送信元の対象アドレス" "P:メール送信元の対象アドレスパスワード" "M:PLAIN"

SMTPサーバホスト名部分がIPアドレスでもOKなのかは試してないです。
まぁホスト名をブチ込んでおけばいいんじゃないかと。
ConoHaのメールサーバの場合はサーバ詳細の部分に書いてあります。
多分、以下のような感じになるかと思います。

AuthInfo:smtp.xxxxx.aaaaaa.com "U:info@xxxxxx.com" "P:abcdefg12345" "M:PLAIN"
AuthInfo:smtp.xxxxx.aaaaaa.com:587 "U:info@xxxxxx.com" "P:abcdefg12345" "M:PLAIN"

ポート番号は大部分が「587」だとは思いますが、メールサーバに合わせて適宜修正して下さい。

sendmail.mcを修正して、sendmail.cfを作成することにした

ボスの登場です。
こいつが手強かったです。
が、以下のような感じの修正でできると思います。

sendmailの送信にはsendmail.cfを使用するのですが、sendmail.mcファイルを修正してcfファイル(コンフィグファイルらしいです)を生成するのが一般的だそうです。

$ vim /etc/mail/sendmail.mc

## 以下の設定を編集して下さい。
## コメントアウトするものと追記が必要なものは一応書いてみました

define(`confAUTH_OPTIONS', `A')dnl #コメント解除
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl #コメント解除
TRUST_AUTH_MECH(`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl #追記する
FEATURE(`authinfo', `Hash -o /etc/mail/authinfo')dnl #追記
define(`SMART_HOST', `SMTPサーバホスト名')dnl #コメント解除して編集
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl #追記
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl #追記
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl #コメントアウト
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl #追記
LOCAL_DOMAIN(`設定したサーバAのホスト名')dnl #コメント解除して編集
MASQUERADE_AS(`メール送信するサーバBのドメイン名')dnl #コメント解除して編集
FEATURE(masquerade_envelope)dnl #コメント解除

雑ですみません。
.mcファイルさんはコメントアウトに「dnl」という謎の文字列を使うそうです。
見慣れませんが仕方がないです。

accessファイルを編集してみる

このファイルはメールのリレー設定に使うファイルです。
否認とかにも使えます。
その辺はGoogle先生がきっと教えてくれます。

今回はサーバAから送信する時、サーバBを使いたいだけなのでリレー設定だけです。
偉そうに書いてる風味ですが、あまりよくわかっていません。

$ vim /etc/mail/access

Connect:サーバBのIPアドレス  RELEY

きっと「指定したIPアドレスにリレーしますよ!」っぽい何かだと思います。
多分。

mailertableとかいうものも編集してみる

これは「送信元のメールドメインはここですよ!」ファイルだと思われます。
そんな感じでいいんじゃないですかね!

$ vim /etc/mail/mailertable

送信元のメールドメイン  smtp:SMTPサーバホスト名

実際の記載例だとこんな風になると思います。

sample.com  smtp:smtp.sample.com

smtp:〜部分はダブルクォーテーションなどで囲わないようにして下さい。
何か上手くいかなかった模様です。

できたっぽい気がするのでsendmailを再起動してみる

上記の設定を反映させるために再起動します。
ひとつひとつの設定からファイルを生成する方法もあるのですが、ボスファイルである「sendmail.mc」の方に再起動したら新しいファイル作ってやるぜ設定が書いてあるので、sendmail再起動でいいかと思います。

$ systemctl restart sendmail

再起動コマンドはOSによって違うと思いますので、その辺はフィーリングで。

ついでにapacheも再起動しておきました。

$ systemctl restart httpd

うまく設定できたか試してみた

と、上記の設定が上手くできていればいいなと祈りながら、以下のコマンドを打ってみましょう。

$ sendmail -bv メールアドレス
# 実際には送信されません
# sendmail -bv aaaaa@sample.com みたいな感じでコマンドを打ちます

これを実行して上手いことできていると、以下のようなログが流れます。

$ sendmail -bv aaaaa@sample.com
aaaaa@sample.com... deliverable: mailer smtp, host smtp.xxxxxx.sample.com, user aaaaa@sample.com

で き て い る

そもそも何故こんなことをしたのか

問い合わせが入った時、管理側と投稿者に「問い合わせきたよー」メールを送信したかったのです。
投稿者の方は問題ないのですが、管理側の方が上手くいきませんで。
よくよく考えたら、ローカルホストに対してローカルホストユーザにメールをするわけなので、そのユーザがいないと「User unknown」と無慈悲なエラーログが表示されてしまいます。

で、今回やってみたのですが果たしてこれでいいのか。
少々不安なのですが、概ねいいでしょう。