Linux コマンドラインでメールを受信:ローカル mailx・IMAP 同期・安全境界

この記事の原題は「Linux システムの mail コマンド」で、2014 年に公開されました。元の本文が実際に説明していたのは、ローカル MTA を通じたメール送信であり、受信方法ではありません。実在の受信者アドレス、個人ホームディレクトリ、uuencode 添付、出所不明の HTTP 帰属先も、現在の運用例には適しません。

本版は題名から安全な受信ガイドを再構成します。ローカルシステムメールボックス、リモート IMAP/POP3、送信メールを先に分離し、プロバイダー公式設定、検証済み TLS、制約された資格情報、復元可能な一方向同期で最小試験を行います。例では予約済み .invalid ドメインを使っており、プロバイダーの公式値へ置き換える必要があります。プレースホルダー設定をそのまま実行してはいけません。

末尾に歴史的本文の不活性アーカイブがあります。プライバシー保護のため、個人の受信者アドレス 6 か所と個人ホームディレクトリ 2 か所だけを置換しました。未変更の原文は source_export と Git 履歴に残っています。アーカイブ内のコマンドは絶対に実行してはいけません。

まず「受信」がどこで起きるかを決める

要件データの場所適したツール重要な境界
ローカル Unix アカウントへ配信されたメールを読むローカルシステムメールボックスまたは mboxローカルの mail/mailx 実装インターネットメールボックスへ自動接続しない。終了方法が既読メールの保存場所に影響する
サーバーフォルダーを保ちながらリモートメールを対話的に読むIMAP サーバーTLS とプロバイダー認証に対応する現行 MUA(NeoMutt など)IMAP 状態は双方向に変わり得る。まず削除とフラグ同期を制限する
リモートメールをバックアップしやすいローカル Maildir へ同期するIMAP とローカル複製現行 mbsync/isync同期はバックアップではない。状態、削除、expunge を別々に制御する
旧来のワークフローでサーバーからダウンロードするPOP3 サーバーからローカルプロバイダーが正式対応し、要件に本当に合う場合だけクライアント既定値が異なり、サーバーコピー削除やフォルダー意味の喪失があり得る
メールを送信するMTA またはメール送信サービスSMTP submission クライアント/MTASMTP は送信経路で受信プロトコルではなく、本文では設定しない

最初にプロバイダーまたは管理者へ確認します。IMAP の有効化、ホスト名、暗黙 TLS ポート、認証方式、ユーザー名形式、OAuth クライアントポリシー、アプリ専用パスワード条件、容量、速度制限、保持方針、サーバー側フォルダー/ラベル意味、第三者コマンドラインクライアントの許可です。フォーラム投稿からエンドポイントをコピーせず、SMTP 資格情報を IMAP に流用しません。

ローカル mailx はローカルメールボックスだけを読む

POSIX mailx には送信モードと受信モードがあります。受信者オペランドなしでは受信モードとなり、既定で現在の Unix ユーザーのシステムメールボックスを読みます。具体的なパス、パッケージ、実装はシステム依存です。読み取り専用の探索から始めます。

command -v mail
command -v mailx

どちらも存在しない場合は、ディストリビューションの現行サポート文書で実装を選び、古い無作為な RPM をインストールしません。存在する場合はローカルマニュアルを読み、mbox、Maildir、別バックエンドのどれを操作するか確認します。次は POSIX 形式の対話入口であり、リモート IMAP ログインではありません。

mailx

対話プロンプトでは、まずヘッダー一覧を表示し、承認済みのテストメールを 1 件だけ読み、メールボックスを変更しない終了コマンドを使います。

headers
type 1
exit

POSIX の意味では exit はメールボックスを変更しません。quit は既読のシステムメールを mbox へ移し、削除を確定し、状態を保存する場合があります。実装が動作を拡張・変更し得るため、ローカルの man mailx を正とします。-u other-user で他人のメールボックスを読んではいけません。追加権限が必要で、プライバシーと監査境界に違反する可能性があります。

