Thunderbird – 「セキュリティエラー ドメイン名が一致しません」対策

TSL 接続で POP 受信しようとした証明書エラーが出る場合、
下のアドオンを入れると便利です。
 
Remember Mismatched Domains

「ドメイン名の不一致」と「サーバ証明書の期限切れ」のセキュリティ警告ダイアログに「このドメインのための証明書について今後は警告しない」というチェックボックスを追加し、次回以降、警告を非表示にできます。

 
本来は正規に取得した証明書を使うべきなのですが、わざわざPOPアクセスドメイン(pop.example.com)のために証明書を買えない状況や、そもそもメインドメイン(example.com)の証明書がオレオレだったりする場合もあるわけで。。
 
ご参考までに。
 
– 参考:
セキュリティエラー:ドメイン名が一致しません(mozillaZine)

procmailrc でひとつの条件に複数のアクションを指定する

同じ条件で複数指定すると簡単に実現できます。

 :0
 * 条件A
 * 条件B
 アクション1
 
 :0
 * 条件A
 * 条件B
 アクション2

が、同じ条件が分散するのは宜しくない、ということで。

 :0
 * 条件A
 * 条件B
 {
     :0
    アクション1
    :0
    アクション2
 }

このように括弧を使うと複数のレシピをひとつのアクションとして扱うことができます。
 
参考:
Procmail How-To page

CUI メーラーを使う

– ローカルにあるメールを読みたい
– メールサーバにあるメールを POPや IMAP 経由でいちいちダウンロードすることなく SSH でつないでそのまま読みたい
 
という場合に便利なのが、mutt というCUI メーラです。
 
日本語対応版パッチ, RPM はここからダウンロードできます。(FreeBSD の ports では mail/mutt)
 
利用の際はMutt Japanese Editionにある、日本語マニュアルが大変参考になります。
 
たとえば

mutt -f ./Maildir

とすれば、カレントディレクトリの Maildir を参照し、その中にあるメールの閲覧、削除、返信等ができます。

q:中止 d:削除 u:復活 s:保存 m:メール r:返信 g:全員に返信 ?:ヘルプ
   1 May 31 **** project ( 0) [*****] 登録内容確認のお願い
   2 Mar 21 Charlie Root ( 0) ClamAV Scanning Report
   3 O Mar 21 Charlie Root ( 0) www.ecoop.net security updates
   4 O Mar 21 Charlie Root ( 0) test
   5 Mar 21 Cron Daemon ( 0) Cron <root@local> /root/sbin/task.sh
   6 N Mar 21 ********* ( 0) <<重要>>「******」登録依頼用認証コード
   7 N Mar 21 ********* ( 0) <<重要>>「*******」登録依頼用認証コード
   8 N Mar 21 ********* ( 0) 「******」登録確認メール
 
-*-Mutt: postmaster [Msgs:8 3.0M]—(date/date)————————-(all)—

詳細はマニュアルに譲りますが、大まかな使い方は
– mutt -f /path/to/Mailbox でメールボックスを開き
– エンターで、指定メールを開く
– スペースでページを送る(最後尾の場合次のメールに切替え)
– メール表示中 q でメール一覧に戻る
– d で指定メールを削除
– メール一覧表示中 q で mutt 終了
です。ちなみに一覧で
– N とフラグが立っているのが新規メール
– O とフラグが立っているのは未読の古いメール
– D とフラグが立っているのは d キーで削除チェックをいれたメール(この状態でメーラを終了するとその時に削除されます)
– フラグの無いものは、既読メール
です。

Java で簡単に使える SMTP サーバパッケージ

Dumbster
Java 用のメール受信ができるパッケージ。
– メール送信処理の単体テストに使える。

SimpleSmtpServer server = SimpleSmtpServer.start(); // ローカルポート25 を Listen
// テストする処理: localhost 宛のメール送信処理
server.stop();
 
