sendmail転送設定を(なるべく簡潔に)完結させる

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
sendmail転送設定のお届けでーす

この記事を三行にまとめると

メリークリスマース!
シャンパンを注文するよりも楽勝さ
知らねーよそんなの\(*`∧´)/
メリークリスマース! 今日はクリスマスイブですねー。みなさんはいかなる性夜……いえ、聖夜をお過ごし?

僕は「クリスマス? 何ソレ? オイシイノ?」って感じなので、マンネリ気味のカップルが性なる夜に新しい快楽を開発している裏で、せっせとシステム開発をしております。

ってことで、今日はsendmailの転送設定についてのお話を、サンタさんに変わってお届けします。例えば「akatsuki@norm-nois.com」というアドレス宛てのメールを「akatsuki@hogehoge.jp」とかに転送したいとか、そんな話です。

僕は今回AWSのEC2でこの設定をやったんで、それ前提で話して行きますが、たぶん他のサーバーでも設定方法は一緒だと思います。ここに書いてあること以外の手順が必要な場合もあると思うけど、そのときは……すまん!!

EC2のインスタンスはデフォルトでsendmailが動いているようなので、特にこれといった設定をしなくてもメールの送受信ができます。サーバーによってはsendmailのインストールとかから始めなきゃいけない場合もあるでしょうが、そのときは……すまん!!

一応、ここに書いてあることだけやれば転送できるはずなんですが……僕自身はかなりごちゃごちゃといろいろ調べたり余計な手順を踏んだ後に設定が完了したこともあって、もしかしたらここに書いてあること以外で必要な手順があるかもしれない。そのときは……すm



余計な説明など要らぬという人は

タイトルでもなるべく簡潔に完結とか韻を踏んじゃってますんで、ごちゃごちゃと説明されんのがウザいって場合はここだけ読んでください。たぶんこれで行けるはずだから。

ここでは冒頭でも書いた「akatsuki@norm-nois.com」宛てのメールを「akatsuki@hogehoge.jp」に転送するという例で行ってみます。

//ユーザーを追加
# useradd akatsuki

//aliases設定
# vi /etc/aliases
akatsuki: akatsuki@hogehoge.jp

//設定を反映
# newaliases

//local-host-names設定
# vi /etc/mail/local-host-names
norm-nois.com

//virtusertable設定
# vi /etc/mail/virtusertable
@norm-nois.com %1

//設定を反映
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

//sendmail再起動
# service sendmail restart

これでメールを転送することができるようになると思います。できない場合は25番ポートが開いていないせいかもしれないので、まずはそれをチェック。もしそれでもダメな場合は、sendmail.mcの設定がアレかもしれない。

//m4とsendmail-cfのインストール
yum install m4 sendmail-cf

//sendmail.mc設定
# vi /etc/mail/sendmail.mc
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
→DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl

//設定を反映
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

//sendmail再起動
# service sendmail restart






こっからもうちょいだけ説明を足しつつ、上記で書いた作業をやって行きたいと思います。



ユーザーを追加

まずはユーザーを追加しないことには始まらない。「akatsuki@norm-nois.com」というメールアドレスを使いたいなら、「akatsuki」というユーザーが必要だ。でも大丈夫。追加なんてほんの一瞬さ。シャンパンを注文するよりも楽勝さ。

# useradd akatsuki
# passwd akatsuki

もしパスワードも設定するなら「useradd」でユーザーを作成した後に「passwd」でパスワードの設定もしときませう。



aliases設定

ユーザーが作成できたら、そのユーザー宛てに来るメールの転送先を指定する。メールアドレスは「akatsuki@hogehoge.jp」ってことにしときましょう。

転送設定は「aliases」というファイルで設定します。EC2の場合、「/etc」の直下に置いてあると思うので、それをviモードで開いて編集します。

# vi /etc/aliases

//以下の一行を追加
akatsuki: akatsuki@hogehoge.jp

編集が終わったら、この設定を反映させるために、以下のコマンドを実行します。

# newaliases

今回は外部のメーラーに転送する場合の設定を書きましたが、もしサーバー内の他のユーザーに転送したい場合、例えば「info」というユーザー宛てに来るメールをakatsukiに転送したいみたいなときも、書き方は一緒です。

//etc/aliasesに以下の設定を書く
info: akatsuki

上記の二つを組み合わせて書いとけば、「info@norm-nois.com」宛てのメールも「akatsuki@hogehoge.jp」に転送することができますね。



もし、一通りの作業が終わった後で、それでもメールが飛んで来ないって場合は、もしかしたらaliasesファイルの置き場所に問題があるかもしれない。

aliasesファイルの置き場所はsendmail.mcの中に書いてあります。

//sendmail.mc
define(`ALIAS_FILE', `/etc/aliases')dnl

もしこれが「/etc/aliases」じゃなくて別の、例えば「/etc/mail/aliases」とかになってたら、「/etc/mail」の直下にaliasesファイルを作るか、sendmail.mcの中身を直接書き換えるかのどっちかが必要になりやす。僕の場合は最初から「/etc/aliases」ってなってたから、特に何もしなかったけど。



local-host-names設定

自分で取得したドメインやらホスト名でメールを受信できるようにするには、「local-host-names」というファイルにホスト名を書く必要があります。

# vi /etc/mail/local-host-names

//以下の一行を追加
norm-nois.com

