2009-10-07

PloneFormGen

今回は、PloneFormGenについて。

このプロダクトを使うと、コーディングの知識とかがなくとも、また、Plone/Zopeの管理者権限が無くとも、簡単に『連絡』フォームのようなものが作成できます。
凝ったレイアウトはできませんが、通常、入力フォームは上から下にレイアウトして行けばいいので、その点は問題なし。プルダウンやチェックボックスなども、コンポーネント化されているので、面倒なHTMLを書かなくとも、GUIっぽく追加、位置を調整するだけで済みます。
ploneFormGenのスクリーンショットプロダクトに関しては、以下のサイトにとても詳しく書かれていますので、ご興味のある方は、ぜひどうぞ 。
(作者のお二方、本当にありがとうございます!)

  1. nyusukeさま / http://nagosui.org/Nagosui/COREBlog2/ploneformgen
  2. 鈴木たかのりさま / http://takanory.net/takalog/946
    ※メールのJIS化についても、2の鈴木さまの方法で対応できました。

さて、動作確認のため、簡単なフォームを作ったのはいいのですが、気になる点が2つほど出てきました…。

  1. メッセージをPOSTした本人には、メッセージのコピーがCCという感じで送信されたりしない。
  2. jaMailHostと組み合わせると、添付ファイル(テキスト)がうまく扱えないらしい。(添付ファイルがtext/plainの場合、メール本文中にインライン展開されるが、その際のエンコーディングがasciiで文字化けしてしまう)

1点目は、ZMI上のテンプレートやスクリプトで対応できるかしら、と思ったのですが、どうやらそうではなさそうです。
差出人のアドレス(replytoというフォーム名)の値は、毎回動的に変わりますが、ToおよびCCは編集画面で指定した値が固定になってしまいます。

Poiもそうなのですが、投稿者本人にも内容をCcして欲しいなあと思ったので、ソースを見て修正してみることに。

PloneFormGenは、buildout.cfgでeggs = に指定していたので、ソースを修正してコンパイルしてくれるように、buildout.cfg を変更しました。

# Provide the *paths* to the eggs you are developing here:
develop = src/Products.SecureMailHost
          src/Products.PloneFormGen

つぎに、それらしい箇所を見つけたので、修正してみました。
修正ファイルは、以下です。

  • PloneFormGen/content/formMailerAdapter.py

返信用のReplyToは、reply_addr という変数に入ります。この値をCCに追加できれば良いので、次にCCの指定をしている箇所を探しました。

headerinfo['Cc'] = self._destFormat( cc_recips ) という一行があったので、ここでCCを指定しているはず。
ここにreply_addrを追加すればいいや…と思って、以下のような感じにしてみました。

headerinfo['Cc'] = self.secure_header_line(reply_addr) + ',' + self._destFormat( cc_recips )

無理やりですが、めでたくCCにPOSTした本人も加わったみたいです…。

もう一点のほうは、すごく安直?な方法ですが、インライン展開させず、ほかのコンテンツタイプ(画像やバイナリ)などと同じ扱いにすることにしました。

#if maintype == 'text':
#    msg = MIMEText(content, _subtype=subtype)
#elif maintype == 'image':
if maintype == 'image':
    msg = MIMEImage(content, _subtype=subtype)
elif maintype == 'audio':
    msg = MIMEAudio(content, _subtype=subtype)
else:
    msg = MIMEBase(maintype, subtype)
    msg.set_payload(content)
    # Encode the payload using Base64
    Encoders.encode_base64(msg)

# Set the filename parameter
msg.add_header('Content-Disposition', 'attachment', filename=filename)
outer.attach(msg)

つまり、mimetypeがtextの場合はMIMETextとして扱っていたものをコメントアウトしてしまい、その他のMIMEBaseと一緒にしてしまいました。

今のところ、これでうまく行ってくれているようです。

なお、メールの送信については、2の鈴木さまのエントリで触れられているとおり、MailHostが使われていません。この点は、同じようにメール送信を行うPoiというプロダクトでかなり悩まされていたので、Pythonに明るくない私にとっては、コードの調整のために非常に参考になりました。

0 件のコメント:

コメントを投稿