#!/usr/bin/env ruby27
# -*- coding: utf-8 -*-
require 'cgi'

myname	= File.basename($0)
appform	= "appform.html"
sender	= "jd@e.koeki-u.ac.jp"
sender	= "yuuji-jd-reqform@e.koeki-u.ac.jp"
from	= "公益ジュニアドクターセンター <#{sender}>"
reqform	= "yuuji-jd-reqform@e.koeki-u.ac.jp"

header = <<_EOS_
<!DOCTYPE html>
<head><title>Junior Doctor Chokai Academy Application Form</title>
<link rel="stylesheet" type="text/css" href="../jdmain.css">
</head>
<body><main>
_EOS_
footer = "</main>" + IO.readlines("../footer.html").join + "</body>\n</html>"

emailform = <<_EOS_
<form action="#{myname}" method="POST">
Email: <input name="email" size="50">
<input type="submit" value="送信">
<input type="reset" value="reset">
</form>
_EOS_

getapp = <<_EOS_
<h1>申し込みフォームURL送付</h1>
<p>以下の枠内にemailアドレスを入れてください。
そこに申し込みフォームの専用URLを送信します。
Emailの到着性確認を兼ねています。携帯電話会社のアドレスではなく
主にPCで利用しているアドレスなどがあればそれを入れてください
(※審査に合格し受講した場合は期間中だけでなく卒業後も連絡に使いますので確実に連絡が取れ、かつ永く使えるアドレスを入れてください)。</p>
#{emailform}
<p>申し込みフォーム取り寄せだけでは申請は始まりませんのでお気軽にアクセスしてください。</p>
_EOS_
getapp2 = open("note.html"){|n| n.read}

sent = <<_EOF_
<h1>送信しました</h1>
<p>%s 宛にジュニアドクター鳥海塾申請書URLを送信しました。</p>
<p>数分待っても届かない場合は以下を確認してください。</p>
<ul>
 <li>上記の宛先はあっていますか。</li>
 <li>あっている場合は迷惑フィルタを全てOFFにして再度試してください。</li>
 <li>それでも届かない場合はアドレスを変えて試してください。</li>
</ul>
<p><a href="./#{myname}">もどる</a></p>
_EOF_

nodom = <<_EOF_
<h1>emailアドレスエラー</h1>
<p>%s は存在しないドメインのようです。
別のアドレスを試してみてください。</p>
#{emailform}
_EOF_

c = CGI.new(:accept_charset => "UTF-8")
print "Content-type: text/html; charset=UTF-8\n\n"
print header


email = c["email"]
if Time.now > Time.mktime(2022,5,13,17,0)
  print "<p>今年度の募集は締め切りました。</p>"
  print "<p>次年度の募集までお待ちください。ありがとうございました。</p>"
elsif email > "" then
  # https://rubyreferences.github.io/rubyref/stdlib/networking-web/resolv.html
  require 'resolv'
  dom = email.sub(/.*@/, '')
  rs = Resolv::DNS.open do |dns|
    dns.getresources(dom, Resolv::DNS::Resource::IN::MX)
  end
  if rs.empty? then
    printf(nodom, email)
  else
    require 'digest'
    mid = Digest::SHA256.hexdigest(email)[0, 10]
    url = sprintf("%s://%s%s?email=%s+mid=%s",
                  ENV["HTTP_SCHEME"]||"https",  ENV["HTTP_HOST"]||"localhost",
                  (ENV["REQUEST_URI"]||".").sub(myname, appform),
                  CGI.escape(email), CGI.escape(mid))
    # Construct message
    require 'nkf'
    sj = NKF.nkf('-jM', "JD鳥海塾応募フォームURL").strip
    fr = NKF.nkf('-jM', from).strip
    body = NKF.nkf('-j', <<~_EOS_)
	ジュニアドクター鳥海塾受講応募フォームURLは以下のとおりです。
	心当たりのない場合は無視するか、
        続く場合は #{sender} 宛に問い合わせてください。

	  #{url}

	上記URLよりジュニアドクター鳥海塾申請書にお進みください。
        この申請書URLは受信された方専用のものです。
	他の方に転送しないでください。
        このURLが他人に使われるとご自身の申込みが無効となります。
	_EOS_
    printf(sent, email)
    #	Date: #{Time.now.strftime("%a, %d %b %Y %T %z")}
    open("| sendmail -f #{sender} #{email}", "w") do |m|
      m.puts(<<~EOS)
	To: #{email}
	From: #{fr}
	Subject: #{sj}
	Mime-Version: 1.0
	Content-Transfer-Encoding: 7bit
	Content-Type: Text/Plain; charset=iso-2022-jp

	#{body.force_encoding('binary')}
	EOS
    end
    open("| sendmail -f #{sender} #{reqform}", "w") do |m|
      addr = ENV['REMOTE_ADDR']
      m.puts(<<~EOS)
	To: #{reqform}
	Subject: JDform Request
	Mime-Version: 1.0
	Content-Transfer-Encoding: 7bit
	Content-Type: Text/Plain; charset=iso-2022-jp

	EOS
      m.write(NKF.nkf('-j',
                      "JDフォーム要求: #{addr}\n" \
                      + `host #{addr}` \
                      + email))
    end
  end
else
  print getapp
  print getapp2
end
print footer
