S-nail

提供: ArchWiki
ナビゲーションに移動 検索に移動

S-nail (heirloom-mailx のフォーク) は ed と同じようなコマンド構文が使えるメール処理システムです。ed における行がメッセージになります。POSIX の mailx コマンドの機能を実現し行編集や IDNA, MIME, S/MIME, SMTP, POP3 (IMAP) などの拡張を提供します。メールバッチ言語として使うことが可能です。

S-nail は Unix のメールシステムのユーザーサイドを担うものであり、システムサイドは伝統的に sendmail が使われていました。

Arch Linux では S-nail は SMTP によるメールの直接配達に対応しているため、外部の SMTP サーバーに直接メッセージを送信することができます。その場合、ローカルのメール転送エージェント (MTA) はシステムサイドには不要です。ただし、S-nail にはメールキュー機構が存在しません。SMTP で直接かつ即座にメッセージを送るだけです。

インストール

s-nail パッケージを インストール します。

使用例

システム全体の設定ファイル (/etc/mail.rc) には最初から有用な設定が含まれており、以下のように sendmailpostfix などのローカルメール転送エージェント (MTA) でメールを送信できます:

# echo 'Message body' | mailx -d -s 'A subject' -a an_attachment.txt foo1@bar.example 'Foo2 <foo2@bar.example>'

-d フラグを付けることでドライランとなり実際にはメールは送信されません (saverecord 設定も無視されます)。sendmail 変数を設定することで MTA として使用するプログラムを調整できます (sendmail-arguments, sendmail-no-default-arguments, sendmail-progname など詳しくはマニュアルの "Sending mail" を参照):

# < /etc/passwd mailx -Ssendmail=/usr/bin/sendmail -Ssendwait -s 'My password file content!' public-foo@bar.example
# echo Message was passed successfully: $?

デフォルトではメールの配達は非同期となっており、メッセージが配達システム (MTA など) に渡されると S-nail はすぐに終了します。メッセージの準備ができたかどうかだけ出力します。sendwait オプションを設定した場合、S-nail は起動した MTA インスタンスが終了するまで待機し、MTA の終了ステータスを確認してメールの配達が成功したか失敗したか判断します。

expandaddr オプションを設定した場合、ファイルやコマンドにメッセージを送信することができます:

# echo bla | mailx -Sexpandaddr -s test ./mbox.mbox
# echo bla | mailx -Sexpandaddr -s test '|cat >> ./mbox.mbox'

プログラム環境のメンバーと設定ファイルの設定がプログラムの動作を変更するのを避けるために、スクリプトを設定ファイルから切り離し、-S および -X コマンドライン フラグを使用できます (そしてそうすべきです)。それぞれ独自のセットアップを作成し、必要なコマンドを実行します。

expandaddr に値を指定して、アドレス検証に使用できます。たとえば、次の only はネットワーク アドレスを許可します。 -. コマンド ライン オプションは、オプション処理を終了し、メッセージ送信モードをオンにします。これらが一緒になってアクティブなバリアを形成し、アドレス引数をコマンドラインオプションとして誤って解釈したり、その他のインジェクション攻撃を防止したりします。 次の例は、somefile.pdf がどこかにある場合、{ic|-d}} を除いてそのまま使用できます。 record 変数を、すべての送信メールの記録に使用されるフォルダーのパス名に設定します。これにより、生成されたメールを調べることができます。 メッセージ:

# echo Body |
#   LC_ALL=C MAILRC=/dev/null \
#   mailx -d -n -Sv15-compat -Ssendwait \
#     -Sexpandaddr=fail,-all,+addr \
#     -Snosave -Srecord=/tmp/out.mbox \
#     -Smimetypes-load-control \
#     -X'mimetype "application/pdf pdf"' \
#     -Sfrom='Me <me@home>' \
#     -a somefile.pdf -s Subject \
#      -. '(foo2bar) <foo2@bar.example>' bob@hey.example
# mailx -Rf /tmp/out.mbox

マニュアルページの はじめにメールを送信するメールを読む のセクションは、さらに クイック ショット を探す場合に一見の価値があります。

次の USERPASS が URL の一部として指定されている場合 (その場合のみ)、それらは URL パーセントでエンコードされる必要があります。 S-nail は、これを行う urlcodec コマンドを提供しています。