これだけ。



virtusertable設定

local-host-namesで「norm-nois.com」って書いとけば、それだけで@norm-nois.comのメールアドレスが使えるようにはなるみたいなんですが、今回はvirtusertableの設定もやったので、一応それについても書いときます。

# vi /etc/mail/virtusertable

//以下の一行を追加
@norm-nois.com %1

書き方はいくつかパターンがあるんですが、「@norm-nois.com %1」ってのは、「@の前の部分に該当するユーザー名に対してnorm-nois.comのメールアドレスを有効にする」みたいな感じです。ワイルドカードみたいなもんですかね。「akatsuki@norm-nois.com」なら「akatsuki」というユーザーでメールを受信する、「hayabusa@norm-nois.com」なら「hayabusa」というユーザーでメールを受信するって感じ。

akatsuki@norm-nois.com akatsuki
hayabusa@norm-nois.com hayabusa

こういう風に一行ずつ書いたって良いんだけど、それだとユーザーを追加するたびに新たにvirtusertableに書かなきゃいけないから、それなら「@norm-nois.com %1」って書いといた方が良い。それならこの先どんな名前のユーザーを追加しても適用されるから。

基本的な書き方に関してはvirtusertableファイルの中に書いてあるので、それ見ながらやれば大丈夫だと思います。

書き終わったら、設定を反映させる必要があるので、以下のコマンドを実行します。

//設定の反映
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

//sendmail再起動
# service sendmail restart

これは……何でしょうね。virtusertableの設定をハッシュ化してデータベースに登録する、みたいなことですかね。データベースマップを作成とか、そんな言い方をするみたいですが、それは今は置いときましょう。

設定が完了したらsendmailを再起動しておしまいだっ!



sendmail.mc設定

上記の設定を終えてもメールが一向に届かない場合。ちゃんと25番ポートも開いているのに、それでも届く気配がない場合。まるで「サンタさんいつ来るのかなー?」と窓の外を眺めながらひたすら待ち続ける純真無垢な子供のようになってしまった場合。

ドメインのレコード設定でMXレコードを今ここで転送設定を行っているサーバーに設定していたりすると、上記の設定だけでは送受信ができないかもしれない。そんなときはsendmail.mcファイルをちょちょいっと書き直せば解決するかもしれません。

sendmail.mcの中を見ると、こんなような記述があると思います。

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

「Addr=127.0.0.1」っていうのはローカルホストのみメールの送受信を許可するみたいなことだと思うので、これを消してあげれば、外部とのメール送受信ができるようになる。サンタさんからのお手紙も届くようになるかもしれない。

# vi /etc/mail/sendmail.mc

//以下の一行を書き換える
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
→DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl

編集したら、その設定を反映させるために以下のコマンドを実行する。

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf



何事もなく実行できればそれでオッケーなんですが、EC2のインスタンスの場合、m4がインストールされてないかもしれないので、その場合はやむって下さい。

# yum install m4

m4を実行してみたけどエラーが出ちゃった場合。僕の場合はこんなエラーが出た。

Cannot open /usr/share/sendmail-cf/m4/cf.m4: No such file or directory

cf.m4ってファイルが所定の場所にないよー的なことですね。おそらくこのエラーが出たときは、サーバーに「sendmail-cf」ってのがインストールされてないと思う。だからそれをやむる。

# yum install sendmail-cf

「sendmail-devel」も一緒にインストールする必要があるよと書いてる記事も見かけたんですが、僕はsendmail-cfだけで大丈夫でした。

インストールが終わったら改めてm4コマンドを実行して、設定をsendmail.cfファイルに反映させて下さい。

あとはsendmailを再起動して、シャンパン片手にターキーでもかじってればそのうちメールが届くはず。






そんなわけで、sendmailの転送設定でしたー。これで無事にメールの送受信ができるようになると思うのですが……ダメだったらごめんなさい。一報いただければ、僕に分かる範囲でなら原因を調べてみます。

なるべく簡潔にとは書いておきながら、やっぱり長くなっちゃいましたね。それについてもごめんなさい。

「早いとこsendmailの転送設定を終わらせてクリスマスケーキ買って彼女の家に行かなきゃいけないのに、何でこんな長い記事読まなきゃいけないんだ! ふざけんな! ああ……せっかく体外式のポルチオ開発とか調べたから彼女に試したいのに……もしこれで遅刻して彼女を怒らせちゃった結果、性夜を過ごせなかったらてめーのせいだかんな!」って人がいたら、それについてもごめんなさい……

なーんて、そんなとこまでこの俺が責任持つと思うかい? 知らねーよそんなの\(*`∧´)/

もし遅れそうなら一言、彼女さんにおわびの言葉でも転送しときなさいよ。メールで。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2015年10月22日 06:41:58
あかつき
はじめまして。早速ですが、上記記事で使われている「akatsukiアットーマークgmail.com」ですが、実在するアドレス(私)ですので、他のアドレスに事例を変えて頂けませんでしょうか?

クローリングされてSPAMメールの対象にされたり等、諸々マイナスがあるもので…。
2015年10月22日 10:33:18
まっち~(管理人)
>あかつきさん
大変失礼いたしました。
Gmailのところは別のアドレスに書き換えました。
ご迷惑をおかけしてしまってすみません。
2015年10月23日 13:59:23
あかつき
早々のご対応ありがとうございました!