▽ UTF-8ブラウザ別対応状況 ※このホームページはUTF-8で記述されています。

perlによるUTF-8メールの送信方法



ホームページ素材・音楽効果音素材・映像素材【DDN ONLINE SHOP】

前のページでは、PHPを使ってのメール送信方法について解説しました。ここでは、さらに利用者の多いperl(CGI)で、どのようにUTF-8のメールをWEBアプリで送信可能かを解説します。

基本的にはPHPでの送信方法の2番目の手法と似た方法で可能です。sendmailにパイプ渡しでメールを送信します。

#!/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";


以上のような方法で、perlを用いたCGIプログラミングでも、UTF-8のメールを送信することが可能になります。



【広告】 マジックリスニングで英語耳    【広告】 .htaccess実践活用術    【広告】 携帯サイト コーディング&デザイン

【広告】 どっかーんとダイエットコーヒー    【広告】 TOEICリスニングクラブ    【広告】 PHPが利用可能なレンタルサーバ