ホテルの予約完了メールやイベントの予約完了メールで、自動的にGoogle Calendarに登録されているものをみたことがありますか?
以下のように、メールの先頭部分に、チェックイン日等の詳細情報が枠内に表示されます。
これが入っていると、Googleカレンダーの設定によってですが、自動でカレンダー登録されます。
この仕組みは、Email Markupという仕組みにより実現されています。
予約系の機能としては、以下のものがあるようです。
- バス予約
- イベント予約
- フライト予約
- ホテル予約
- レンタカー予約
- レストラン予約
- 電車予約
上で提示したものは、ホテル予約に該当しています。
Json-Ldもしくは、Microdataで、メール本文内にデータを埋め込むことにより
別枠で表示され、Googleカレンダーに自動登録される仕組みになります。
実際に、上で提示したメールをソース表示してみると以下のようになっています。
実際にMicrodata付きのメールを送信してみる
先に書いておくのですが、実際に送信するには、きちんとしたメールサーバを用意して
DKIM/SPFの設定をして、Googleに正式に登録してからでないとこちらの機能は使えません。
個人で利用するにはハードルが高いかと思います。
実際申請のメールは出してみたのですが、なしのつぶてです。
おそらくメルマガ配信の実績がなかったりの理由からかもしれません。
実際には、メール送信、イベント日時表示、Googleカレンダー登録は、確認できていません。
とりあえず、DKIM/SPFの設定、メールサーバ周りの設定についての記事となっています。
Postfixのセットアップ
さくらのVPSでメールサーバをセットアップする方法を記載します。
Postfixのインストール確認
# yum list installed |grep postfix
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
postfix.x86_64 2:2.10.1-7.el7 @base
Postfixの更新
# yum -y update postfix
更新:
postfix.x86_64 2:2.10.1-9.el7
完了しました!
Postfixの設定ファイルを保存
# cd /etc/postfix
# cp main.cf main.cf.20210307
# cp master.cf master.cf.20210307
Postfixの設定を変更
/etc/postfix/main.cfを変更。
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = mail.zaitakukinmu.com
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
#mydomain = domain.tld
mydomain = zaitakukinmu.com
# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on. By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes.
#
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
# Enable IPv4, and IPv6 if supported
#inet_protocols = all
inet_protocols = ipv4
# Specify a list of host or domain names, /file/name or type:table
# patterns, separated by commas and/or whitespace. A /file/name
# pattern is replaced by its contents; a type:table is matched when
# a name matches a lookup key (the right-hand side is ignored).
# Continue long lines by starting the next line with whitespace.
#
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
# DELIVERY TO MAILBOX
#
# The home_mailbox parameter specifies the optional pathname of a
# mailbox file relative to a user's home directory. The default
# mailbox file is /var/spool/mail/user or /var/mail/user. Specify
# "Maildir/" for qmail-style delivery (the / is required).
#
#home_mailbox = Mailbox
home_mailbox = Maildir/
#以下を最終行へ追加(SMTP認証設定)
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
#以下を最終行へ追加(受信メールサイズ制限)
message_size_limit = 10485760
masquerade_domains = zaitakukinmu.com
/etc/postfix/master.cfを変更。
以下の3行のコメントアウトを解除する。
submission inet n - n - - smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
SASLの設定
# yum -y install cyrus-sasl
# systemctl start saslauthd # 起動
# systemctl enable saslauthd #自動起動設定
/etc/sasl2/smtpd.confを変更。
pwcheck_method: auxprop
mech_list: cram-md5 plain login
Postfixの再起動
systemctl restart postfix
DNSの設定変更
お名前.comを利用しているのでそちらでMXレコードの設定を行います。
まずは、mail.zaitakukinmu.comでAレコードを追加します。
追加したAレコードに対して、MXレコードを追加します。
SPF対応
SPFレコードを追加します。
TYPE: TXT, TTL: 300, VALUE: v=spf1 ip4:49.212.86.61 -allで登録します。
SPFの確認を以下のツールで行います。(設定直後は確認できないかもしれないので少し時間をあけてください)
以下のようにチェックがOKとなれば完了です。
DKIM対応
レポジトリを追加
# yum -y install epel-release
opendkimをインストールします。
# yum -y install opendkim
キーを保存するディレクトリを作成(ドメイン毎に作成)
# mkdir /etc/opendkim/keys/zaitakukinmu.com
キーペアを作成(最後の-sの文字列は任意の文字列。ここでは作成日にしています)
# opendkim-genkey -D /etc/opendkim/keys/zaitakukinmu.com/ -d zaitakukinmu.com -s 210309
上記コマンドで、/etc/opendkim/keys/zaitakukinmu.com/に、キーペアができるので所有者をopendkimに変更します。
# chown -R opendkim:opendkim /etc/opendkim/keys/zaitakukinmu.com/
DNSに公開鍵を設定しますが、上記で作成したキーペアの210309.txtに設定内容があります。
210309._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtqDe8aVA2kidufXQhNEZfVnbsLd+OkqP3KrPK2d5Wu3iI0kX3hYrL4KYkOkI6PxCSrO6ShWr96TfGAUp0ZUeoAEkK7cZKooI/C8W9D+v8XWmfBhu6pk1riIfW0vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) ; ----- DKIM key 210309 for zaitakukinmu.com
v=DKIM1 | keyレコードのバージョン番号(指定する場合はDKIM1) |
k=rsa | 電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポート |
p=xxxxxxxxx | 公開鍵データ |
公開鍵をDNSに登録します。
ホスト名には、210309._domainkey、TYPEはtxt、TTLは500、VALUEは、”v=DKIM1;k=rsa;p=xxxxxx”を設定します。
続いて、ADSPレコードを登録します。
ホスト名には、_adsp._domainkey、TYPEはtxt、TTLは500、VALUEは、dkim=unknownを設定します。
設定の確認をdigコマンドで行います。ANSWER SECTIONが表示されることを確認します。
# dig 210309._domainkey.zaitakukinmu.com txt
; <<>> DiG 9.10.6 <<>> 210309._domainkey.zaitakukinmu.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22796
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;210309._domainkey.zaitakukinmu.com. IN TXT
;; ANSWER SECTION:
210309._domainkey.zaitakukinmu.com. 500 IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtqDe8aVA2kidufXQhNEZfVnbsLd+OkqP3KrPK2d5Wu3iI0kX3hYrL4KYkOkI6PxCSrO6ShWr96TfGAUp0ZUeoAEkK7cZKooI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
ADSPレコードも同様に確認します。
dig _adsp._domainkey.zaitakukinmu.com txt
; <<>> DiG 9.10.6 <<>> _adsp._domainkey.zaitakukinmu.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37753
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_adsp._domainkey.zaitakukinmu.com. IN TXT
;; ANSWER SECTION:
_adsp._domainkey.zaitakukinmu.com. 3600 IN TXT "dkim=unknown"
opendkimの設定変更を行います。
設定ファイルをまずバックアップします。
# cp /etc/opendkim.conf /etc/opendkim.conf.20210309
opendkim.confの変更
# vim /etc/opendkim.conf
#Mode v
Mode sv
#KeyFile /etc/opendkim/keys/default.private #コメントアウト
# KeyTable /etc/opendkim/KeyTable
KeyTable /etc/opendkim/KeyTable
# SigningTable refile:/etc/opendkim/SigningTable
SigningTable refile:/etc/opendkim/SigningTable
# ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
# InternalHosts refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
#SoftwareHeader yes
SoftwareHeader no
KeyTableの変更
事前にバックアップを取ります。
# cp /etc/opendkim/KeyTable /etc/opendkim/KeyTable.org
KeyTableに、以下の形式の1行を追加します。
[セレクタ名]._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]
実際には、以下になります。
210309._domainkey.zaitakukinmu.com zaitakukinmu.com:210309:/etc/opendkim/keys/zaitakukinmu.com/210309.private
SigningTableの変更
事前にバックアップを取ります。
# cp /etc/opendkim/SigningTable /etc/opendkim/SigningTable.org
SigningTableに、以下の形式の1行を追加します。
*@[ドメイン名] ._domainkey.[ドメイン名] [ドメイン名]
実際には、以下になります。
*@zaitakukinmu.com 210309._domainkey.zaitakukinmu.com
opendkimの起動
以下のコマンドで起動します。
# systemctl start opendkim
自動起動設定をしておきます。
# systemctl enable opendkim
Postfixでopendkimを利用するように設定変更をしていきます。
事前にバックアップを取ります。
# cp /etc/postfix/main.cf /etc/postfix/main.cf.org
最終行に以下を追加します。
### DKIM Settings
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
誤りがないかチェックします。
# postfix check
エラーがでなければ、OKです。
Postfixを再起動します。
# systemctl restart postfix
メール送信確認
コマンドラインで、Postfixからメールを送信して、DKIMが有効になっているのを確認していきます。
コマンドラインからメールを送る為のmailxをインストールします。
# yum install mailx
メールを送信します。
# echo "test"|mail -s "test" xxxxxxx@gmail.com
ログを確認してみます。
# less /var/log/maillog
何も記録されていません。どうも、maillogにログを出力するには設定が必要みたいです。
rsyslogのインストール
# yum install rsyslog
起動と自動起動設定
# systemctl start rsyslog
# systemctl enable rsyslog
再度、コマンドでメールを送信して、ログを確認します。
それでも出力が確認できませんでした。検索してみるとimjournal.stateを消すといいとのことで消して、rsyslogを再起動します。
# rm /var/lib/rsyslog/imjournal.state
rm: 通常ファイル `imjournal.state' を削除しますか? y
# systemctl restart rsyslog
上記でもだめで、色々やって治りました。どれが最終的に効いたのかはっきりわからないのですが、おそらくjournaldの再起動が効いたようです。
# systemctl restart systemd-journald
# systemctl status systemd-journald
再度、コマンドでメールを送信してみて、maillogを確認して、DKIMを追加したログを確認します。
# echo "test"|mail -s "test" xxxxxx@gmail.com
# cat /var/log/maillog
Mar 10 23:16:11 www37023u opendkim[18997]: 4766D6109A64: DKIM-Signature field added (s=181026, d=zaitakukinmu.com)
signatureがついていることが確認できました。
実際に、gmailの方でも確認します。
gmailで、メッセージのソースを表示します。
SPFとDKIMの設定がされていることが確認できました。
gmailで見ると以下のメッセージがでています。こちらもついでなので直します。
このメールは sakura.ne.jp で暗号化されませんでした。
以下の行をPostfixの設定ファイルmain.cfに追加します。
# vim /etc/postfix/main.cf
smtp_tls_security_level = may
再起動します。
# systemctl restart postfix
再度、メールを送信して、gmail側で確認します。
セキュリティの赤字の部分が表示されなくなりました。
その他でやっておいたほうがよい、postfixの設定
smtpd_banner = $myhostname ESMTP unknown # 追加(メールサーバーソフト名の隠蔽化
これで、DKIM/SPFの設定が完了したので、Google側への登録作業を行っていきます。
Googleへの登録
以下のページに、登録に必要な手順が記載されています。
ガイドラインは、以下です。ハードルが高く、テストでは難しそう。。。。
- メールはDKIMまたはSPFで認証されている必要があります。
- SPFチェックまたはDKIM署名のトップレベルドメイン(TLD)は、From: のメールアドレスのTLDと一致している必要があります。
- Gmailは、あなたのReturn-Path: メールのドメインのSPFのみをチェックします。もし、DKIMを使わずにSPFだけに頼るのであれば、あなたの「Return-Path: 」メールは、「From: 」メールのTLDと一致していなければなりません。
- メールはGmail Bulk Sender Guidelines(大量送信者ガイドライン)に従っている必要があります。
- お客様のドメインから大量のメールを少なくとも数週間に渡って送信した履歴があること
- ユーザーからのスパムクレームが非常に少ないこと
いちかばちかですが、以下に、email markupを含んだメールを送っておきます。
schema.whitelisting+sample@gmail.com
念の為、ローカルユーザでメールが受信できるか確認すると、maillogに以下のエラーがありました。
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: connect from mail-oo1-f41.google.com[209.85.161.41]
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: warning: SASL authentication failure: Internal Error -4 in server.c near line 1757
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: warning: SASL authentication failure: Internal Error -4 in server.c near line 1757
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: warning: SASL authentication failure: Internal Error -4 in server.c near line 1757
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: warning: xsasl_cyrus_server_get_mechanism_list: no mechanism available
Mar 11 23:44:02 www37023u postfix/smtpd[28672]: fatal: no SASL authentication mechanisms
Mar 11 23:44:03 www37023u postfix/master[28425]: warning: process /usr/libexec/postfix/smtpd pid 28672 exit status 1
Mar 11 23:44:03 www37023u postfix/master[28425]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
sasl認証で必要なパッケージがインストールされていない可能性があります。
インストールします。
# yum install -y cyrus-sasl cyrus-sasl-plain
設定を追加します。
# vim /etc/postfix/main.cf
#以下を最終行へ追加(SMTP認証設定)
smtpd_sasl_auth_enable = yes
# mynetworks以外で匿名での接続を拒否
smtpd_sasl_security_options = noanonymous
# 規格外の動作に対応
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
# systemctl restart postfix
再度、外部からローカルユーザ向けメールを出してみます。(例) test@zaitakukinmu.com)
Mar 11 23:48:44 www37023u postfix/smtpd[28823]: connect from mail-yb1-f181.google.com[209.85.219.181]
Mar 11 23:48:44 www37023u postfix/smtpd[28823]: 9268D6109A49: client=mail-yb1-f181.google.com[209.85.219.181]
Mar 11 23:48:44 www37023u postfix/cleanup[28828]: 9268D6109A49: message-id=<CABh=NrrfdM5qZOODOdoi1HdpcwS2KN-3+ZLEVMmMcMiprxHOCQ@mail.gmail.com>
Mar 11 23:48:44 www37023u opendkim[18997]: 9268D6109A49: mail-yb1-f181.google.com [209.85.219.181] not internal
Mar 11 23:48:44 www37023u opendkim[18997]: 9268D6109A49: not authenticated
Mar 11 23:48:45 www37023u opendkim[18997]: 9268D6109A49: DKIM verification successful
Mar 11 23:48:45 www37023u postfix/qmgr[28820]: 9268D6109A49: from=<xxxxxxxxxxx@gmail.com>, size=2569, nrcpt=1 (queue active)
Mar 11 23:48:45 www37023u postfix/local[28829]: 9268D6109A49: to=<test@zaitakukinmu.com>, relay=local, delay=0.57, delays=0.55/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
成功しました。ローカルユーザのMaildir(例)/home/test/Maildir/new)にファイルができていることで確認。
受信メールサーバのセットアップ
# yum -y install dovecot
# vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir #追加
# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
# vim /etc/dovecot/conf.d/10-ssl.conf
#ssl = required
ssl = no
# systemctl start dovecot
# systemctl enable dovecot
# firewall-cmd --zone=public --add-service={smtp,smtp-submission,pop3,imap} --permanent
# firewall-cmd --reload
# firewall-cmd --list-services
http https imap pop3 smtp smtp-submission
dovecotは、一旦いれただけになりました。