// 受信メール数
assertEquals(1, server.getReceivedEmailSize());
// 一通目のメールを取得する。
SmtpMessage email = server.getReceivedEmail().next();
// タイトル
assertEquals(“Test Subject”, email.getHeaderValue(“Subject”));
// 本文
assertEquals(“Test Body”, email.getBody());

メール添付ファイルのデコード

– base64 エンコードされて改行区切りになったデータを受けてデコードして出力する。

$ php -r ‘ $buf = “”; while(!feof(STDIN)) $buf.= fgets(STDI
N); $buf = str_replace(“\r”,””,str_replace(“\n”,””,$buf)); echo base64_decode($buf); ‘ < /tmp/input.txt > /tmp/output.rtf

Content-Header, Content-Body の仕様(RFC の抄版ぽく)

– 全ての基本はテキストメール(RFC822)
改行はCRLF(0x0D,0x0A)
NULL(0x00)は禁止
– HTMLメールなどを含む形態としてMIMEメールが標準化(ex. RFC2046)
FF(0x0C/Ctrl+L)は改ページ
HT(0x09/Tab)はタブ文字
HTTPプロトコルと大体同じ書式を持ち、Content-HeaderとContent-Bodyに分けられる
– メールにはASCII文字(0-127)しか含めないため、日本語を扱うには文字コードをiso-2022-jpにエンコードする必要がある(iso-2022-jp:is regulated at RFC2047)。
– 半角カナはiso-2022-jpの規格外のため、利用できない。メーラーで全角カナに変換すべき。携帯では携帯同士の場合独自仕様で半角カナを使っているがPCを送信対象とする場合(おそらくはサーバーで)全角カナに自動変換される。
– Content-Body では CRLFを除き1行は998バイト以下が必須、78バイト以下が推奨されている。ただしメーラーでこれをチェックして自動改行を行う場合は Quoted-Printable 等を使うべき。
 
 
<Content-Header>
– ヘッダの各行の書式 = Field-name:Value
– ヘッダ終端は空行
– Field-nameは文字の大きさを問わない
– 1つのヘッダについて複数行記述可能。その際は行頭にタブか半角空白を入れる
– 1行は末尾のCRLFを除いて76バイトまでという制約がある。
– ()で囲むとその部分は制御上はコメントとして無視される
– エンコードは

=?文字コード?符号化方式?データ?=

のようにする。符号化方式はアルファベット1文字でB(Base64),Q(Quoted-printable)を指定
– ヘッダにおける符号化の規約として'”‘の間の文字列はエンコード/デコードしてはならない。
“”の意味はそれ以上でもそれ以下でもないため、如何なる場合でも省略が可能。
(Outlook Expressは余裕で規約違反をして、逐一””を使い、かつその中で符号化していますが。
なお、ヘッダの符号化は MIME-VERSION:1.0 でなくても利用可能。
– To: {Mail-address | 名前 <Mail-address>}
あて先。複数可。その場合’,’で区切る(改行する場合’,’の後が推奨される)
名前に’,’など特殊文字を使いたい場合は'”‘で囲まなければならない
あとどうでもいい仕様。
To: グループ名:Mail-address,Mail-address,…;
とするとメーラーによっては送信時にグループ単位送信を行う。
送信時に’:’から’;’の間の文字列を削除するため、同グループ内の他人同士は匿名になる
その際の受信側ヘッダは次のようになる
To:グループ名:;
– Cc:
コピー送信先。Toに同じ
– Bcc:
隠れコピー送信先。(Bcc自身も含む)全送信者について送信前にBcc:項目を削除する。Toに同じ
– From:
送信者。Toに同じ
– Sender: mail-address
Fromと似ているが1つしか指定できない。Fromで複数指定した場合の実際の送信者を指定する場合に利用
– Reply-To: mail-address
Fromとは違うあて先に返信して欲しい場合に指定。ただし受信側メーラーに動作を任せるのでこれだけに対してのみ必ず返信になるという信頼性はない。
– Date: GMT-Date-and-Time
送信時刻。
書式 = 曜日, 日 月 年 時:分:秒 ゾーン
曜日は省略可。曜日と月は英語3文字
ゾーンは標準時刻からの時差と地域をあらわす
ゾーン = 時差
ex)Date: Sat, 1 Aug 1998 14:23:33 +0900 (JST)
– Subject: title
題名
– X-*
X-ではじまるヘッダはユーザー定義フィールド以下にそのうち標準的なものを挙げる
– X-Mailer: Mailer-Software-Name
メーラーの識別子、OS情報など
– X-Face:????
小さな顔写真を格納、表示できる
 
