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

#はじめに

自宅で使っている PogoPlug (debian) から、JCOM のメールサーバを経由してメール送信できる環境を作成した時の覚え書きです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246034/5b345a67-f504-a11d-16e3-aa64974c561a.png)

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

・[nanddump など NAND に関してのバイナリ置き場](https://github.com/pepaslabs/pogoplug_mobile_uboot_installer/tree/master/mirrored/download.qnology.com/pogoplug/v4)
・[NAND の書き換えの手順](http://blog.qnology.com/2014/07/hacking-pogoplug-v4-series-4-and-mobile.html)
・[rootfs の入手](https://github.com/pepaslabs/pogoplug-v4-bodhi-rootfs-debian/)

#目的の環境

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

#インストールと設定

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

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

```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 ファイルを作成します。

```shell
# 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
...
```

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

```shell
# 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
# 

```

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

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

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

``` diff
-FEATURE(`msp', `[127.0.0.1]', `25')dnl
+FEATURE(`msp', `smtpa.jcom.zaq.ne.jp', `25')dnl
```
以下のようにして -bv オプションを指定し、-C で submit.cf を指定して、期待通りメーラーは "relay" そして接続先のホストも jcom のホスト名になっている事が確認できます。

```shell
# 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 となっていますね。

```shell
# 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 となっている事がわかります。

```shell

# 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 のオーナ：グループ、そしてパーミッションを適切なものに変更すれば、うまく動作します。

```shell
正しいパーミッションは以下となります。
# 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

# 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

```

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