LoginSignup
2
3

More than 3 years have passed since last update.

さくらのレンタルサーバーライトにメールフォームを設置する

Last updated at Posted at 2016-04-06

標準で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」に設定する。

テストする

メールフォームに必要事項を入力して送信してみる。
うまくメールを送信できれば完成。

...できなかったら、コントロールパネルにあるアクセスログの設定から、エラーログを表示させ、エラー内容を確認して対応する。

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3