SendmailからGmail経由でメールを送信する。

諸事情により久々にSendmailを触ることになり、Gmail経由でメール送信させるテストをしたのでその備忘録です。GmailまたはGoogle Apps経由で、他のドメインのメールアドレス宛にメールを送信する場合の例です。

sendmail.mc [1]

divert(-1)dnl
divert(0)dnl
define(`_USE_ETC_MAIL_')dnl
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
VERSIONID(`$Id: sendmail.mc, v 8.14.3-9.4 2010-09-21 11:05:34 cowboy Exp $')
OSTYPE(`debian')dnl
DOMAIN(`debian-mta')dnl
undefine(`confHOST_STATUS_DIRECTORY')dnl        #DAEMON_HOSTSTATS=
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl
define(`confPRIVACY_FLAGS',dnl`needmailhelo,needexpnhelo,needvrfyhelo,restrictqrun,restrictexpand,nobodyreturn,authwarnings')dnl
define(`confCONNECTION_RATE_THROTTLE', `15')dnl
define(`confCONNECTION_RATE_WINDOW_SIZE',`10m')dnl
FEATURE(`use_cw_file')dnl
FEATURE(`access_db', , `skip')dnl
FEATURE(`greet_pause', `1000')dnl
FEATURE(`delay_checks', `friend', `n')dnl
define(`confBAD_RCPT_THROTTLE',`3')dnl
FEATURE(`conncontrol', `nodelay', `terminate')dnl
FEATURE(`conncontrol', `nodelay', `terminate')dnl
FEATURE(`ratecontrol', `nodelay', `terminate')dnl
EXPOSED_USER(`root')dnl
LOCAL_DOMAIN(`example.org')dnl
define(`SMART_HOST', `smtp.gmail.com')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')
define(`CERT_DIR', `/etc/ssl/certs')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
define(`confCACERT', `CERT_DIR/ca-certificates.crt')dnl
define(`confCRL', `CERT_DIR/ca-certificates.crt')dnl
define(`confSERVER_CERT', `CERT_DIR/ca.pem')dnl
define(`confSERVER_KEY', `CERT_DIR/ca.pem')dnl
define(`confCLIENT_CERT', `CERT_DIR/ca.pem')dnl
define(`confCLIENT_KEY', `CERT_DIR/ca.pem')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
FEATURE(`authinfo',`hash /etc/mail/authinfo')dnl
FEATURE(genericstable,DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`genericstable')
GENERICS_DOMAIN_FILE(MAIL_SETTINGS_DIR`genericsdomain')
FEATURE(`generics_entire_domain')
include(`/etc/mail/m4/dialup.m4')dnl
include(`/etc/mail/m4/provider.m4')dnl
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl

sendmail.mcを変更したら、makeを実行してsendmail.cfを更新し、sendmailを再起動します。

$ sudo make
$ sudo /etc/init.d/sendmail restart

authinfoで指定した、/etc/mail/authinfoは、

AuthInfo:smtp.gmail.com "U:smmsp" "I:user" "P:password" "M:PLAIN"

のように作成し、

$ sudo bash -c "makemap -r hash /etc/mail/authinfo.db < /etc/mail/authinfo"

と実行します [2]

これが、Google Appsを使う場合はauthinfoで指定している”I:”と”P:”をGoogle Appsのアカウント、パスワードにすればOKです。

AuthInfo:smtp.gmail.com "U:smmsp" "I:user@example.org" "P:password" "M:PLAIN"

てな具合です。

$ date | mail -s test hoge@gmail.com

とすると、上記の例では、Gmailならuser@gmail.comから、Google Appsならuser@example.orgから、hoge@gmail.com宛にメール配送されます。

修正版

もちっといろいろやってみたら結構不要なのが多かったので、以下に修正版を掲載しておきます。

divert(-1)dnl
divert(0)dnl
define(`_USE_ETC_MAIL_')dnl
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
VERSIONID(`$Id: sendmail.mc, v 8.14.3-9.4 2010-09-21 11:05:34 cowboy Exp $')
OSTYPE(`debian')dnl
DOMAIN(`debian-mta')dnl
undefine(`confHOST_STATUS_DIRECTORY')dnl        #DAEMON_HOSTSTATS=
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl
define(`confPRIVACY_FLAGS',dnl`needmailhelo,needexpnhelo,needvrfyhelo,restrictqrun,restrictexpand,nobodyreturn,authwarnings')dnl
define(`confCONNECTION_RATE_THROTTLE', `15')dnl
define(`confCONNECTION_RATE_WINDOW_SIZE',`10m')dnl
FEATURE(`use_cw_file')dnl
FEATURE(`access_db', , `skip')dnl
FEATURE(`greet_pause', `1000')dnl
FEATURE(`delay_checks', `friend', `n')dnl
define(`confBAD_RCPT_THROTTLE',`3')dnl
FEATURE(`conncontrol', `nodelay', `terminate')dnl
FEATURE(`conncontrol', `nodelay', `terminate')dnl
FEATURE(`ratecontrol', `nodelay', `terminate')dnl
EXPOSED_USER(`root')dnl
LOCAL_DOMAIN(`hoge.example.org')dnl
define(`SMART_HOST', `smtp.gmail.com')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')
define(`CERT_DIR', `/etc/ssl/certs')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
define(`confCACERT', `CERT_DIR/ca-certificates.crt')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
FEATURE(`authinfo',`hash /etc/mail/authinfo')dnl
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl

Gmailにリレーするだけなのに、サーバ証明書とかクライアント証明書は不要ですね、ハイ。あと、LOCAL_DOMAINで指定したドメインが、/etc/aliasesで設定するローカルアカウントのエイリアスのメールアドレスのドメインと同じだと、リレーされませんね。

[1]$ egrep -v ‘^#|^dnl’ sendmail.mcの結果です。
[2]authinfoのAuthInfo:smtp.gmail.comで、STARTTLS用のポートTCP/587を指定していませんが、RELAY_MAILER_ARGSで587を指定しているので不要です。