# printf 'urlcodec encode USER PASS\nx\n' | mailx -#

printf と S-nail / mailx は、ロケール設定の影響を受けます。

# # In UTF-8:
# printf 'urlcodec encode SPAß\nx\n' | mailx -#
  in: <SPAß> (5 bytes)
  out: <SPA%C3%9F> (9 bytes)
# # In ISO-8859-1:
# printf 'urlc enc SPAß\nx\n' | mailx -#
  in: <SPAß> (4 bytes)
  out: <SPA%DF> (6 bytes)

設定

設定ファイルは各ユーザー個別の $HOME/.mailrc と全ユーザー共通の /etc/mail.rc があり、後者のファイルは Arch Linux でアップデートしたときに変わる可能性があるため、変更や追加は前者のファイルに行ってください。

ヒント: -n コマンド ライン オプションを使用するか、NAIL_NO_SYSTEM_RC を設定することにより、起動時に /etc/mail.rc を読み取ることを禁止できます。また、MAILRC 環境変数を /dev/null に設定することにより、設定ファイルがロードされないことが保証されるため、次のように、スクリプトを実行するための再現可能な環境が作成されます。

基本的なセキュリティや送信モードを設定する設定例:

# All the examples require v15-compat!
set v15-compat

# ArchLinux-specific locations of certificates.
# Since these are subject to the ArchLinux update mechanism,
# use only those, don't try to load OpenSSL builtin ones.
# And use the TLS specific set: see "man 8 update-ca-trust"
#set ssl-ca-dir=/etc/ssl/certs
set ssl-ca-file=/etc/ssl/certs/ca-certificates.crt
set ssl-no-default-ca

# Don't use protocols older than TLS v1.2.
# Change this only when the remote server doesn't support it:
# maybe use ssl-protocol-HOST (or -USER@HOST) syntax to define
# such explicit exceptions, then, e.g.
#     ssl-protocol-USER@archlinux.org="-ALL,+TLSv1.2"
set ssl-protocol="-ALL,+TLSv1.2"

# Explicitly define the list of ciphers, which may improve security,
# especially with protocols older than TLS v1.2.  See ciphers(1).
# Hint: it is important to include "@STRENGTH": only with it the
# final list will be sorted by algorithm strength.
# This is an example: in reality it is possibly best to only use
# ssl-cipher-list-HOST (or -USER@HOST), as necessary, again..
set ssl-cipher-list="ALL:!aNULL:!eNULL:!MEDIUM:!LOW:!MD5:!RC4:!EXPORT:@STRENGTH"

# Request strict transport security checks
set ssl-verify=strict

# Essential setting: select allowed character sets
# (Have a look at the "CHARACTER SETS" manual section)
set sendcharsets=utf-8,iso-8859-1

# A very kind option: when replying to a message, first try to
# use the same encoding that the original poster used herself!
set reply-in-same-charset

# When replying to or forwarding a message the comment and name
# parts of email addresses are removed unless this variable is set
set fullnames

# When sending messages, wait until the Mail-Transfer-Agent finishs.
# Only like this you'll be able to see errors reported through the exit
# status of the MTA (including the builtin SMTP one)!
set sendwait

# Only use builtin MIME types, no mime.types(5) files.
# That set is often sufficient, but look at the output of the
# mimetype command to ensure this is true for you, too
set mimetypes-load-control

# Default directory where we act in (relative to $HOME if not absolute)
set folder=mail
# A leading "+" (often) means: under folder
# record is used to save copies of sent messages, DEAD is error storage
# inbox: system mailbox, by default /var/mail/$USER: file %
# MBOX: secondary mailbox: file &
set MBOX=+mbox.mbox record=+sent.mbox DEAD=+dead.mbox
set inbox=+system.mbox

# Define some shortcuts; now one may say, e.g., file mymbo
shortcut mymbo %:+mbox.mbox \
         myrec +sent.mbox

# This is optional, but you should get the big picture
# by reading the manual before you leave that off
set from="Your Name <youremail@domain>" 

# Mailing-list specifics (manual: "Mailing lists"):
set followup-to followup-to-honour=ask-yes reply-to-honour=ask-yes
# And teach some non-subscribed / some subscribed lists, too
mlist @xyz-editor.xyz$ @xyzf.xyz$
mlsubscribe ^xfans@xfans.xyz$

