【Google Compute Engine】【Ubuntu 22.04】msmtpでAn unexpected TLS packet was received のエラーが出る

・メールはgmailを経由して送信
gmailは2段階認証を入れて、アプリパスワードを生成して送信

実行すると以下のエラーが出る

host=smtp.gmail.com tls=on auth=on user=hogehoge@gmail.com 
  from=hogehoge@gmail.com recipients=hogehoge@yahoo.co.jp 
  errormsg='TLS handshake failed: An unexpected TLS packet was received.' 
  exitcode=EX_PROTOCOL

msmtprcに「tls_certcheck off」を入れたら動くようになった。
/etc/msmtprc

#-------------------- defaults
defaults
auth on
port 465
tls on
tls_starttls on
tls_certcheck off
tls_trust_file /etc/ssl/certs/ca-certificates.crt

#-------------------- my settings
account gmail
host smtp.gmail.com
port 587
from hogehoge@gmail.com
user hogehoge@gmail.com
password hogehogehogehoge
logfile /var/log/msmtp.log

# Set a default account
account default : gmail

【Google Compute Engine】【Ubuntu 22.04】ダイナミックDNSサービス no-ipを用いる。

GCP VMで静的パブリックIPを使っていない、つまり、動的(エフェメラル)IPなので、ダイナミックDNSが必要になる。

OCIでは、mydnsを使用しているが、GCPではno-ipを使用してみた。
・mydnsとの違いでは、ip-notify.shのパラメータは3つ、ユーザ、パスワード、DNS名を与える

気づいた修正点 ・dipcurlのパブリックip取得には差が発生するため、curlのみでパブリックIPを取得

以下の「hogeName hogePass hogeHost.ddns.net」の箇所は登録したno-ipのユーザ、パスワード、ホスト名

/etc/no-ip/notify-ip.sh

#!/bin/sh