端末、スクロールバック、画面録画、シェルセッションログに送信者、件名、本文が表示される場合があります。管理された端末だけで読み、診断共有前にアドレス、件名、Message-ID、トークン、本文を削除します。

リモートメールは IMAP と現代 TLS を優先する

IMAP はサーバー上のフォルダー、メッセージ、フラグを管理します。POP3 はダウンロード型に近く、SMTP submission は送信用です。プロトコル名を交換して使えません。RFC 8314 はメールアクセスで TLS を推奨し、暗黙 TLS の IMAPS 993 と POP3S 995 を登録しています。プロバイダーが STARTTLS にも対応する場合はありますが、平文へ降格した後に認証を続けてはいけません。

設定安全要件停止条件
ホストとポートプロバイダー/管理者の現行公式値だけを使う。一般的には IMAPS 993IP アドレス、短縮リンク、転載手順、証明書名とホストの不一致
TLS現行システム TLS 方針で証明書チェーン、ホスト名、有効期間を検証証明書無視、「trust all」、TLS 降格の要求
OAuthプロバイダー承認済みクライアント、最小かつ取消可能な範囲、鍵束内のトークンブラウザー cookie のコピー、コマンドラインへのトークン貼り付け、無関係権限の付与
アプリ専用パスワード公式対応、MFA 有効、OAuth 不適用の場合だけ主アカウントパスワード、共有パスワード、個別取消不能な資格情報
ローカルアカウント最小アクセスの専用非特権ユーザーroot での日常閲覧、グループ/全員が読める設定やメール

OAuth トークンも秘密です。RFC 7628 の利点は、長期アカウントパスワードとは別に限定アクセスを付与して取り消せることであり、設定、プロセス引数、ログへの公開を認めるものではありません。OAuth が必須なら、OAUTHBEARER/XOAUTH2 をネイティブ対応する現行クライアントを選び、プロバイダーの登録手順を厳守します。Web セッションから自分でトークンを抽出しません。

資格情報を送らず TLS だけを探査する

クライアント設定前に、プロバイダー確認済み IMAPS エンドポイントへ TLS ハンドシェイクを 1 回だけ試せます。次の .invalid ホストは意図的に利用不能です。置換前に本機 OpenSSL が各オプションを対応するか確認します。

openssl s_client -connect imap.example.invalid:993 -servername imap.example.invalid -verify_hostname imap.example.invalid -verify_return_error -brief </dev/null

証明書チェーンとホスト名の検証に成功し、プロトコルがシステム方針を満たせば合格です。このコマンドはメールボックスへ認証せず、資格情報、権限、フォルダーの動作も証明しません。検証失敗時はシステム時刻、DNS、プロキシ、プロバイダー状態、CA パッケージを確認します。検証無視オプションを加えたり、独立検証していないサーバー末端証明書を恒久信頼したりしません。

ハンドシェイク出力はホスト、証明書主体、ネットワーク環境を露出するため、チケットには必要な項目だけ残します。企業管理プロキシのあるネットワークでは、検証を一時停止せず、管理者から管理済み信頼方式を入手します。

隔離設定で受信方向だけの IMAP 試験をする

以下では境界を示すため mbsync を使います。特定ディストリビューションパッケージやメールプロバイダーの推奨ではありません。まず導入済み版と公式マニュアルを確認します。試験は独立した設定、Maildir、状態ディレクトリを使い、同名パスがあれば停止し、既存設定を上書きしません。

config="$HOME/.config/isyncrc-example"
mailroot="$HOME/Mail/example"
state="$HOME/.local/state/isync-example"
test ! -e "$config" && test ! -L "$config" || { echo "Stop: $config already exists"; exit 1; }
test ! -e "$mailroot" && test ! -L "$mailroot" || { echo "Stop: $mailroot already exists"; exit 1; }
test ! -e "$state" && test ! -L "$state" || { echo "Stop: $state already exists"; exit 1; }
umask 077
mkdir -p -- "$HOME/.config" "$HOME/.local/state"
install -d -m 700 -- "$mailroot" "$state"
install -m 600 /dev/null "$config"