– Message-ID: <メール固有のID>
メール固有のID(通例、送信元メールアドレスの前に時間情報と’.’を付加したもの/メールアドレスが
省略されることもある)を<>で囲む。(RFC2111)
ex) Message-ID: <237820.foo@sample.com>
他のメッセージから
“mid:” message-id [“/” content-id]
という書式で参照できる
IDのフォーマットはRFC822では次のように定められている

msg-id = “<" addr-spec ">”
addr-spec = local-part “@” domain ; global address
local-part = word *(“.” word) ; uninterpreted
                                            ; case-preserved
word = atom / quoted-string
atom = 1*<any CHAR except specials, SPACE and CTLs>
specials = “(” / “)” / “<" / ">” / “@” ; Must be in quoted-
/ “,” / “;” / “:” / “\” / <"> ; string, to use
/ “.” / “[” / “]” ; within a word.
CTL = <any ASCII control ; ( 00- 037, 0.- 31.)
character and DEL> ; ( 0177, 127.)
quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
; quoted chars.
qtext = <any CHAR excepting <">, ; => may be folded
“\” & CR, and including
linear-white-space>
linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
; CRLF => folding
LWSP-char = SPACE / HTAB ; semantics = SPACE
HTAB = <ASCII HT, horizontal-tab> ; (011,9.)

quoted-pair = “\” CHAR ; may quote any char
CHAR = <any ASCII character> ; (00-0177, 0.-127.)

