#!/usr/bin/perl
#***********************************************************************
# このプログラムはUTF-8(改行コードはLF)で作成されているものという前提で書かれています。
# 当然ながら、perlのパスは各自の環境に合うように書き換えてください。
# PHPに慣れている私はPHPのmail関数のような自作関数send_emailを定義し
# て使っています。
# 本文中に「\」と表示されている場合、円マーク(\)と同値です。読み替えてください。
#
# ユーザーに入力させたメールアドレスにメールを送信する場合には、必ず
# 汚染チェックを行ってください。下記プログラムでは引数のチェックは省
# 略しています。その他、当プログラムの利用により生じたいかなる結果に
# 対しても責任を負いかねます。予めご了承ください。
#***********************************************************************
use MIME::Base64; # インストールされていることが前提
sub send_email{
local($email,$subject,$msg,$headers);
$email = $_[0];
$subject = $_[1];
$msg = $_[2];
$headers = $_[3];
# sendmailのパスは各自の環境に合わせて。メールアドレスの前に「\」が必要なのも、
# PHPに慣れてしまうと、すっかり忘れてしまいがちですので注意です。
$sendmail = "/usr/sbin/sendmail -tf info\@example.com";
# こちらにあるMIME::Base64モジュールの翻訳にもありますように、encode_base64関数は、
# PHPのbase64_encode関数と異なり(関数の名称が微妙に異なるので混乱しやすいです。)、
# 引数を二つ取ります。encode_base64関数は76文字を超えないように分割され、その分割
# の際に使われる区切り文字を指定する。二つ目の引数はを省略すると、「\n」が
# デフォルトで使われます。敢えて、分割してほしくない場合は、二つ目の引数として、
# 空白の文字列を指定しなければなりません。
$eol = "";
$subject_b = encode_base64($subject,$eol);
# RFC 2047によると、ヘッダー文字列は一行76文字以内とありますが、この76文字がどこから
# どこを指すのかはっきり分かりません。各種メールソフトで「長い件名」での送信テストを
# 行ってみましたが、何文字で区切っているかは千差万別でした。例えば、Becky!では、
# ISO-2022-JPの場合は「=?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNRso
# Qg==?=」のように1行が最大58バイトになっているようでした。UTF-8の場合は
# 「=?UTF-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV?=」のように56バイトに
# なっていました。
# 当然、変なところで区切ると文字化けの原因になりますし、perlは不慣れで
# よく分からないので、難しいことは避けます。RFC違反になりますが、とりあえず長い
# サブジェクトのまま、無理やりbase64エンコードしてみます。
$subject_b = "=?utf-8?B?" . $subject_b . "?=";
open (SENDMAIL, "| $sendmail");
print SENDMAIL $headers;
print SENDMAIL "To: $email\n";
print SENDMAIL "Subject: $subject_b\n\n"; # ヘッダー部分終了のため、改行を「\n\n」と重ねます。
print SENDMAIL encode_base64($msg); # 本文もbase64エンコードしておく
close(SENDMAIL);
}
$email = "hogehoge\@example.com";
$subject = "【テストtest】ご注文ありがとう。アイウエオ안녕하세요. これはテストです。こんなに長いサブジェクトはどうでしょう?";
$msg = "안녕하세요①ⅱ㈱℡髙塚彅﨑德アイウエオあいうえおUTf-8でのメール送信テストです。This is a test.";
# ヘッダー行をまとめて引数で。最後は改行コード(「\n」)で終わるように、引数を渡します。
$headers = "From:info\@broaband-xp.com\nMIME-Version: 1.0\nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64\n";
send_email($email,$subject,$msg,$headers); # 上で定義したsend_email関数
print "Content-type: text/html\n\n"; # perlのお決まりの「Content-type」ヘッダー
print "success";
|