信頼できるローカルエディターで、新規作成した空ファイルへ次を記入します。ホストとユーザー名を置き換えますが、Pass は追加しません。対話実行時にクライアントからプロバイダー承認済みアプリ専用パスワードを入力します。無人実行が必要なら、監査済み鍵束ヘルパーと PassCmd を使い、秘密が引数、標準エラー、ログへ書かれないことを先に証明します。

IMAPAccount example
Host imap.example.invalid
Port 993
User user@example.invalid
TLSType IMAPS
SystemCertificates yes

IMAPStore example-remote
Account example

MaildirStore example-local
SubFolders Verbatim
Path ~/Mail/example/
Inbox ~/Mail/example/INBOX

Channel example-inbox
Far :example-remote:
Near :example-local:
Sync Pull New
Create Near
Remove None
Expunge None
SyncState ~/.local/state/isync-example/

この設定は INBOX だけを選び、遠隔からローカルへ新規メッセージを取得します。ローカル変更を送信せず、削除を伝播せず、expunge しません。実行時には本文を読み、機密な複製をディスクに残します。メールボックスが OAuth を使うならアクセス・トークンを Pass に入れず、このパスワード例を停止し、クライアントとプロバイダーが共同対応する OAuth フローへ切り替えます。

先に模擬し、その後 1 回だけ有界同期する

シェル追跡とセッション録画を無効にし、プロトコルペイロードやメール本文を表示する debug オプションを使いません。ファイル権限と設定差分を確認後、公式 --dry-run を実行します。

stat -c '%a %n' "$HOME/.config/isyncrc-example" "$HOME/Mail/example" "$HOME/.local/state/isync-example"
mbsync -c "$HOME/.config/isyncrc-example" --dry-run example-inbox

--dry-run は接続、認証、状態照会を行いますが、メールボックスや同期状態を変更しません。それでも出力にフォルダーやメッセージのメタデータが含まれ得るため、公開場所へ貼り付けません。証明書、認証、容量、権限、フォルダーマッピングの異常が一つでもあれば停止します。繰り返し再試行してロックや速度制限を起こしません。

承認後、-a ですべての設定を同期せず、指定チャンネルを 1 回だけ実行します。

mbsync -c "$HOME/.config/isyncrc-example" example-inbox

ローカル新着数、サンプルのハッシュ/サイズ、時刻、添付、文字コードを確認し、プロバイダーの Web 画面で遠隔メッセージ、フラグ、フォルダーが変化していないことを確認します。最初から本番メールを使わず、専用テストアカウントと非機密の種メールを使います。初回メールボックスが大きい場合は、プロバイダー管理者とクライアント文書で上限戦略を決め、プロセス強制終了で整合性を推測しません。

ローカル閲覧と同期を分離する

mbsync はコピーし、NeoMutt などの MUA は読みます。最初は MUA を新しいローカル Maildir だけに向け、遠隔アカウントも送信設定も与えず、ローカルの削除、移動、既読フラグが現在の一方向チャンネルを通じてサーバーへ戻らないことを確認します。Maildir を開くオプションと状態動作はクライアントごとに異なるため、mailx が Maildir を読めると仮定せず、その版の公式マニュアルに従います。

読む前にローカル複製と同期状態をバックアップします。ヘッダーだけの診断でも機密を漏らし得るため、共有端末、CI ログ、スクリーンショットで本番メールを開きません。HTML メール、添付、外部画像は未信頼として扱い、スクリプト実行、添付自動起動、遠隔追跡画像の読み込みを既定で止め、疑わしいファイルは別の安全プロセスで検査します。

「同期済み」は「バックアップ済み」ではありません。同期は状態や将来の削除を複製し得ます。バックアップには独立版、保持期間、整合性検証、復元演習が必要です。この試験では所有者が完全な方針を定義するまで削除伝播を意図的に無効にします。

POP3 は明確なダウンロード要件にだけ使う

POP3 は IMAP の完全なフォルダーとフラグモデルを保持しません。「ダウンロード後削除」「サーバーにコピーを残す」と UIDL 動作に関するクライアント設定がデータリスクを決めます。プロバイダーが現在も POP3 を正式対応し、業務がそのモデルを明確に必要とするときだけ POP3S 995 または保護された STARTTLS を使います。

