標準でPOSTMAILが提供されている
コントロールパネルで操作をすればメールフォームを簡単にインストールできます。
しかし、せっかくなのでRubyで作ることにしました。
フォームを作る
まず、HTMLでフォームを作ります。
mailform.html
<html>
<head>
<title>お問い合わせ</title>
</head>
<body>
<form method="post" action="mailform.cgi">
<div>お名前</div>
<div><input type="text" name="name" /></div>
<div>メールアドレス</div>
<div><input type="text" name="from" /></div>
<div>件名</div>
<div><input type="text" name="subject" /></div>
<div>内容</div>
<div><textarea name="body"></textarea></div>
<div><input type="submit" name="submit" value="送信" /></div>
</form>
</body>
</html>
フォームの内容を受け取り、メールを送信するCGIを作る
フォーム送信されたフォームの内容を受け取り、メール送信するCGIを作ります。
mailform.cgi
# !/usr/local/bin/ruby
require "cgi"
require 'net/smtp'
require "nkf"
cgi = CGI.new
if ENV['HTTP_REFERER'] == "[メールフォームのURL]" then
mFrom = cgi["from"].gsub(/(\r\n|\r|\n)/, '')
mSubject = cgi["subject"].gsub(/(\r\n|\r|\n)/, '')
mName = cgi["name"]
mBody = cgi["body"]
subject = "[問合せ] " + mSubject
subject = NKF.nkf("-JM", NKF.nkf("-jW", subject))
body = <<EOF
[#{mName}]
# {mBody}
# {ENV['HTTP_REFERER']}
EOF
body = <<EOF
From: #{mFrom}
To: [送り先のメールアドレス]
Subject: #{subject}
Date: #{Time::now.strftime("%a, %d %b %Y %X %z")}
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
# {NKF.nkf("-Wjm0", body)}
EOF
Net::SMTP.start('[メールサーバーのアドレス]', 25) {|smtp|
smtp.send_mail(
body,
mFrom,
'[送り先のメールアドレス]'
)
}
end
print <<EOF
Location: [送信後に戻るURL]
EOF
追記
メールヘッダーインジェクション対策として、fromとsubjectの文字列から改行文字を削除するコードを追加しました。
また、メールフォームのURLをチェックするコードを追加し、本文にも送信元URLを表示するよう変更しました。
追記(2020/09/07)
文字化けするのを修正しました。
アップロードする
上記のファイルをアップロードする。
アップロード後、mailform.cgiのパーミッションを「755」に設定する。
テストする
メールフォームに必要事項を入力して送信してみる。
うまくメールを送信できれば完成。
...できなかったら、コントロールパネルにあるアクセスログの設定から、エラーログを表示させ、エラー内容を確認して対応する。