# usage check
if [ $# != 3 ]; then
  echo "usage: notify-ip.sh user password hostname"
  exit;
fi

# notify ip to no-ip
date >> /var/log/notify-ip.log
curl -s "https://$1:$2@dynupdate.no-ip.com/nic/update?hostname=$3" >> \
          /var/log/notify-ip.log

/etc/no-ip/notify-ip-change.sh

#!/bin/sh

# usage check
if [ $# != 3 ]; then
  echo "usage: notify-ip.sh user password domain_name"
  exit -1
fi

# compare ip address
IP_CURRENT=$(curl inet-ip.info)

FILE_DIR="/etc/no-ip/"
FILE_OLD="${FILE_DIR}old-$3"

CMD="${FILE_DIR}notify-ip.sh $1 $2 $3"

# exec notify ip shell
if [ -f $FILE_OLD ]; then
  IP_OLD=$(cat $FILE_OLD)
  if [ $IP_CURRENT != $IP_OLD ]; then
    eval $CMD
  fi
else
  eval $CMD
fi
eval "echo $IP_CURRENT > $FILE_OLD"

/etc/systemd/system/noip.timer

[Unit]
Description=no-ip notify ip

[Timer]
OnCalendar=*-*-* 6:00:00
Unit=noip.service

[Install]
WantedBy=timers.target

/etc/systemd/system/noip.service

[Unit]
Description=no-ip notify ip

[Service]
Type=simple
ExecStart=/etc/no-ip/notify-ip.sh hogeName hogePass hogeHost.ddns.net

/etc/systemd/system/noip-short.timer

[Unit]
Description=no-ip notify ip short cycle

[Timer]
OnBootSec=10s
OnActiveSec=10s
OnUnitActiveSec=1min
Unit=noip-short.service

[Install]
WantedBy=timers.target

/etc/systemd/system/noip-short.service

[Unit]
Description=no-ip notify ip short cycle

[Service]
Type=simple
ExecStart=/etc/no-ip/notify-ip-change.sh hogeName hogePass hogeHost.ddns.net

登録

# systemctl daemon-reload
# systemctl enable noip.timer
# systemctl enable noip-short.timer
# systemctl start noip.timer
# systemctl start noip-short.timer

確認

# systemctl list-timers

【Google Compute Engine】【Ubuntu 22.04】メール配信サービス Mailjetを使ってVMリブート検知のメールを作る

Google Compute Engine】【Ubuntu 22.04】メール配信サービス Mailjetを使ってVMリブート検知のメールを作る

GCPには、OCIのようなメール配信サービス「Email Delivery」がありません。
なのでインターネット上にある他のサービスを利用します。
GCPのドキュメントにもあるSendGrid,Mailgun, Mailjetなどがあったので、そのうちMailjetを使ってみました。

Mailjetにアカウント登録

MailJetにアカウント登録後SMTPの内容(SMTP and SEND API Settings)を確認します。
デフォルトではパスワード(SECRET KEY)が生成されていないみたいで、
「Generate Secret Key」をクリックしてIDと生成されたパスワードをコピペして保存しておきます。
作成すると以下の画面のようになりますが、パスワードは2度と表示されないみたいなので 要注意です。

また画面にあるようにサーバ名とポートは以下のようになっています。

メールサーバ:in-v3.mailjet.com
ポート:587

Ubuntuにメール送信クライアントを入れる

Ubuntuにもmailxコマンドがあるのですが、
Redhat系のmailxコマンドとは違うようでbsd-mailxなどをインストールするとサーバソフトもインストールされます。
期待していることと違うので、同様のことができるソフト msmtpをインストールします。

# apt install msmtp msmtp-mta

msmtpの設定ファイル

サンプルをコピーします。

# cp /usr/share/doc/msmtp/examples/msmtprc-system.example /etc/msmtprc

/etc/msmtprcファイルを以下のように書き換えました。 上のdefaultsの箇所は使いません。
user, passwordは、mailjetsのサイトのAPI KEYのIDとSECRET KEYSです。
TLSは使わず、authだけ使う場合は、auth login と書くようです。
fromのメールアドレス(from_hogehoge@gmail.com)は、mailjetにログインしたメールアドレスです。
別途mailjetにはメールアドレスを登録できる箇所もあるので、必要だったら変えた方がよいと思います。

# Example for a system wide configuration file

defaults
host mail.oursite.example
port 465
tls on
tls_starttls off
from %U@oursite.example
syslog LOG_MAIL

#-------------------- my settings
# mail service
account mailjet
host in-v3.mailjet.com
port 587
from from_hogehoge@gmail.com
user 4ed.....65aa66a51d
password 26bfea.....02339
auth login
tls off
tls_starttls off
syslog on

# Set a default account
account default : mailjet

送信テスト

デバッグオプションを付けて、確認します。to_hogehoge@gmail.comにメール送信します。

echo "vm rebooted on `date`."  |  msmtp -d  to_hogehoge@gmail.com

リブートしたときに実行するようにcron.dにファイルを置きます。

/etc/crond.d/reboot-mail

reboot root /etc/reboot-mail/send.sh

/etc/reboot-mail/send.sh

#!/bin/sh

printf "Subject: GCP VM rebooted" > /etc/reboot-mail/mail.txt
printf "\n\n" >> /etc/reboot-mail/mail.txt
printf "rebooted on `date`" >> /etc/reboot-mail/mail.txt

msmtp to_hogehoge@gmail.com < /etc/reboot-mail/mail.txt
# chmod +x /etc/reboot-mail/send.sh
# chown root:root /etc/reboot-mail/send.sh

【Oracle Cloud】【Rocky 8】メール配信サービスEmail Deliveryを使ってVMリブート検知のメールを作る

OCIのメール配信サービス:Email Deliveryを使ってVMリブート検知のメールを作る

Always Free でも、1か月当たり3000通の電子メールを無料で送信できるらしい。
OS: Rocky Linux 8

mailxをインストール

# sudo dnf install mailx

Email DeliveryにアクセスするユーザID/パスワードを作る

自分のプロフィールから「STMP資格証明」を選んでユーザIDを1件作る
作成したときに表示されるパスワードは2度と表示されないらしいのでメモっておく

作成したEmail DeliveryのユーザID

すごく長い(省略)

ocid1.user.oc1.....da.ib.com

Email Deliveryのユーザパスワード

aUc0g.....DpU

エンドポイントの確認

「開発者サービス」⇒「電子メール配信」⇒「構成」に表示されている

smtp.email.ap-tokyo-1.oci.oraclecloud.com:587 

送信者メールアドレスの作成

「開発者サービス」⇒「電子メール配信」⇒「承認済送信者」で1件作成する
※実在するメールアドレスでなくてもOK。

help@hogehoge.mydns.jp

mailxの設定

mail.rcを修正する

# vi /etc/mail.rc

以下を最後に追加する

set nss-config-dir=/etc/pki/nssdb/
set smtp-use-starttls
set smtp-auth=plain
set smtp=smtp.email.ap-tokyo-1.oci.oraclecloud.com:587 
set from=help@hogehoge.mydns.jp
set smtp-auth-user=ocid1.user.oc1.....da.ib.com
set smtp-auth-password=aUc0g.....DpU

送信テスト

(-rは送信元のメールアドレス、宛先abcxyz123@gmail.comへ送る)

$ echo "rebooted `date` on OCI Server" | mailx -s "VM Rebooted" -r help@hogehoge.mydns.jp abcxyz123@gmail.com

リブート時に実行するcronのファイルを作る

# vi /etc/cron.d/reboot-mail
@reboot root echo "rebooted `date` on OCI Server hogehoge.mydns.jp" | mailx -s "VM Rebooted" -r help@hogehoge.mydns.jp abcxyz123@gmail.com

実際にリブートしてみてメールが飛んでいるか確認する
送信元が実在するメールアドレスではないため迷惑メール扱いになっている可能性があり、迷惑メールボックスも確認する