このブログを検索

2011/10/21

sendmail

レンタルサーバから移行した。 いろいろメンドクサイのでおぼえがきを記す。レンタルサーバで動いていたcgiがinternal server errorになることがある。 /etc/httpd/logs/error_log を見ると、
Premature end of script headers
と書いてある。 改行コードがCRLFになっているとこうなるそうだ。 改行コードを確認するには、
od -c test.cgi
とやると、改行コードが\nとか\r\nとか表示される。 \r\nになっていた場合は、以下のようにして変換する。
$ tr -d \\r <windows.txt >unix.txt
sendmail
こいつがメンドクサイ。まず、みんなが当たり前のようにやっているが前提として理解しておく必要のあること。sendmailの設定ファイルは sendmail.cf というテキストファイルである。この設定ファイルはムズカシイことで有名で、私も以前ちょっと調べてみたことがあるがさっぱりわからなかった。最近は、sendmail.mc という設定ファイルの設定ファイルみたいなものができて、それをm4 というコマンドを以下のように使って sendmail.cfに変換してくれるようになったようだ。
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sendmail.mc なら、なんとなく何をしているのかが想像がつく。そして sendmail.mcだが、コメントの書き方がちょっと変わっていて、行頭に dnl と書く。行末にもdnlがついているところがあるが、これはあってもなくてもいいようだ。
dnl #
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
dnl #

dnl #
dnl # Also accept email sent to "localhost.localdomain" as local email.
dnl #
LOCAL_DOMAIN(`hoge.net')dnl
dnl #
今例示した下記の設定は、メール転送をローカルに限るという設定なので、外部からのメールを受信する場合はコメントアウトする。
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
さて、外部からのメールの受信であるが、実はまだうまくいっていない。いろんなアカウントを作るときにメールアドレスが必要になることがあり、VPSを持っていれば実質無制限にアカウントを作れるのだが、メールが受信できなきゃしょうがないな・・・
[root@wwwXXXXXu ~]# sendmail -d0.1 -bt < /dev/null
Version 8.13.8
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
TCPWRAPPERS USERDB USE_LDAP_INIT

============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = wwwXXXXXu
(canonical domain name) $j = wwwXXXXXu.sakura.ne.jp
(subdomain name) $m = sakura.ne.jp
(node name) $k = wwwXXXXXu.sakura.ne.jp
========================================================

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
多分これが原因じゃないかと思う。wwwXXXXXu というのはVPSサーバに与えられるfqdnで、これを変えて使っている。sendmail.mc にドメイン名を設定したのだが、このコマンドに反映しない。このコマンドのオプションの意味はよくわからない。後で調べる。
gmailからVPSのアカウントにメールを送ると、/var/log/maillog に以下のようなログがあるので、サーバには届いているようである。
Oct 21 17:32:58 wwwXXXXXu sendmail[9748]: p9L8WtBO009748: from=<hoge@gmail.com>, size=1182, class=0, nrcpts=1, msgid=xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxx-cueQtTA@mail.gmail.com>, proto=ESMTP, daemon=MTA, relay=mail-bw0-f50.google.com [209.85.214.50]
Oct 21 17:32:58 wwwXXXXXu sendmail[9749]: p9L8WtBO009748: to=<hoge@example.com>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=314
56, dsn=2.0.0, stat=Sent
これは、ホスト名を逆引きして表示しているようである。 WEBブラウザで操作する「VPSのコントロールパネル」でホスト名を変更したら反映した。 このときに正引き登録が必要なので、新しくホスト名を付けた。 普段はホスト名なしでアクセスしていたのだが多分、名前は必要なんだよね? ついでに、 /etc/hosts, /etc/sysconfig/network にも設定する。 いらなかったかな? 再起動したら、コマンドプロンプトも変わった。
メールも来てた! めでたしめでたし。
rootじゃない、後から作ったアカウントでログインするのだが、そのアカウントではlsすらできない。いつもsu - をやってrootで操作していたのだがメンドクサイので、自分のアカウントの所属グループを変えることにした。 wheelにすればいいのだろうと思っていたがすでにwheelになっていた。 wheelではlsもできないのか・・・ rootのグループを見ると、admとか sysとかたくさんのグループに所属している。 rootと全く同じにする必要はないから、とりあえず admとかに入れてみたがダメだ。 そして気付いた、groupaddではひとつのグループにしか登録できないことを。 調べると vigr というコマンドがあって、これを使えばグループの設定ファイルを編集できる。 しかるべきグループに追加し、晴れて ls が実行可能となった。
所属グループの確認: id
一つのグループに所属させる場合の変更: usermod -G wheel hoge
グループ設定ファイル編集: vigr
何をしたかったかというと、アクセスログから検索語を探して表示しているcgiがあるのだが、件数がそんなにないので、見つかった時点でtweetするようにしようと思った。 すでに一つbotは稼動していて、試験的な運用なのでそれで試してもいいのだがせっかくなので新しいアカウントを取って新しいbotを作ろうと思います。
あれーまた受信できなくなった。 グループ変えたせいか?
・・・できた。ようわからん。
mail -u hoge
でhogeのメールを見る。
echo test|mail root
でrootに"test"という文字列を送る。
さて、メールが受信できるようになった。 しかし、日本語はエンコードされている。 デコードしなきゃ。 どうやるんだろう? perlでちょいちょいとやればできそうなのだが、よくわからない。情報もない。 しょうがないからpop3で受信する。 dovecotをインストール。
yum install dovecot
設定ファイルは特にいじらずに起動する。
service dovecot start
outlook expressで受信してみるがダメ。 telnet xxxx 110 でも入れない。 ping xxxx はいける。
service dovecot status
を見てみたら停止していた。 /var/log/maillog を見ると、
Oct 21 22:27:43 tal dovecot: auth(default): Unknown authentication mechanism 'dram-md5'
とあるので、設定ファイル /etc/dovecot.conf で dram-md5 と書いてあるところを探して、消して、再起動。 受信できた。こっちは簡単。 というか、sendmailもたいしたことはなかった。 でも、dnsとかiptablesとか、ある程度知ってないとワケがわからないかも。