WMF

メールフォームをどうするか

2010-01-25

何気に機能が充実してきたわけだけど、やはり必要と思われるメールフォーム。
さて、どうやって実装しよう。
メール専用のページを作るのは趣旨から反するわけだし。

特定のリクエストがあれば、たとえば「?cmd=mailform」とかあればメールフォーム関連の処理を経由するなどが考えられる。
<form method="post">
<input type="hidden" name="cmd" value="mailform-edit">
<input type="text" name="subject" value="">
<input type="text" name="body" value="">
<input type="submit" value="内容を確認">
</form>
これで送信するとして、
<form method="post">
<input type="hidden" name="cmd" value="mailform-confirm">
<input type="hidden" name="subject" value="{$subject}">{$subject}
<input type="hidden" name="body" value="{$body}">{$body}
<input type="submit" value="内容を送信">
</form>
で確認して送信すれば完了

だとfirebug等で書きかえられちゃうので、内容はセッションに格納して
{$subject}
{$body}
<form method="post">
<input type="hidden" name="cmd" value="mailform-confirm">
<input type="submit" value="内容を送信">
</form>
としたほうがいいだろう。

で、問題はこの機能をどこに組み込むか。
とりあえず?cmd=mailform-editを監視して、指定があればpostをparseして
$ok -> param( 'mailform-confirm', 1 );
とでもフラグを立てて分岐させる。

cmd=mailform-confirmがPOSTされて、セッションに情報があれば管理者にメールを送信する。
あ、メールの送信先の指定をどうしようか。
設定に送信先でも追加しておくか。

う~ん、とりあえず実装してみて様子を見ようかな。
で、いじってみた

cmdは入力内容の確認のためにmailform_confirm
送信用にmailform_sendを用意
件名はmailform_subject
内容はmailform_body
にしてみた。

このあたりはほかにも自由にセッションを経由できるように「sess_」とかの接頭辞で自由に書き込めるようにしてもいいのかもしれない。
例えば、「sess_hoge=fuga」とすれば{$hoge}にfugaが入るとか。
と脱線したので元に戻す。

で、実装してみた

<form method="get">
<input type="hidden" name="cmd" value="mailform_confirm">
<input type="text" name="mailform_subject" value="{$mailform_subject}">
<textarea name="mailform_body" cols="60" rows="6">{$mailform_body}</textarea>
<input type="submit" value="内容を確認">
</form>

{if $mailform_confirm}
件名:{$mailform_subject}
内容:{$mailform_body}
<form>
<input type="hidden" name="cmd" value="mailform_send">
<input type="submit" value="この内容で送信">
</form>
{/if}

{if $mailform_send}
<p>メール送信完了</p>
{/if}

大雑把にこんな感じ
設定にsendmailパスのsendmailとメール送信先のmail_toを追加した。
mail_toは改行で複数に送れなくもないけど、管理一人だから関係ないか。
メールはとりあえずlocalhostのsendmailをたたくのみで実装。
SMTPでもいいけど、sendmailが(使え)ない環境ではこのfragmentもモジュールの都合でまともに動かないであろうから。

メールのコードはJIS
件名も一応mime_encodeしてある
鯖のメアドも、プロバイダのメアドも正常に動いているっぽい。
ただ、fromもtoと同じ情報なので、プロバイダメアドにすると偽装状態だが・・・