- - PR -
subjectのmimeエンコードについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-01 00:47
kumapooです。
シェルスクリプトで、メールを送ります。 その際、下記スクリプトでは、subjectのmimeエンコードができません。 ----- ※なんか、subjectはrfcでmimeエンコードするよう決められているようです。 http://www.mew.org/Newsletters/2.html (subjectを参照) ----- どのように実現したらよろしいでしょうか? 以下シェルスクリプトの抜粋です。
[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-02-01 00:48 ] | ||||||||
|
投稿日時: 2006-02-01 09:03
takepon です。
nkf が使えるのなら、nkf -MB とかではダメですか? 手元に環境がなく、実例は提示できませんが。。 | ||||||||
|
投稿日時: 2006-02-01 13:16
kumapooです。
--- SUBJECT=`echo " [ほげほげほげ] " | nkf -MB` --- のように修正いたしました。 修正語に再度スクリプトを実行し、送られてきたメールのソースを見ると、ソースの「Subject:」部分が期待するRFCに沿った形式になってはおらず、メーラーの件名も文字化けしています。 しかも今までは、メーラが自動的に判別してくれて日本語になりましたが、今回は駄目のようです。ただ今までのsubjectだと、RFC違反になってしまいうため、今回RFCに沿った形でシェルスクリプトを改修したいと思っています。 やっぱ、perlとかphp使わないと無理ですかね。 以下、メールのソースです。 --->期待するメールのソースの「Subject:」の形式 Subject:=?ISO-2022-JP?B?W3RzMRskQjR8OEJAWiRsTT05cBsoQl0=?= --- Subjectをこういった形で出したいのですが、 --->takeponさんの修正による「Subject:」の形式(メーラーでの判別も不可) Subject:IFt0czEbJEI0fDhCQFokbE09OXAbKEJdIHRlc3QtcHJvai1zdGFmZiAK --- --->今までの形(メーラーで判別してくれた、でもRFC違反) [ts1$B4|8B@Z$lM=9p(B] --- [ メッセージ編集済み 編集者: kumapoo 編集日時 2006-02-01 13:18 ] [ メッセージ編集済み 編集者: kumapoo 編集日時 2006-02-01 13:22 ] | ||||||||
|
投稿日時: 2006-02-01 14:11
大変しつれいいたしました。 せっかくなので、Windows 版の nkfで確認してみました。 C:\>nkf -MB だとだめですね。 nkfではヘッダ形式という指定が出来るようです。
【実行例】 C:\>nkf --version Network Kanji Filter Version 2.0.5 (2005-04-10) for Win32 Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002-2005 Kono, Furukawa, Naruse C:\>echo ほげほげほご | nkf -M =?ISO-2022-JP?B?GyRCJFskMiRbJDIkWyQ0GyhCIA0K?= Outlook Express で見たところ、ちゃんと変換されました。 [ メッセージ編集済み 編集者: takepon 編集日時 2006-02-01 14:14 ] | ||||||||
|
投稿日時: 2006-02-01 14:33
変換処理の手順が足りてません、きちんとRFCを読む必要があるかと。 =?「文字コード」?「B」?「BASE64で変換された文字列」?= 期待されるサブジェクトの形式を見るとなんとなく分かるかと思いますが、上記のような形式になってます。 「=?」および「?=」はサブジェクトの文字列の範囲の開始と終了を表すコード。 「?」は領域の区切りです。 ?で囲まれたBの部分はエンコーディングがBASE64であることを表す領域です。 MIMEにはPrinted-Quotableというエンコーディング方式もありそちらはQで表されます。 下記の例では「ISO-2022-JP(JISコード)」を文字コードとしており、BASE64でエンコーディングされた「W3RzMRskQjR8OEJAWiRsTT05cBsoQl0=」というデータがサブジェクトであるということになります。 例:Subject:=?ISO-2022-JP?B?W3RzMRskQjR8OEJAWiRsTT05cBsoQl0=?= 一方 Subject:IFt0czEbJEI0fDhCQFokbE09OXAbKEJdIHRlc3QtcHJvai1zdGFmZiAK はそんな宣言はないのでなんのことやら分かりません。 このデータはどんな文字コードで書かれたデータを何のエンコーディングを使用して変換したものかを示してやる必要があります。 なので、nkfでMIME64に変換する処理を行うのであれば、元のデータがJISコードのデータを変換するという処理にする必要があります。 今回の元データは一応、JISコードの文字をMIME64変換したものになっているようなのでnkfの変換処理で得られたデータ 「IFt0czEbJEI0fDhCQFokbE09OXAbKEJdIHRlc3QtcHJvai1zdGFmZiAK」 に対して 前方に「=?ISO-2022-JP?B?」 後方に「?=」 を付けたデータを作成し、それをSubjectの値として渡す処理を作成すれば良いかと思います。 追記 takeponさんがもう解決作を提示してますね。 まあ、背景にあることはこういうことなんだなという参考ということで。 [ メッセージ編集済み 編集者: 流しのエンジニア 編集日時 2006-02-01 14:36 ] | ||||||||
|
投稿日時: 2006-02-01 14:35
kumapooです。
takeponさん、たびたびの回答ありがとうございます。
にしてみました。 結果だめみたいです。 また、文字化けっています。 #ただし、メーラーでうまく複合化してくれて日本語は表示しています。(RFC違反) ちなみに、以下の環境で実行しているのですが、nkfのバージョン違いによりうまく符号化できなかったりするんですかね? # uname -a Linux ts1 2.4.27-2-686-smp #1 SMP Mon May 16 16:55:31 JST 2005 i686 GNU/Linux # apt-cache show nkf Package: nkf Priority: optional Section: text Installed-Size: 200 Maintainer: NOKUBI Takatsugu <knok@daionet.gr.jp> Architecture: i386 Version: 2.04-1 Depends: libc6 (>= 2.3.2.ds1-4) Filename: pool/main/n/nkf/nkf_2.04-1_i386.deb Size: 78170 ・・・以下省略 [ メッセージ編集済み 編集者: kumapoo 編集日時 2006-02-01 14:37 ] | ||||||||
|
投稿日時: 2006-02-01 14:45
kumapooです。
流しのエンジニアさんが回答したのを知らず、レスつけてしまいました。 RFC深いですね・・・>>流しのエンジニアさん。 でも、僕を含めどれだけのエンジニアがRFCを守っているのだろうか・・・。 今回訳あってRFCに準拠する形で修正しますが、(今まではメーラーが賢かったのと、RFC違反にもかかわらず、MTAがうまく転送してくれていたんだな〜) 訳がなかったら、絶対修正してなかっただろーなー。 でも、今回の事がきっかけでメールのエンコード少し勉強になりました。 ヒントありがとうございます。 そのようにスクリプトを修正してみます。>>takeponさん、流しさん またのちほど結果ご報告いたします。 |
1