上記の SSL/TLS 構成の組み合わせにより、可能な限り最も安全なエンドツーエンド TLS トランスポートが実現します。

外部 SMTP サーバーでメールを送信

組み込みの SMTP (Simple Mail Transfer Protocol) クライアント経由で外部 SMTP サーバーにメッセージを送信するには、いくつかのオプションを設定または調整する必要があります。上記の構成に、太字の文字列を変更して、必要に応じて次を追加します。マニュアルのセクション mailx(1) § URL 構文と資格情報の検索について を読むことは価値があります。

# It can be as easy as
# (Remember USER and PASS must be URL percent encoded)
set mta=smtp://USER:PASS@HOST \
    smtp-use-starttls

# It may be necessary to set hostname and/or smtp-hostname
# if the "SERVER" of smtp and "domain" of from do not match.
# Reading the "ON URL SYNTAX.." and smtp manual entries may be worthwhile
set mta=(smtp[s]/submission)://[USER[:PASS]@]SERVER[:PORT] \
    smtp-auth=login[/plain]... \
    smtp-use-starttls

# E.g. here is a real life example of a very huge free mail provider
# (Activate this account via mailx -AXooglX from the command line,
# or use the ? acc[ount] XooglX command in interactive mode)
account XooglX {
   # Localize options, forget them when changing the account
   localopts yes
   # (The plain smtp:// proto is optional)
   set mta=smtp://USER:PASS@smtp.gmXil.com smtp-use-starttls
   set from="Your Name <youremail@domain>"
}

# And here is a pretty large one which does not allow sending mails
# if there is a domain name mismatch on the SMTP protocol level,
# which would bite us if the value of from does not match, e.g.,
# for people who have a sXXXXeforge project and want to speak
# with the mailing list under their project account (in from),
# still sending the message through their normal mail provider
account XandeX {
   localopts yes
   set mta=smtps://USER:PASS@smtp.yaXXex.ru:465 \
       hostname=yaXXex.com smtp-hostname=
   set from="Your Name <youremail@domain>"
}
ヒント: Gmail で 2 段階認証を有効にし、S-nail 用のアプリケーション固有のパスワードを追加します。通常の Gmail パスワードではなく、そのパスワードを使用する必要があります。

$HOME/.mailrc にパスワードを保存する場合は、chmod 0600 で適切な ファイルのパーミッションと属性 を設定する必要があることに注意してください。 netrc-lookup オプションを設定して、代わりに $HOME/.netrc (または $NETRC) にユーザー資格情報を保存することもできます。たとえば、SMTP、POP3、および IMAP をセットアップし、そこにすべてのユーザー資格情報を保存する実際の例を次に示します。

account XandeX {
   localopts yes
   set from="Your Name <youremail@domain>"
   wysh set netrc-lookup # netrc-pipe='gpg -qd ~/.netrc.gpg'
   set mta=smtps://smtp.yXXXXx.ru:465 \
       smtp-hostname= hostname=yXXXXx.com
   set pop3-keepalive=240
   shortcut pop pop3s://pop.yXXXXx.ru
   # Type xp to login to the POP3 account
   commandalias xp 'fi pop'
   set imap-keepalive=240
   shortcut imap imaps://imap.yXXXXx.ru
   # Type xi to login to the IMAP account
   commandalias xi 'fi imap'
 }

そして、$HOME/.netrc:

machine *.yXXXXx.ru login USER password PASS

この場合、USERPASS はクリアテキストであり、URL エンコードされていません。 ArchLinux はパスワード エージェント サポートでコンパイルされるため、さらに多様化して暗号化されたパスワード ストレージを使用できます。 例を調整するには、$HOME/.netrcpassword PASS トークンを指定しないで、代わりに agent-shell-lookup 行のコメントを外します。上記の例のアカウント。 暗号化されたパスワード ストレージ .pass.gpg は、次のように作成できます。

# gpg -e .netrc
# eval `gpg-agent --daemon --pinentry-program=/usr/bin/pinentry-curses --max-cache-ttl 99999 --default-cache-ttl 99999`

構成をテストします (-d コマンド ライン オプションを使用します。) dry-run):

# echo test-body | mailx --verbose --verbose --account=XandeX --subject=test-subject some@where

インタラクティブな使用方法

