LoginSignup
2
1

More than 5 years have passed since last update.

sendmail を使って JCOM 経由でメールを送る

Last updated at Posted at 2018-08-15

はじめに

自宅で使っている PogoPlug (debian) から、JCOM のメールサーバを経由してメール送信できる環境を作成した時の覚え書きです。
image.png

pogoplug のクラウドサービスは、すでに終了しています。なので中身を debian 化して利用するのはオススメです。

nanddump など NAND に関してのバイナリ置き場
NAND の書き換えの手順
rootfs の入手

目的の環境

・PogoPlug では、sendmail デーモンは起動させておかない、つまりメール送信しか行わない。
・メールは受信しないので From: アドレスは JCOM のアドレスにする。

インストールと設定

まずは sendmail のインストール、追加して JCOM へ接続時に認証を行うため libsasl 関連のパッケージもインストールします。

# apt-get install sendmail
# apt-get install libsasl2-2 libsasl2-dev libsasl2-modules libsasl2-modules-db 
※ sasl 関連パッケージは、多少余分なパッケージも含んでいるかもしれません。
 なんと無く名前から必要そうなものをインストールして結果OKであった経緯です。

submit.mc を変更します。以下は diff の差分です。

# diff -u submit.mc.org submit.mc
--- submit.mc.org       2018-08-13 13:41:38.000000000 +0900
+++ submit.mc   2018-08-13 14:11:03.000000000 +0900
@@ -36,6 +36,17 @@
 VERSIONID(`$Id: submit.mc, v 8.14.4-8+deb8u2 2017-02-05 23:17:28 cowboy Exp $')
 OSTYPE(`debian')dnl
 DOMAIN(`debian-msp')dnl
+
+FEATURE(`authinfo',`hash /etc/mail/auth/authinfo')dnl
+define(`SMART_HOST',`smtpa.jcom.zaq.ne.jp')dnl
+define(`confAUTH_MECHANISMS',`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
+define(`confAUTH_OPTIONS', `A')dnl
+
+FEATURE(genericstable, `hash -o /etc/mail/genericstable')dnl 
+MASQUERADE_AS(`jcom.zaq.ne.jp')dnl
+MASQUERADE_DOMAIN(`localhost.localdomain')dnl
+FEATURE(`masquerade_envelope')
+
 dnl #
 dnl #---------------------------------------------------------------------
 dnl # Masquerading information, if needed, should go here
@@ -48,7 +59,7 @@
 dnl # The real reason we're here: the FEATURE(msp)
 dnl # NOTE WELL:  MSA (587) should have M=Ea, so we need to use stock 25
 dnl #---------------------------------------------------------------------
-FEATURE(`msp', `[127.0.0.1]', `25')dnl
+FEATURE(`msp', `smtpa.jcom.zaq.ne.jp', `25')dnl
 dnl #
 dnl #---------------------------------------------------------------------
 dnl # Some minor cleanup from FEATURE(msp)


JCOM へ接続時のユーザID、パスワードなどを authinfo を作成し設定します。また、ローカルユーザを JCOM のユーザへ置き換えるために genericstable ファイルを作成します。

# mkdir /etc/mail/auth
# chmod 755 /etc/mail/auth
# chown root:smmsp /etc/mail/auth
# vi /etc/mail/auth/authinfo
AuthInfo:smtpa.jcom.zaq.ne.jp "U:1234usr" "I:1234usr@jcom.zaq.ne.jp" "P:LQct1WAA" "M:LOGIN"

# cd /etc/mail/auth
# makemap hash authinfo < authinfo
作成された authinfo.db のパーミッションを確認
# ls -l  
-rw------- 1 root  smmsp    95 Aug 13 06:11 authinfo
-rw-r----- 1 smmta smmsp 12288 Aug 13 13:57 authinfo.db
# 

※root と 1234usr 間はタブです。
# vi /etc/mail/genericstable
root       1234usr
abc        1234usr

# cd /etc/mail
# makemap hash genericstable < genericstable

この設定を反映させるため sendmailconfig を実行
# sendmailconfig
...

メール送信して確認してみる

# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa11.esk.m4.zaq.ne.jp ESMTP server ready Mon, 13 Aug 2018 14:11:11 +0900
>>> EHLO pogo.
250-smtpa11.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> AUTH LOGIN
334 VCNlom5hbWU6
>>> NUMxN3uzcmVAcmNvbS56YXEubmUuanA=
334 UBFzc3xvcmq6
>>> TFFLZTFXXUE=
235 Authentication successful
>>> MAIL From:<1234usr@jcom.zaq.ne.jp> SIZE=29 AUTH=root@pogo.
250 Sender <1234usr@jcom.zaq.ne.jp> and extensions (SIZE=29, AUTH=root@pogo.) Ok
>>> RCPT To:<target-usr@gmail.com>
>>> DATA
250 Recipient <target-usr@gmail.com> Ok
354 Ok Send data ending with <CRLF>.<CRLF>
>>> .
250 Message received: 20180813051111713.IYXO.17729.smtpa11.esk.m4.zaq.ne.jp@smtpa11.esk.m4.zaq.ne.jp
target-usr@gmail.com... Sent (Message received: 20180813051111713.IYXO.17729.smtpa11.esk.m4.zaq.ne.jp@smtpa11.esk.m4.zaq.ne.jp)
Closing connection to smtpa.jcom.zaq.ne.jp
>>> QUIT
221 smtpa11.esk.m4.zaq.ne.jp ESMTP server closing connection
# 

1行目: Connecting to smtpa.jcom... の箇所から、jcom の smtp へ接続している事がわかる。
11行目あたり:AUTH LOGIN から Authentication successful あたりまでで、ログイン認証が成功
17行目: Mail From: の箇所で JCOM のアドレスとなっている。
結果、エラーはなく送信完了しメールも届いていました。

うまく行かない時のチェックポイント

うまくメールが送信できない時の確認ポイントとして、いくつか記載しておきます。
●リレー先に接続する動作になっているか

一般的に、メールを送信する際には自身の TCP 25 番ポートに接続しますが、不要なデーモンは動作させたくないので、ここでは 直接 JCOM のsmtp へ接続しています。
submit.mc 内の以下の変更が対応した設定箇所です。

-FEATURE(`msp', `[127.0.0.1]', `25')dnl
+FEATURE(`msp', `smtpa.jcom.zaq.ne.jp', `25')dnl

以下のようにして -bv オプションを指定し、-C で submit.cf を指定して、期待通りメーラーは "relay" そして接続先のホストも jcom のホスト名になっている事が確認できます。

# sendmail -C /etc/mail/submit.cf -bv target-usr@gmail.com
Notice: -bv may give misleading output for non-privileged user
target-usr@gmail.com... deliverable: mailer relay, host smtpa.jcom.zaq.ne.jp, user target-usr@gmail.com

●jcom 接続時の認証に成功しているか

目的の通り jcom へ接続していても、設定の不備により jcom のアカウントでのログイン認証に進まない場合があります。その時の sendmail -v での出力に AUTH LOGIN などの処理が無く AUTH failure となります。以下は、認証に必要な sasl 関連のライブラリが不足している場合の出力です、Temporary AUTH failure となっていますね。

# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa23.esk.m4.zaq.ne.jp ESMTP server ready Tue, 14 Aug 2018 18:48:51 +0900
>>> EHLO pogo.
250-smtpa23.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> QUIT
221 smtpa23.esk.m4.zaq.ne.jp ESMTP server closing connection
target-usr@gmail.com... Deferred: Temporary AUTH failure
Closing connection to smtpa.jcom.zaq.ne.jp
#

/etc/mail/auth/authinfo.db のパーミッションに問題がある場合。
同様に AUTH LOGIN はなく、MAIL From: に対して Authentication is requred と叱られています。syslog に出力されたメッセージを確認してみると authinfo.db Permission denied となっています。sendmail -bt -d38.20 で確認しても、unsafe map file: Permission denied となっている事がわかります。


# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa12.esk.m4.zaq.ne.jp ESMTP server ready Tue, 14 Aug 2018 19:08:03 +0900
>>> EHLO pogo.
250-smtpa12.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> MAIL From:<1234usr@jcom.zaq.ne.jp> SIZE=29
553 Authentication is required to send mail as <1234usr@jcom.zaq.ne.jp>
root... Using cached ESMTP connection to smtpa.jcom.zaq.ne.jp via relay...
>>> RSET
250 Ok resetting state
>>> MAIL From:<> SIZE=1053
553 <> is not allowed to use this service
postmaster... Using cached ESMTP connection to smtpa.jcom.zaq.ne.jp via relay...
>>> RSET
250 Ok resetting state
>>> MAIL From:<> SIZE=2077
553 <> is not allowed to use this service
MAILER-DAEMON... Saved message in /var/lib/sendmail/dead.letter
Closing connection to smtpa.jcom.zaq.ne.jp
>>> QUIT
221 smtpa12.esk.m4.zaq.ne.jp ESMTP server closing connection
# 
#
# grep Permission /var/log/syslog
Aug 14 19:08:44 pogo sendmail[25302]: w7EA8hxo025302: SYSERR(root): hash map "authinfo": unsafe map file /etc/mail/auth/authinfo.db: Permission denied
# 

この場合 /etc/mail/auth ディレクトリ、および /etc/mail/auth/authinfo.db のオーナ:グループ、そしてパーミッションを適切なものに変更すれば、うまく動作します。

正しいパーミッションは以下となります。
# cd /etc/mail/auth
# ls -la
total 20
drwxr-sr-x 2 root  smmsp  4096 Aug 13 06:12 .
drwxr-sr-x 8 smmta smmsp  4096 Aug 15 12:06 ..
-rw------- 1 root  smmsp    95 Aug 13 06:11 authinfo
-rw-r----- 1 smmta smmsp 12288 Aug 13 13:57 authinfo.db
#

pogoplug + debian 環境では、ディレクトリに s フラグまでついておりました。
まあ、そんなにおかしな設定になる事もないでしょうから /etc/mail に "s" もセットされているよ! 程度の認識で良いように思います。

# ls -ld /etc/mail
drwxr-sr-x 8 smmta smmsp 4096 Aug 15 12:06 /etc/mail
#

●From のユーザ名

genericstable を設定しないでメールを送ると、Mail From: が pogoローカルユーザ@jcom.zaq.ne.jp となってしまいます。
わたしは jcom の root でもないのに root@jcom.zaq.ne.jp は気持ち悪いし、これで他人にメールはまずいと思うので、genericstable へ root 1234usr のように設定を加えました。
genericstable を利用しなくても下記のように submit.cf 中の MasqHdr ルールセットを変更して強制的に指定のユーザ名にする事もできます。

※ わたしのお気に入りのスイッチ sendmail -bt -d21.12 -C /etc/mail/submit.cf で MasgHdr ルールセットの動作を確認すれば、どのパターンマッチにヒットしているか判断できます。


# diff -u submit.cf.prev  submit.cf
--- submit.cf.prev      2018-08-15 12:03:11.000000000 +0900
+++ submit.cf   2018-08-15 12:05:59.000000000 +0900
@@ -973,7 +973,7 @@
 R$* < @ $=w . > $*     $: $1 < @ $2 . @ $M > $3
 R$* < @ *LOCAL* > $*   $: $1 < @ $j . @ $M > $2
 R$* < @ $+ @ > $*      $: $1 < @ $2 > $3               $M is null
-R$* < @ $+ @ $+ > $*   $: $1 < @ $3 . > $4             $M is not null
+R$* < @ $+ @ $+ > $*   $: 1234usr < @ $3 . > $4               $M is not null

 ###################################################################
 ###  Ruleset 94 -- convert envelope names to masqueraded form  ###
You have new mail in /var/mail/root

以上です。もし、にたような設定を行う方のお役にたてましたら幸いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1