domain = sub-domain *(“.” sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom ; symbolic reference
domain-literal = “[” *(dtext / quoted-pair) “]”
dtext = <any CHAR excluding “[“, ; => may be folded
“]”, “\” & CR, & including
linear-white-space>

– In-Reply-To: <メール固有のID>
メールを返信する際、元のメールのMessage-IDを指定する。
References:<メール固有のID> <メール固有のID> <メール固有のID> …
関連ある電子メールを複数記述できるフィールド
– Received: from mailgate-server-address (????-address [IPv6]) by received-address; GMT-Date-and-Time
メール送信における中継配送システム情報。Receivedは1つ以上存在し、通例として新しいものは古いものの前に付加される。付加を行使するのは受信側サーバ。直近のものほど信頼性はある。
from 送信サーバホスト名 (IP逆引きホスト名 [xxx.xxx.xxx.xxx])
by 受信サーバホスト名
; 中継時刻
– MIME-Version: version-number
省略した場合テキストメール。指定した場合MIMEメールとして扱われる。RFC2045で規定。
ex)MIME-Version: 1.0
– Content-*
MIMEで使うフィールドとして予約されており、Content-から始まるヘッダについては各パートは完全に独立している
– Content-Type: MIME-TYPE; parameter
MIME-version:1.0で対応。これによりメールのデータ形式が定義される
parameterはセミコロンで区切りparam=valueの形で記述。
MIME-TYPEはスラッシュで主型、副型に分けられ、不明な副型の場合主型で標準のものを採用。
パラメータの種別は主型による。
ex) Content-Type: text/plain; charset=iso-2022-jp
MIME-TYPE一覧: http://www.geocities.co.jp/Hollywood/9752/mime.html
その他: RFC2046
MIME-TYPE = (一例)
text/ : テキスト系
parameter =
charset: 文字コード.
iso-2022-jp=日本語,US-ASCII=英語(デフォルト),ISO-8859-1=欧系言語
format:????
flowed=????
name: ファイル名。Content-Disposition: attachmentがあるのでいらないような。
x-unix-mode: UNIXにおけるパーミッションを8進数で(0644
  plain: 通常のテキストベースメール(デフォルト)
    html: HTMLメール
    img/ : 画像系
    
    Multipart/ : マルチパート系。これにより複数のパートを再帰的に格納できるようになる(フォルダに譬えられる)
    Content-Type:Multipart/*; のContent-Bodyの内容は完全に無視される。
    parameter =
    boundary:パートの区切り子の名前。”〜”のようにダブルクォートで囲む。
    各パートは独立したContentとなり、通常のテキストメールと同じ
    header/body 構成になる。区切り子には先頭に’–‘を付加したものが、
    終端子にはさらに後ろにも’–‘を付加したものを使う。区切り子の前は
    ヘッダと同様空行にする。(ただしヘッダを省略した場合は末尾の空行は不要/終端子の後のデータは無視される)
    [boundaryに使える文字列定義](RFC2046-P21)

    boundary := 0*69<bchars> bcharsnospace
    bchars := bcharsnospace / ” “
    bcharsnospace := DIGIT / ALPHA / “‘” / “(” / “)” /
                          “+” / “_” / “,” / “-” / “.” /
“/” / “:” / “=” / “?”

ex)
Content-Type: Multipart/Mixed;boundary=foo
Content-Transfer-Encoding: 7bit

–foo
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

Hello,world!

–foo
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

あいうえお

–foo–

Mixed: 多種のパートを混在させるという宣言(デフォルト)。添付ファイル等に使う。
alternative: 同一の内容を複数のMIME-TYPEで記述するという宣言。受信メーラーによってタイプを選択させるためのもの。(text/plainとtext/html 等)
related: 各パートがリンクしている事を宣言。(HTMLからのContent-ID(CID:〜)による呼び出しができるようにする
parallel: Mixedとほぼ同じだが、複数パートを順序を問わず同時実行。事実上多くのメーラーは連続的に実行。
digest: それぞれのパートのデフォルトMIME-TYPEがmessage/rfc822とされる
Message/
Rfc822 : メールの転送・カプセル化(RFC2046-5.2)
トップレベルでの利用の場合、Recent-From,Recent-To,Recent-Date等を送信時にFrom,To,
Dateの代わりに使うが、その際、受信側の返信先はFromになる。
もうひとつの方法として Multipart/Mixedのパートの一部に含めてカプセル化することも
可能。
Partial: ちょっとパス.(RFC2046-P29)
content-transfer-encodingは7bitでなければならない。
external-body: 外部(ファイル)参照(RFC2046-5.2.3)
parameter =(RFC2046-5.2.3.1)
[共通]
access-type: アクセス形式(文字の大小を問わない)
local-file=nameはメール受信側のローカルファイルパスになる
その他 mail-server,ftp,anon-ftp,tftp, x-*
expiration: 有効期限. GMT-Date-Timeを記述(略可
その他,parmission,size
[ftp/tftp]
name: ファイルパス
site: アクセス先ドメイン
以下略
[local-file]
name: ファイルパス
以下略
Content-Bodyの直前にさらに参照先ファイルのためのContent-Headerを書く。
第二のContent-HeaderにはContent-IDを含むべき。
それ以下のContent-Bodyの意味はaccess-typeにより異なる。local-fileの場合意味なし。
content-transfer-encodingは7bitでなければならない。
– Content-Transfer-Encoding: type
MIME-version:1.0で対応。これによりContent-Bodyの符号方式が定義される
type =
7bit : 無変換。Content-Bodyを7bit(文字コード 0-127)の行の集合とする(デフォルト)
8bit : 無変換。7bitの定義のうち1バイトつでも8bitが含まれるもの。
binary : 無変換。その他。
base64 : 64進数エンコード。[A-Za-z0-9+/]の64文字で表される
quoted-printable : 特殊文字を”=16進数”で表現する。=は”=3D”のようにエンコードする。長い行は行末に=をつけ改行される。
Multipart,Messageは無変換でなくてはならない。
– Content-Description: message
パートに対する説明。like the header “subject”
– Content-Disposition: attachment; filename=”filename”
そのパートをファイルとして保存する場合のファイル名を”〜”の中に指定できる
attachment は添付ファイルとして扱うことを宣言。
– Content-ID: <パート固有のID>
同一RelatedパートのHTMLからURIとして”cid:part-ID”として参照できる。定義と利用の順番は問わない。
ex)

Content-ID: <foo1234>

という画像パートがある場合

<img src=”cid:foo1234″>

で表示できる。(RFC2111) 書式は Message-ID とまったく同じ。

Outlook Express で Multipart/Related したときの望ましくない挙動

– ドキュメント整理(2004-06)
– Multipart/Related でも、直接の呼び出しが実行中のメールに存在しない場合には添付ファイル扱いになる(A HREF=”CID:〜”ではだめ)。
– HTML同士の Related で<A>や<Iframe>を使おうとしても無理。やはり添付ファイル扱いに。

PHP でメールするときの注意等

– 過去に書いたドキュメントを整理するため、整形してコピペ。内容は多分 2004-06 くらいのもの。
– mail関数と、そのラッパーであるmb_send_mail関数があるが、後者はオプションのヘッダ指定に無関係に、自動的に

MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

という3つのヘッダを挿入する(Content-Typeを明示的に指定していてもなお)。
– mail関数のデフォルトのヘッダーは
mail(‘foo@yyy.zz’,’title’,’message’);
として送信した場合、

Return-Path: <anonymous@local.host>
Delivered-To: foo@yyy.zz
Received: (qmail xxxxx invoked from network); 2 Apr 2004 15:13:40 +0900
Received: from unknown (HELO local.host) (xxx.xxx.xxx.xxx)
  by pcxxx.xxx.xxx.xxx.in-addr.foo with SMTP; 2 Apr 2004 15:13:40 +0900
Received: (qmail xxxxx invoked by uid 80); 2 Apr 2004 15:13:40 +0900
Date: 2 Apr 2004 15:13:40 +0900
Message-ID: <20040402061340.11671.qmail@local.host>
From: anonymous@local.host
To: foo@yyy.zz
Subject: title
 
message
 

のようになる。(Received:はもちろんmail関数がつけたものではない)
– MIME-Versionフィールドを指定する場合、第四引数でヘッダ指定する場合に改行は\r\nや直接の改行(SJISの場合CRLFになる)ではなく\nでなければならない。(MIME-Version:1.0を宣言した行以降は\rも\nも1つの行として認識されるため。
– PHPでHTMLメールを送るごく簡単な例)

sAddHeader = “MIME-Version: 1.0\n”
.”Content-Type: multipart/alternative;\n”
.”boundary=\”—-=_NextPart_000_0024_01C418A2.AA46C5F0\”\n”;
$sMessage = “This is a multi-part message in MIME format.”
.”\n\n——=_NextPart_000_0024_01C418A2.AA46C5F0\n”
.”Content-Type: text/plain; charset=ISO-2022-JP\n”
.”Content-Transfer-Encoding: 7bit\n\n”
.”プレーンテキストメールです\n”
.”\n\n——=_NextPart_000_0024_01C418A2.AA46C5F0\n”
.”Content-Type: text/html; charset=ISO-2022-JP\n”
.”Content-Transfer-Encoding: 7bit\n\n”
.”<font color=’red’>HTMLメールです。あ</font>いう<b>えお</b>\n”
.”\n\n——=_NextPart_000_0024_01C418A2.AA46C5F0–\n”;
//送信先メールアドレス等。
$sMailAddress = ‘foo@xxx.zz’;
$sTitle = ‘タイトル’;
if(mail($sMailAddress,$sTitle,$sMessage,$sAddHeader))
echo “sent successfully!\n”;
else
echo “sent failure”;