Arch Linux の S-nail にはコマンドラインエディタが組み込まれており、履歴機能や正規表現、メッセージのカラー表示が使えます。S-nail は POSIX 標準に準拠しているためインタラクティブに使う前に設定を変更する必要があります。全ての設定に手を入れる必要はありませんがマニュアルは必ず読んでください。最低でも設定の一番上に以下を追加してください:

# (The global configuration /etc/mail.rc provides some commented basics;
# in particular it shows all options that POSIX mandates as defaults.)

# Start into interactive mode even if the system mailbox is empty or
# does not exist.  mailx will exit immediately without that one
set emptystart

# When composing a message, start directly into $EDITOR
set editalong

# Start $PAGER when a message is longer than VALUE lines;
# without VALUE: screen $LINES
set crt=

# A nicer prompt for a modern terminal
wysh set prompt='?\${?}!\${!}[\${account}#\${mailbox-display}]? '

# Add more entries to the history, and make that persistent
set history-gabby history-file=+.s-nailhist
# When printing messages, show only these headers
# (Easier to retain what you want than to ignore
# what you do not; use Print to see all headers and Show
# to see the raw message content)
retain date from to cc subject

# Try to get around weird MIME attachment specifications
# (This option can take a value, see the manual for more)
set mime-counter-evidence=0xE

# Display HTML parts inline, nicer than what the builtin viewer can achieve
#set pipe-text/html='@* lynx -stdin -dump -force_html'
# Learn another mimetype
mimetype model/vrml wrl vrml

# Create some new commands so that, e.g., `ls /tmp' will..
commandalias ls !ls -latro
commandalias ps !ps axu

