メール送信にはまる
開発
ようやく光明が見え始めた。
メールサーバーの設定
自宅でメール送信を伴う処理のテストをするには wikipedia:Outbound_Port_25_Blocking を回避しないといけない。
うちでは ISP に Biglobe を使っているけど、SMTP-AUTH だけでなく、envelope-from も書き換えないと送信できなかった。
pyramid_mailer の Message オブジェクトの sender 設定
メールが送れるようなったら sender (envelope-from のこと) 設定がないとエラーが出るようになった。
pyramid_mailer.exceptions.InvalidMessage InvalidMessage: No sender address has been set
kotti_contactform を参考にしたら、てっきり sender 設定のないバグかと思って pull request を送った。
そしたら、sender は明示的に指定するのではなく、ini ファイルの mail.default_sender で設定するのがお作法だとコメントをもらった。
つまり、私の開発環境の ini ファイルに mail.default_sender を設定していなかったのが本当の原因だった (pull request は間違い) 。これは Kotti の設定じゃなくて pyramid_mailer の設定だ。回り道した (> <)
Sign Up 機能
Kotti 本体には、任意のユーザーからのサインアップ機能をもっていない。ユーザー登録時にメールを送信して、ユーザーがパスワードを設定できる機能はある。既存のユーザー追加フォームやメール受信者によるパスワード設定機能を使って、サインアップ機能は実装できた。
あとは、サインアップ時にそのユーザーのみが owner ロールをもつプライベートコンテンツを作るだけ。トップページの初回アクセス時にそうしようかと、サンプル実装していてひらめいた!
そう、イベントリスナーだ。
サインアップ画面で入力すると、パスワード無しの状態 (ログインできない) でユーザーのデータが作成される。その後にメールが送られて、パスワードが設定される。つまり、ユーザーの追加時に初期コンテンツを作成するイベントを登録しておけば良い。
一通り Kotti の仕組みが分かってきた気がする。もうちょっとだ。