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があると処理が重なり問題になると思います。
早い段階で、これらの対策をした、パッチプロダクトをリリースしたいと思います。
- カテゴリ
- Zope/Plone
- 固定リンク
- ¦
- コメント (3)
- ¦
- トラックバック (0)
- トラックバック用URL:
(attempted translated version)
あなたの仕事のおかげでこの問題を発見し、解決策を提案する。 http://dev.plone.orgにバグレポートを投稿することがありますか? 、そうでない場合をご覧ください。おそらく、あなたのパッチをPloneの一部を構成することができます。また、機会の開発チームとの修正協議を提案できるようになりますして、適切なレベルでこの問題を修正していることを確認します。
Plone3でJISのメールが送れるとは知りませんでした。
Plone2.1からの流れで jaMailHostを利用しています。Plone標準ではなく、個別のプロダクトまで含めると、対応が難しそうなのでそのようにしてみました。
#サイトのエンコーディングはUTF-8、メールはJISでという場合は、email_charset をISO-2022-JPにすれば良いということでよろしいでしょうか。
今頃のコメントで恐れ入りますが、個別プロダクト以外で「ここもそうかな?」と思ったのが、「コンテンツルール」の箇所です。
サイト設定->コンテンツルールのところで、コンテンツの状態をトリガにしてロギングやメッセージ送信をしたりします。
こちらにもメール通知機能があります。
plone.app.contentrules-1.1.5-py2.4.egg/plone/app/contentrules/actions/mail.py に、secureSendを呼び出す箇所があります。
何かお役に立てればいいのですが...。