一旦中に入ったら、list を使って利用可能な全ての組み込みコマンドを表示させましょう。 ArchLinux は "DOCSTRINGS" 機能でコンパイルされ、`?X' と入力すると "X" を展開してヘルプ文字列を表示します。S-nail は全てのコマンドの省略を許しているので、これは時々便利です; 例えば ?h, ?he, ?hel ... といった具合に試してみてください。 help コマンドは最も頻繁に使用されるコマンドの短い要約を表示します。

コマンド

対話モードを開始すると、headers コマンドを介して、最初に開かれたメールボックスの内容の概要が出力されます。 ヘッダー表示メッセージには、メッセージを一意に識別する番号 (1 から始まる) が付けられます。メッセージは、print コマンド、または略して p で印刷できます。 p は表示されるヘッダーのリストを retain (または ignore) しますが、P print コマンドはすべてを表示します。ヘッダー; Sh ow コマンドは生のメッセージ コンテンツを出力します。

デフォルトでは、現在のメッセージ (ドット) が表示されますが、他の多くのコマンドと同様に、マニュアルのセクション mailx(1) § メッセージの指定 に記載されているように、メッセージのリストを指定することができます。たとえば、p:u はすべての未読メッセージを表示し、p. は現在のメッセージ (ドット) を出力し、p 1 5 はメッセージ 1 と 5 を出力します。 p-p+ は、それぞれ前のメッセージと次のメッセージを出力します。空行に単純に RETURN を入力すると、next (n) のように動作し、次のメッセージが出力されることに注意してください。

コマンド from は概要を表示するのに便利です。たとえば、f '@@arch linux は、メッセージ ヘッダーに文字列 'arch linux' を含むすべてのメッセージのヘッダー サマリーを出力します。一方、f '@arch linux は、件名に 'arch linux' が含まれるもののみに一致します。最後に、正規表現 f @^A[^[:space:]]+ は、件名が A 文字で始まり、A の直後に空白文字がないすべてのメッセージを検索します。検索式などに空白がある場合に必要になる場合があります。

  • file File 新しいメールボックスを開きます。後者は読み取り専用モードです
  • newmail (メールボックスに応じて、新しいメールをチェックし) 新しいメッセージのリストを出力します
  • he (headers) メッセージリストを再印刷します
  • z- z+ z0 z$ ヘッダー表示をスクロールします (使用している端末によっては、Home/End/PageUp/PageDown キーがエイリアスとして機能します)
  • folders 現在設定されている folder の下にあるメールボックスのリストを表示します
  • r 指定されたメッセージのすべての宛先に返信します
  • R 指定されたメッセージの送信者に返信します
  • Lreply 指定されたメッセージ "メーリングリスト" への返信
  • move または mv は (a) メッセージを移動します
  • (un)flag (a) 件のメッセージをフラグなし (未) としてマーク
  • new (a) 件のメッセージを未読にします
  • seen (a) 個のメッセージを既読にします
  • P (a) 個のメッセージをすべてのヘッダーとともに出力します
  • p (a) メッセージとすべての無視されないヘッダーを出力します
  • show (a) メッセージコンテンツの raw メッセージを出力します
  • write それか w メッセージと添付ファイルをネイティブ形式でローカルストレージにダウンロードする

メッセージの作成

作成は、mail user@host と入力するか、メッセージに返信することで開始されます。$EDITOR を入力すると (editalong が設定されていると仮定します) ネイティブエディタが表示され、チルダエスケープを使って多くの操作ができます (~? で短いヘルプが表示されます、 特に興味深いのは ~@ で、これは添付ファイルのリストを対話的に編集することができ、引数が与えられると、追加の添付ファイルを (n) (カンマで区切られたリスト) を追加できます。

メールを送信するには、Ctrl+d で EOT を送るか、 ~. を単独でタイプしてください。

S/MIME を使う

マニュアルには、証明書などの作成方法のステップバイステップの例 (mailx(1) § S/MIME で署名・暗号化されたメッセージ と同様に mailx(1) § S/MIME step by step) が記載されています。秘密鍵と署名された証明書がすでにあるとして、必要なペアファイルを作成するだけです。

# cat private-key.pem signed-certificate.pem > ~/pair.pem

S-nailをセットアップします

set smime-sign-cert=~/pair.pem \
    smime-sign-message-digest=SHA256 \
    smime-sign

今後、送信されるすべてのメッセージは署名されるようになります。デフォルトのメッセージダイジェストは、RFC:5751 で指定されているように SHA1 です。S/MIME は常に変数 from の設定に関連して動作するので、代わりに account に上記の設定を置くことが最善と思われます。verify コマンドは S/MIME メッセージを検証しますが、S/MIME の復号と検証は今のところ OpenSSL にのみ基づいており、単純な MIME 構造のメッセージにのみ対応していることに注意してください。

OpenPGP のサポート

S-nail は OpenPGP をサポートしていませんが、マクロを使うことで自動的に --clearsign されたメッセージを検証することができます。リソースファイルで以下を使うことで V を押すだけでメッセージを検証することが可能です:

 define V {
   localopts yes
   set pipe-text/plain="set -C;\
     : > \"${TMPDIR}/${NAIL_FILENAME_GENERATED}\";\
     trap \"rm -f \\\"${TMPDIR}/${NAIL_FILENAME_GENERATED}\\\"\" EXIT;\
     trap \"exit 75\" INT QUIT TERM;\
     set +C;\
     cat > \"${TMPDIR}/${NAIL_FILENAME_GENERATED}\";\
     < \"${TMPDIR}/${NAIL_FILENAME_GENERATED}\" awk \
         -v TMPFILE=\"${TMPDIR}/${NAIL_FILENAME_GENERATED}\" '\
       BEGIN {done=0}\
       /^-----BEGIN PGP SIGNED MESSAGE-----/,/^$/ {\
         if (done++ != 0)\
           next;\
         print \"--- GPG --verify ---\";\
         system(\"gpg --verify \" TMPFILE \" 2>&1\");\
         print \"--- GPG --verify ---\";\
         print \"\";\
         next;\
       }\
       /^-----BEGIN PGP SIGNATURE-----/,/^-----END PGP SIGNATURE-----/ {\
         next;\
       }\
       {print}\
       '"
   print
 }
 define RK {
   !printf 'Key IDs to gpg --recv-keys: ';\
     read keyids;\
     gpg --recv-keys ${keyids};
 }
 ghost V call V
 ghost RK call RK

IMAP メールボックスを使う

以下は簡単なヒントです。たとえば、folderinbox を定義して IMAP サーバーフォルダーを指すようにすることもできます。 国際化された名前がサポートされています。

set v15-compat

# or many servers will expire the session
set imap-keepalive=240
set imap-cache=~/.imap_cache

# You may want to define shortcuts to folders, for example:
shortcut myimap "imaps://USER:PASS@server:port"
set inbox=myimap

参照