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:
このパッチをplone.orgに送って取り込んでもらいましょうよ。
Thanks to your work on discovering this issue and proposing a solution. Have you posted an issue report to http://dev.plone.org ? If not, please do so. Perhaps your Plone patch will be made a part of Plone. It will also bring this issue to the attention of the development and internationalization teams to make sure that you have fixed the problem on the appropriate level.
(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を呼び出す箇所があります。
何かお役に立てればいいのですが...。