- PR -

subjectのmimeエンコードについて

1
投稿者投稿内容
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-02-01 00:47
kumapooです。

シェルスクリプトで、メールを送ります。
その際、下記スクリプトでは、subjectのmimeエンコードができません。
-----
※なんか、subjectはrfcでmimeエンコードするよう決められているようです。
http://www.mew.org/Newsletters/2.html
(subjectを参照)
-----
どのように実現したらよろしいでしょうか?
以下シェルスクリプトの抜粋です。

引用:


#!/bin/sh
--->省略
SUBJECT=`echo " [Alertメール送信] $UID_T " | nkf -jM`

cat <<END | nkf -j | sendmail -t -f${FROM}
MIME-Version: 1.0
Subject: $SUBJECT
From: $FROM
To: $MAILTO
Cc: $CC
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
Return-Path: $FROM
X-Mailer: ts1account $VERSION
X-Priority: 2
X-MSMail-Priority: High

※以下メール本文です。
--->省略



[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-02-01 00:48 ]
takepon
ベテラン
会議室デビュー日: 2005/11/28
投稿数: 55
お住まい・勤務地: 千葉県・東京都
投稿日時: 2006-02-01 09:03
takepon です。

nkf が使えるのなら、nkf -MB とかではダメですか?
手元に環境がなく、実例は提示できませんが。。

kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 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 ]
takepon
ベテラン
会議室デビュー日: 2005/11/28
投稿数: 55
お住まい・勤務地: 千葉県・東京都
投稿日時: 2006-02-01 14:11
引用:


修正語に再度スクリプトを実行し、送られてきたメールのソースを見ると、ソースの「Subject:」部分が期待するRFCに沿った形式になってはおらず、メーラーの件名も文字化けしています。





大変しつれいいたしました。
せっかくなので、Windows 版の nkfで確認してみました。

C:\>nkf -MB

だとだめですね。
nkfではヘッダ形式という指定が出来るようです。

引用:

-M[BQ] MIME に変換する。JISにコード変換してからbase64される。
-M ヘッダ形式に変換する
-MB base64 stream に変換する
-MQ Quoted stream に変換する



【実行例】
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 ]
流しのエンジニア
常連さん
会議室デビュー日: 2003/10/17
投稿数: 48
投稿日時: 2006-02-01 14:33
引用:

kumapooさんの書き込み (2006-02-01 13:16) より:
---
SUBJECT=`echo " [ほげほげほげ] " | nkf -MB`
---
のように修正いたしました。

--->期待するメールのソースの「Subject:」の形式
Subject:=?ISO-2022-JP?B?W3RzMRskQjR8OEJAWiRsTT05cBsoQl0=?=
---
Subjectをこういった形で出したいのですが、

--->takeponさんの修正による「Subject:」の形式(メーラーでの判別も不可)
Subject:IFt0czEbJEI0fDhCQFokbE09OXAbKEJdIHRlc3QtcHJvai1zdGFmZiAK
---


変換処理の手順が足りてません、きちんと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 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-02-01 14:35
kumapooです。

takeponさん、たびたびの回答ありがとうございます。
引用:

SUBJECT=`echo " [ほげほげほげ] " | nkf -M`


にしてみました。

結果だめみたいです。
また、文字化けっています。
#ただし、メーラーでうまく複合化してくれて日本語は表示しています。(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 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-02-01 14:45
kumapooです。

流しのエンジニアさんが回答したのを知らず、レスつけてしまいました。

RFC深いですね・・・>>流しのエンジニアさん。
でも、僕を含めどれだけのエンジニアがRFCを守っているのだろうか・・・。
今回訳あってRFCに準拠する形で修正しますが、(今まではメーラーが賢かったのと、RFC違反にもかかわらず、MTAがうまく転送してくれていたんだな〜)
訳がなかったら、絶対修正してなかっただろーなー。

でも、今回の事がきっかけでメールのエンコード少し勉強になりました。

ヒントありがとうございます。
そのようにスクリプトを修正してみます。>>takeponさん、流しさん

またのちほど結果ご報告いたします。
1

スキルアップ/キャリアアップ(JOB@IT)