初回接続前にテストアカウントで証明します。サーバーコピーが残るか、複数端末で重複ダウンロードするか、UID リセットをどう扱うか、添付と大容量メールが完全か、失敗再試行で重複するか、資格情報取消後にローカルデータをどう保持するかです。平文ポート 110 でログインする例、任意証明書を受け入れる例、既定で遠隔メールを削除する例はすべて拒否します。

IMAP から POP3 への変更はポート置換ではなくデータモデル移行です。サーバーエクスポート、復元可能なバックアップ、試験マトリクス、廃止計画なしに切り替えません。

秘密、権限、ログ

  • パスワード、アプリ専用パスワード、アクセス/更新トークンをコマンド引数、シェル履歴、環境変数、スクリーンショット、Git、記事設定へ入れません。
  • 設定、Maildir、同期状態、OAuth キャッシュ、鍵束アクセスヘルパーは専用アカウントだけが読みます。バックアップも暗号化とアクセス制御が必要です。
  • OAuth は最小のメール読み取り範囲を優先します。範囲を分離できない場合は追加権限を記録し、所有者がリスクを受け入れます。
  • プロバイダーが明示対応する場合だけ、個別取消可能なアプリ専用パスワードを使い、主パスワードを再利用しません。
  • 定期ジョブは独立サービスアカウント、制限ネットワーク、保護された鍵束を使い、ロック解除済み個人デスクトップセッションへ依存しません。
  • プロトコル本文、認証交換、メール、添付を表示するネットワーク debug を有効にしません。ログは既定で時刻、チャンネル、結果コード、秘匿化した件数だけを保持します。
  • メール自体が個人データ、機密、悪意ある HTML、添付を含み得ます。ローカル保持、削除、フォレンジック、インシデント対応を定義します。

秘密が引数、端末共有、ログ、Git に一度でも出たら、同期を止め、トークン/アプリパスワードを取り消し、アクセス記録を確認し、インシデント手順で更新します。ファイルを一つ削除しても漏洩済み複製は消えません。

障害分類と停止条件

症状先に集める非機密証拠安全な次手禁止する対応
DNS/接続失敗公式ホスト名、名前解決結果、ポート、時刻、サービス状態ネットワークとプロバイダー告知を確認無作為な IP、プロキシ、転載エンドポイントを試す
TLS 検証失敗ホスト名、証明書主体/期限、検証エラー、システム時刻DNS/時刻/CA を修正するか管理者へ連絡証明書またはホスト名検証を無効化
認証失敗方式名、クライアント版、プロバイダーエラーコード、MFA/OAuth 状態再試行を止め、公式方針を確認し、不審な資格情報を取消主パスワード、cookie コピー、トークン公開
フォルダー不足秘匿化したフォルダー名、namespace、購読状態、権限まず一覧だけ取り、プロバイダー意味と比較全遠隔フォルダーを自動作成/削除
重複または UID 変化チャンネル、状態版、UIDVALIDITY、秘匿化件数状態とローカル複製を凍結し、mbsync 復旧手順を確認状態削除後に盲目的再実行
容量/速度制限エラーコード、時間窓、件数とサイズ合計頻度を下げ、プロバイダーへ連絡並行ループや無制限再試行
ローカル権限異常数値モード、所有者、マウント、バックアップ方針閲覧を止め、専用ディレクトリアクセスを修正root の日常運用や全員読取権限

TLS 無効化、任意証明書信頼、設定/引数への秘密記載、他人のアカウント使用、組織方針回避、バックアップなしの削除伝播を必要とする手順はすべて停止条件です。

ロールバック、取消、オフボーディング

試験失敗時は最初に定期ジョブを無効にし、設定、同期状態、ログ要約、ローカル Maildir の読み取り専用証拠を保ちます。遠隔内容は削除しません。チャンネルが Pull NewRemove NoneExpunge None なので通常試験は遠隔を変えないはずですが、プロバイダー Web 画面で確認します。

