perlでメール送信CGI作成(UTF-8)

perlなんて右も左もわからない人間がいきなりメール送信フォームを作成してみるテスト

フォームと、送信後のページは別途HTMLで用意

formで入力される値はnameとemailとmsg。
Postでsubmitされてくる。

ファイルのエンコードUTF-8

#!/usr/local/bin/perl

use Jcode;
use CGI;
use utf8;
use Encode;

$SENDMAIL  = '/usr/lib/sendmail';
$TO        = 'info@d.hatena.ne.jp';
$TONAME    = 'info';

if($ENV{'REQUEST_METHOD'} eq 'POST') {
  $ERROR = sendMail();
  if($ERROR) {
    print "Location: ../error.html\n\n";
  } else {
    print "Location: ../ok.html\n\n";
  }
} else {
  print "Location: ../index.html\n\n";
}
exit;

sub sendMail {
  my $q = CGI->new;

  my $toname = $TONAME;
  my $to = $TO;
  my $name = $q->param('name');
  my $email = $q->param('email');
  my $subject = "お問い合わせ";
  my $msg = $q->param('question');

  if(!$name or !$email or !$subject or !$msg) {
    return("Location: /error.html\n\n");
  } else {
    $name = decode('utf-8', $name);
    $toname = decode('utf-8', $toname);
    $msg = decode('utf-8', $msg);

    $msg = encode('jis', "\nお名前:".$name)
      .encode('jis', "\nE-Mail:".$email)
      .encode('jis', "\nご質問内容\n".$msg);

    $toname = encode('MIME-Header-ISO_2022_JP', $toname);

    $name = encode('MIME-Header-ISO_2022_JP', $name);

    $subject = encode('MIME-Header-ISO_2022_JP', $subject);

    open(SENDMAIL, "| $SENDMAIL -t") or return("error");
    print SENDMAIL "To: $toname <$to>\n";
    print SENDMAIL "From: $name <$email>\n";
    print SENDMAIL "Subject: $subject\n";
    print SENDMAIL "Mime-Version: 1.0\n";
    print SENDMAIL "Content-Type: text/plain; charset=ISO-2022-JP\n\n";
    print SENDMAIL $msg;
    close SENDMAIL;
  }
  return;
}

メールフォームとかCGIとか数十年前とかに流行ったんでWEBでも内容が古いのが多くて。
エンコードの部分は迷った。
クエリの取得もCGIとか使うらしい。
とりあえずうちの環境では文字化けしてないのでコレでよしとしておこう。
もっとスマートな書き方とかあるんだよな。多分。
しかもuse Jcode;って定義したけど使ってないよな。きっと。