Plone3.0以降のメール送信
概要
Plone3.0以降は、メール送信する際に、Ploneサイトのルートにある、プロパティを参照して、文字コード変換してくれます。デフォルトはUTF-8になっています。これを、ISO-2022-JPとすれば良いのですが、残念ながらエラーとなる箇所が存在ます。それは、UTF-8に対しISO-2022-JPにマッピング出来ていない物が存在するからです。
その為に、Pythonでは、encodeメソッドの、第2引数(decodeメソッドは第3引数)に'replace'や'ignore'を付加することができます。'replace'は安全な文字に置き換わり、'ignore'は無いものとして扱います。Ploneのコード内では、このようになっている箇所がほとんどありません。
Plone3.0-3.1の対策方法
さて、Ploneがメールを送る箇所は何カ所もあります。
それの洗い出しを全てしないとなりません。
これら以外をご存じの方は、連絡下さい。
ユーザ登録関係では、下記の2カ所だと思います。
Products/CMFPlone/RegistrationTool.py
mailPasswordメソッド
Products/CMFPlone/RegistrationTool.py
registeredNotifyメソッド
これら2つは、Ploneサイトルートにある、プロパティのemail_charset を使っています。
ただ、ここで、ISO-2022-JP を指定すると、エラーになってしまいます。
それらの対策は、下記の通りです。
mailPasswordメソッドは、
mail_text = mail_text.encode(email_charset)
を
mail_text = mail_text.encode(email_charset, 'replace')
registeredNotifyメソッド
host.send(mail_text.encode(encoding))
を
host.send(mail_text.encode(encoding, 'replace'))
と変更することで、エラーが無くなります。
Ploneには、お問い合わせフォーム
Products/CMFPlone/skins/plone_form_scripts/send_feedback_site.cpy
から、
Products/SecureMailHost/SecureMailHost.py
secureSendメソッド
を使っています。
secureSendメソッドは、unicodeでメッセージを渡すと、
文字コードを変更してくれます。
message = context.site_feedback_template(context, **variables)
を
message = context.site_feedback_template(context, **variables).decode()
しかし、そこでも、エラーを起こす可能性があるので、
message = message.encode(charset)
を
message = message.encode(charset, 'replace')
と変更する必要があります。
最後に
なお、この対策をした場合、jaMailHostがあると処理が重なり問題になると思います。
早い段階で、これらの対策をした、パッチプロダクトをリリースしたいと思います。