特定された所有者がロールバックします。OAuth 許可またはアプリ専用パスワードを取り消し、該当鍵束項目を削除し、試験ディレクトリをアクセス制御された隔離領域へ移し、以前の設定を復元し、他クライアントが引き続き読めることを確認し、保持方針でローカルメールと状態の破棄時期を決めます。広いワイルドカードでメールボックスを清掃せず、ローカル複製削除をプロバイダーデータ削除と混同しません。

退職者や廃棄端末では、資格情報とクライアント登録を取り消し、ジョブを停止し、業務メールボックス所有権を引き継ぎ、監査ログを確認し、ローカル複製を暗号学的に消去し、完了証拠を記録します。個人主アカウントを恒久的な自動化依存にしません。

本番前チェックリスト

  • ローカルシステムメールボックス、IMAP、POP3、SMTP の責務を区別した。
  • ホスト、ポート、認証、容量、フォルダー意味、クライアント許可はプロバイダー公式資料に基づく。
  • TLS チェーン、ホスト名、有効期間の検証に成功し、降格や trust-all 設定がない。
  • OAuth は最小で取消可能な範囲、または承認済み独立アプリパスワードを使い、主パスワードを使わない。
  • 秘密が引数、環境、平文設定、ログ、スクリーンショット、Git にない。
  • クライアントと依存物はサポート対象ソフトウェア源から取得し、版と機能を記録した。
  • 初回試験は専用アカウント、種メール、隔離ディレクトリ、--dry-run を使う。
  • 別途レビューまで、同期は新着取得のみで送信、削除、expunge をしない。
  • ローカルディレクトリ、状態、バックアップ、ログが最小権限と明確な保持期間を持つ。
  • メッセージ整合性、遠隔不変、速度制限、失敗再試行、復元を検証した。
  • 監視、所有者、停止条件、資格情報取消、ロールバック、オフボーディング手順がある。

参考資料

歴史的原文アーカイブ

以下は source_export にある 2014 年の可視本文を、プライバシー置換以外の書き換えや行末変更なしで完全保存した不活性アーカイブです。個人受信者アドレス 6 か所を [historical recipient address redacted]、個人ホームディレクトリ 2 か所を [historical home directory redacted] にしました。原値は source_export と Git 履歴だけに残ります。HTTP 帰属先は出所証拠として囲み内にそのまま残しており、現在の推奨リンクではありません。囲み内の送信、添付、インストール、転載コマンドは古く、絶対に実行してはいけません。


在Linux系统下mail命令的测试

1. 最简单的一个例子:

mail -s test [historical recipient address redacted]

这条命令的结果是发一封标题为test的空信给后面的邮箱,如果你有mta并且后面的邮箱不会挡这种可能莫名奇妙的信的时候,就能收到这封信了。如果你不想被这种乱七八糟的事情干扰,后面的邮箱请使用本地帐户。

2. 第二个例子:

三种常用格式发信

mail -s test [historical recipient address redacted] #第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束

echo “mail content”|mail -s test [historical recipient address redacted] #第二种方法,我用的最多,可能是喜欢管道的缘故吧

mail -s test [historical recipient address redacted] < file #第三种方法,以file的内容为邮件内容发信

其实你很容易发现mail从标准输入读取文件内容并发信,我也只想让你知道这一点,到此,第二个例子结束。

3. 第三个例子,带附件的邮件

如果你的系统里没有uuencode命令的话,请先安装sharutils(yum install sharutils)

uuencode 需要两个参数,第一个是你要发送的文件(们),当然这个也可以用管道来做,第二个是显示的文件名

uuencode [historical home directory redacted]/a.gif a.gif|mail -s pictest [historical recipient address redacted]

tar czf – [historical home directory redacted]/ | uuencode home.tgz |mail -s pictest [historical recipient address redacted]

ps: 顺便补一句,slackware下的mail好像有一个-a参数,可以直接添加附件,我没有用过。

转自:http://www.svn8.com/linux/accidence/20091016/10858.html

Leave a Reply