msmtp
関連記事
msmtp はとてもシンプルで使いやすい SMTP クライアントです。sendmail と完全な互換性があります。
目次
インストール
msmtp パッケージでインストールできます。さらに msmtp-mta をインストールすることで msmtp に sendmail エイリアスが作成されます。
基本設定
msmtp バージョン 1.8.6 以降、設定ファイルを ~/.msmtprc か $XDG_CONFIG_HOME/msmtp/config に配置することができます。以下は msmtp の設定例です (パッケージに含まれている、/usr/share/doc/msmtp/msmtprc-user.example にある通常ユーザーのサンプルが基になっています。システム設定ファイルは /etc/msmtprc にあり、サンプルは /usr/share/doc/msmtp/msmtprc-system.example にあります):
~/.msmtprc
# Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail account gmail host smtp.gmail.com port 465 from username@gmail.com user username password plain-text-password # A freemail service account freemail host smtp.freemail.example from joe_smith@freemail.example ... # Accounts can inherit info from another account account postmasterfreemail : freemail from postmaster*@freemail.example # Set a default account account default : gmail
ユーザーの設定ファイルは所有者が読み書きできるように明示的に設定しないと msmtp がエラーを吐きます:
$ chmod 600 ~/.msmtprc
設定ファイルに平文でパスワードを保存したくない場合、passwordeval を使って外部プログラムを起動するか、あるいは下のパスワード管理セクションを見てください。以下は GnuPG を使ってパスワードを暗号化する例です:
$ echo -e "password\n" | gpg --encrypt -o .msmtp-gmail.gpg # enter id (email...)
~/.msmtprc
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/.msmtp-gmail.gpg"
OAuth2 設定
OAuth2 は、基本的なユーザー名/パスワード認証がサイト構成によってサポートされていない場合、または他の点で望ましくない場合に、msmtp を安全に認証するために使用できます。
oama
msmtp だけでは OAuth2 資格情報を更新・認証することができません。包括的な解決方法は、oama ユーティリティを使うことです。これは IMAP/SMTP クライアントに OAuth2 資格情報の更新能力と認証を提供します。
oama を使うには、oama-binAUR を インストール し、 msmtp を設定して使用できるようにします。
# account at Google with oauth2 access account YOUR_EMAIL_NAME@gmail.com from YOUR_EMAIL_NAME@gmail.com user YOUR_EMAIL_NAME@gmail.com auth oauthbearer passwordeval oama access YOUR_EMAIL_NAME@gmail.com host smtp.gmail.com port 587 tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt
アクセストークン更新は、ユーザーには見えないバックグラウンドで自動的に行われます。
mail コマンドを使う
mail コマンドを使ってメールを送信するには s-nail パッケージをインストールする必要があります。これは、 mailx コマンドも提供します。それに加えて sendmail 互換の MTA が必要です。msmtp-mta をインストールするか(これは {{ic|sendmail} を msmtp へシンボリックリンクします) /etc/mail.rc を編集して sendmail クライアントを設定してください:
/etc/mail.rc
set mta=/usr/bin/msmtp
システム共通の /etc/msmtprc ファイルを使用するか、.msmtprc ファイルをメールを送信したい全てのユーザーのホームディレクトリに配置する必要があります。
msmtp ではエイリアスが使えます。以下の行を msmtprc のデフォルトセクションかローカルの設定ファイルに追加してください:
/etc/msmtprc
aliases /etc/aliases
そして /etc にエイリアスファイルを作成してください:
/etc/aliases
# Example aliases file # Send root to Joe and Jane root: joe_smith@example.com, jane_chang@example.com # Send everything else to admin default: admin@domain.example
動作のテスト
アカウントオプション (--account=,-a) で送信元として使用するアカウントを指定します:
$ echo "hello there username." | msmtp -a default username@domain.com
もしくは、件名と本文の両方を送信するには:
$ printf "Subject: Test\n\nhello there username." | msmtp -a default username@domain.com
もしくは、ファイルにアドレスを書いて使用するには:
To: username@domain.com From: username@gmail.com Subject: A test
Hello there.
$ cat test.mail | msmtp -a default <username>@domain.com
Cronie のデフォルトメールクライアント
cronie で sendmail ではなく msmtp を使うようにするには、msmtp-mta をインストールするか、cronie.service systemd ユニットを編集してください:
/etc/systemd/system/cronie.service.d/msmtp.conf
[Service] ExecStart= ExecStart=/usr/bin/crond -n -m '/usr/bin/msmtp -t'
それから cronie あるいは msmtp にメールアドレスを設定してください:
/etc/msmtprcに追加:aliases /etc/aliases
それから/etc/aliasesを作成:your_username: email@address.com
または:- crontab の
MAILTO行に追加:MAILTO=email@address.com
パスワード管理
msmtp のパスワードはプレーンテキスト・暗号化ファイル・キーリングのどれかに保存できます [1]。
GNOME Keyring
GNOME Keyring にパスワードを保存することができます。Wiki ページに従ってキーリングを設定したら libsecret をインストールしてください。以下のコマンドでパスワードを保存できます:
$ secret-tool store --label=msmtp host smtp.your.domain service smtp user yourusername
msmtp は自動的にパスワードを確認します。
GnuPG
password ディレクティブは省略できます。省略した場合、アカウントの auth を off 以外の値に設定することで、インタラクティブシェルから msmtp を起動したときにメールの送信前にパスワードが要求されるようになります。Mutt などの他のアプリケーションから呼び出されたときは msmtp はパスワードを要求しません。そのようなときは --passwordeval パラメータを使って GnuPG などの外部のキーリングツールを使用することができます。
GnuPG と gpg-agent を設定してパスワードを毎回入力しなくてもよいようにしてください。それから、以下のように msmtp 用に暗号化したパスワードファイルを作成してください。700 パーミッションで tmpfs 上にディレクトリを作成することで、ディスクに暗号化されていないパスワードが書き込まれないようにすることができます。ディレクトリの中にはメールアカウントのパスワードを記述したプレーンテキストファイルを作成してください。そして、秘密鍵を使ってファイルを暗号化してください:
$ gpg --default-recipient-self -e /path/to/plain/password
プレーンテキストファイルを削除して、暗号化したファイルを適切なディレクトリに移動してください (例: ~/.mail/.msmtp-credentials.gpg)。~/.msmtprc に以下を追加:
~/.msmtprc
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/.mail/.msmtp-credentials.gpg"
Mutt などからメールを送信するときに GUI のパスワードプロンプトを表示するだけなら上記で十分です。gpg によってパスフレーズのプロンプトが表示されない場合、先に gpg-agent を起動してください。muttrc に ` command ` のようにバッククォートを使って外部コマンドを指定することでエージェントを起動できます。例:
muttrc
set my_msmtp_pass=`gpg -d mypwfile.gpg`
Mutt は起動時にこれを実行し、gpg-agent はあなたのパスワードをキャッシュし、 msmtp は喜んでメールを送れるようになります。
An alternative is to place passwords in ~/.netrc, a file that can act as a common pool for msmtp, OfflineIMAP, and associated tools.
代替案としては、 msmtp、OfflineIMAP及び関連ツールで共通して管理できる ~/.netrcにパスワードを置く方法があります。
pass
認証情報を pass パスワードマネージャ内に保存することができます。
メインパスワード(通常はpassファイルの1行目に格納)で SMTP サーバにログインする場合は、以下を .msmptrc に追加します:
~/.msmtprc
passwordeval "pass your_email_password_entry | head -n1"
Gmail を使っていてアプリパスワードの設定が済んでいるのなら、以下の設定がふさわしいでしょう。アプリパスワードを pass パスワードファイルに保存しますが、msmtp: プレフィックスを付けて下さい。
your_email_password_entry
your_main_password login: your_username url: the_url_of_your_email msmtp: your_msmtp_app_password
そして、.msmptrc に以下を追加して下さい。:
~/.msmtprc
passwordeval "pass your_email_password_entry | awk '/^msmtp:/ { print $2; }'"
どちらの場合も、 msmtpでメールを送信しようとすると pass が起動します。最近入力していないのであれば、 pass のマスターパスワードを求められるかもしれません。
ヒントとテクニック
msmtp をオフラインで使う
msmtp は素晴らしいツールですが、使用するにはオンラインになる必要があります。インターネットに常時接続することができないノートパソコンなどではあまり好ましくありません。この問題を解決するためのスクリプトが複数存在し、まとめて msmtpqueue と呼ばれます。
スクリプトは /usr/share/doc/msmtp/msmtpqueue にインストールされます。スクリプトはどこか便利な場所にコピーすると良いでしょう (/usr/local/bin を推奨します)。
そして MUA でメールを送信するときに msmtp のかわりに msmtp-enqueue.sh を使うようにしてください。デフォルトでは、キューに入ったメッセージは ~/.msmtpqueue に保存されます。保存場所を変更したい場合はスクリプトの QUEUEDIR=$HOME/.msmtpqueue 行を変更してください (もしくは行を削除して、.bash_profile で QUEUEDIR 変数をエクスポートしてください: export QUEUEDIR="$XDG_DATA_HOME/msmtpqueue")。
作成したメールを送信したいときは以下のコマンドを実行:
$ /usr/local/bin/msmtp-runqueue.sh
/usr/local/bin を PATH に追加することでキーストロークを少なくすることができます。スクリプトに付属している README ファイルには有用な情報が載っているため、読むことを推奨します。
Vim のシンタックスハイライト
msmtp のソースディストリビューションには Vim 用の msmtprc のシンタックスハイライトスクリプトが含まれています。/usr/share/vim/vimfiles/syntax/msmtp.vim で利用できます。ファイルタイプは自動的に認識されません。modeline をファイルの一番上あるいは下に追加するのが簡単です:
# vim:filetype=msmtp
msmtp を使って PHP でメールを送信
php.ini の sendmail_path オプションを以下のように編集してください:
sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"
msmtp を php などで sendmail の代替として使う場合、ユーザーの設定ファイル(つまり ~/ 以下にあるもの)は使えないことに注意して下さい。 その場合は /etc/msmtprc を作成し、ユーザー設定ファイルを削除してください(他の用途で使う場合は削除しないで下さい)。また、使うもの(php、django等)で読み取り可能にしておいて下さい。
msmtp マニュアルより: ユーザー設定ファイルで定義されたアカウントはシステム設定ファイル'により上書きされます。ユーザー設定ファイルには、ユーザーが読み書きできる以上の権限を与えてはいけません。'
そのため、conf ファイルを ~/ 以下 に置き、php ユーザーが読めるようにすることは不可能です。
テストするにはこのファイルを php が有効なサーバが置くか、php-cli を使って下さい。
<?php
mail("your@email.com", "Test email from PHP", "msmtp as sendmail for PHP");
?>
/etc/msmtprc のパーミションをユーザーが読み書きできる(600)ようにしない限り、php-fpm はメール送信に失敗し、以下の警告をログに出すでしょう: PHP Warning: mail(mail.log): failed to open stream
トラブルシューティング
TLS の問題
以下のエラーメッセージが表示される場合:
msmtp: TLS certificate verification failed: the certificate hasn't got a known issuer
msmtp: TLS certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown.
おそらく設定ファイルの tls_trust_file パラメータが正しくありません。
素晴らしいマニュアルに従って下さい。指定した SMTP サーバの証明書発行者を調べる方法が説明されています。そして、 /usr/share/ca-certificates/ ディレクトリを探索して、必要な証明書がひょっとしてそこにあるか調べることができます。ない場合は、自分で証明書を取得する必要があります。独自の証明書を使用している場合は、以下を ~/.msmtprcに追加することで msmtp にその証明書を信頼させることができます。
tls_fingerprint <SHA1 (recommended) or MD5 fingerprint of the certificate>
ユーザーがサーバで使用されている証明書を PEM ファイルで持っている場合は、 openssl を使うことによって保存されている証明書のフィンガープリントを見つけることができます:
openssl x509 -in CERT.pem -inform PEM -fingerprint
Gmail でメールを送信しようとしてこのエラーを受け取った場合、このスレッドを読むか、上記二番目の Gmail の例を使って下さい。
本当に困っているが、100% 正しいサーバに接続していると確信している場合は、いつでも証明書チェックを一時的に無効化することができます:
$ msmtp --tls-certcheck off
以下のメッセージが表示される場合:
msmtp: TLS handshake failed: the operation timed out
FS#44994 のバグが原因です。--with-ssl=openssl を使って msmtp を再コンパイルしてください (デフォルトでは GnuTLS が有効になっています)。
Server sent empty reply
"server sent empty reply" エラーが表示される場合、メールサーバーがポート 587 での STARTTLS を許可しておらず、非標準のポート 465 での SSL/TLS を必要としています [2]。
msmtp でポート 465 の SSL/TLS を使うには、以下の行を ~/.msmtprc に追加してください:
tls_starttls off
Zoho SMTP サーバ
Zoho SMTP サーバでも、メールヘッダと本文の間に空行な無い場合発生する場合があります(Debianのバグ #917260 を参照)。この解決法としては、間に余分なスペースを追加して下さい:
"test-header\n\ntest-body"
GSSAPI の問題
以下のエラーが表示される場合:
GNU SASL: GSSAPI error in client while negotiating security context in gss_init_sec_context() in SASL library. This is most likely due insufficient credentials or malicious interactions.
.msmtprc ファイルの auth 設定を gssapi から plain に変更してみてください [3]:
auth plain
Envelope not accepted
以下のエラーが表示される場合:
msmtp: envelope from address mail@server not accepted by the server msmtp: server message: 530 5.5.1 Authentication Required. msmtp: could not send mail (account default from /etc/msmtprc)
以下で認証の有効化を試みるか、
auth on
他の方法で認証を有効化して下さい。