S-nail
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 で直接かつ即座にメッセージを送るだけです。
目次
インストール
使用例
システム全体の設定ファイル (/etc/mail.rc
) には最初から有用な設定が含まれており、以下のように sendmail や postfix などのローカルメール転送エージェント (MTA) でメールを送信できます:
# echo 'Message body' | mailx -d -s 'A subject' -a an_attachment.txt foo1@bar.example 'Foo2 <foo2@bar.example>'
-d
フラグを付けることでドライランとなり実際にはメールは送信されません (save
や record
設定も無視されます)。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
マニュアルページの はじめに、メールを送信する、メールを読む のセクションは、さらに クイック ショット を探す場合に一見の価値があります。
次の USER と PASS が 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 でアップデートしたときに変わる可能性があるため、変更や追加は前者のファイルに行ってください。
基本的なセキュリティや送信モードを設定する設定例:
# 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>" }
$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
この場合、USER と PASS はクリアテキストであり、URL エンコードされていません。 ArchLinux はパスワード エージェント サポートでコンパイルされるため、さらに多様化して暗号化されたパスワード ストレージを使用できます。
例を調整するには、$HOME/.netrc
で password 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 メールボックスを使う
以下は簡単なヒントです。たとえば、folder と inbox を定義して 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