イベント予約のメールをGoogle Calendarに自動反映させる方法

イベント予約のメールをGoogle Calendarに自動反映させる方法

2021年3月11日
知恵
Pocket

ホテルの予約完了メールやイベントの予約完了メールで、自動的にGoogle Calendarに登録されているものをみたことがありますか?

以下のように、メールの先頭部分に、チェックイン日等の詳細情報が枠内に表示されます。

イベント予約のメールをGoogle Calendarに自動反映させる方法

これが入っていると、Googleカレンダーの設定によってですが、自動でカレンダー登録されます。

イベント予約のメールをGoogle Calendarに自動反映させる方法

この仕組みは、Email Markupという仕組みにより実現されています。

予約系の機能としては、以下のものがあるようです。

  • バス予約
  • イベント予約
  • フライト予約
  • ホテル予約
  • レンタカー予約
  • レストラン予約
  • 電車予約

上で提示したものは、ホテル予約に該当しています。

Json-Ldもしくは、Microdataで、メール本文内にデータを埋め込むことにより

別枠で表示され、Googleカレンダーに自動登録される仕組みになります。

実際に、上で提示したメールをソース表示してみると以下のようになっています。

イベント予約のメールをGoogle Calendarに自動反映させる方法

実際に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レコードを追加します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

追加したAレコードに対して、MXレコードを追加します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

SPF対応

SPFレコードを追加します。

TYPE: TXT, TTL: 300, VALUE: v=spf1 ip4:49.212.86.61 -allで登録します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

SPFの確認を以下のツールで行います。(設定直後は確認できないかもしれないので少し時間をあけてください)

以下のようにチェックがOKとなれば完了です。

イベント予約のメールをGoogle Calendarに自動反映させる方法

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=DKIM1keyレコードのバージョン番号(指定する場合はDKIM1)
k=rsa電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポート
p=xxxxxxxxx公開鍵データ

公開鍵をDNSに登録します。

ホスト名には、210309._domainkey、TYPEはtxt、TTLは500、VALUEは、”v=DKIM1;k=rsa;p=xxxxxx”を設定します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

続いて、ADSPレコードを登録します。

ホスト名には、_adsp._domainkey、TYPEはtxt、TTLは500、VALUEは、dkim=unknownを設定します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

設定の確認を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で、メッセージのソースを表示します。

イベント予約のメールをGoogle Calendarに自動反映させる方法

SPFとDKIMの設定がされていることが確認できました。

gmailで見ると以下のメッセージがでています。こちらもついでなので直します。

このメールは sakura.ne.jp で暗号化されませんでした。
イベント予約のメールをGoogle Calendarに自動反映させる方法

以下の行をPostfixの設定ファイルmain.cfに追加します。

# vim /etc/postfix/main.cf

smtp_tls_security_level = may

再起動します。

# systemctl restart postfix

再度、メールを送信して、gmail側で確認します。

セキュリティの赤字の部分が表示されなくなりました。

イベント予約のメールをGoogle Calendarに自動反映させる方法

その他でやっておいたほうがよい、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は、一旦いれただけになりました。