|
CGIからメールを送信する方法について解説しますが、CGIを設置するサーバがsendmailまたはsendmailコマンドと互換性を持つSMTPメール送信サービスを提供していない場合は、この方法ではメールを送信する事が出来ませんのでご注意下さい。
|
|
|
以下のスクリプト例は掲示板に投稿があった場合、その内容を管理者にメールで知らせるというものです。
$nameには投稿者の名前、$mailには投稿者のメールアドレス、$cmntには投稿内容が格納されているものとします。
$toには管理者(送信先)のメールアドレスを設定します。
|
|
require './jcode.pl';
sub sendmail {
$sendmail = '/usr/lib/sendmail';
$to = 'mail@addr.ne.jp';
$subject = '掲示板に投稿がありました。';
$mailbody =<<"EOD";
[名前] $name
[Eメール] $mail
[コメント] $cmnt
EOD
if (open(MAIL, "| $sendmail -t")) {
# メールヘッダの出力
if ($mail =~ /^.+\@.+\..+$/) { print MAIL "From: $mail\n"; }
print MAIL "To: $to\n";
&jcode'convert(*subject, 'jis');
print MAIL "Subject: $subject\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "\n";
# 本文の出力
$mailbody =~ s/\r\n/\n/g;
$mailbody =~ s/\r/\n/g;
&jcode'convert(*mailbody, 'jis');
print MAIL $mailbody;
close(MAIL);
}
}
|
|
■sendmailのオープン
sendmailでメールを送信するにはsendmailにパイプを使用してデータを渡します。
パイプを使用するにはオープンする際に「|」を指定します。
これ以降はファイルハンドルに出力したデータがsendmailに渡される事になります。
|
|
□sendmailオプション
-t TO: CC: BCC:を読み取りBCC:フィールドは転送前に削除する。
-i ピリオドだけの行を入力しても以降の文章をカットしない。
|
|
|
sendmailはメール本文の終わりをピリオドで判別する為、ピリオドだけの行があった場合は以降の文章がカットされます。
これを防ぐ為に「-i」オプションが用意されています。
|
|
□Fromヘッダ
メールの送信元です。
投稿者が入力したメールアドレスが正しいと思われる場合は、このメールアドレスをFromヘッダとして出力します。
こうする事により、メールを受け取った場合、返信ボタンを押すだけでこの投稿者にメールを送信出来るようになります。
メールアドレスが入力されていなかったり不正な入力と思われる場合は、このヘッダは出力しないようにしています。
この場合、メールの送信元にはCGIが実行されたサーバのメールアドレスが入る事になっています。
|
|
□Subjectヘッダ
メールの件名です。
2バイト文字も使えますが、サーバの環境や受信するメーラによっては文字化けするようです。
件名に2バイト文字を使用する際はJISコードに変換します。
しかし、JISコードへの変換だけでは文字化けが解消しない場合があります。
この場合はBase64エンコードを行う必要があります。
Base64エンコードについては各自調べて勉強して下さい。
|
|
□Content-typeヘッダ
「text/plain」と指定していますので、このメールはテキスト形式で送信される事になります。
「charset=ISO-2022-JP」とは、本文中の2バイト文字をJISコードで送信するという宣言です。
メールでの2バイト文字はJISコードで送信する決まりになっています。
|
|
□Content-Transfer-Encodingヘッダ
先程のcharsetで指定した文字コードの属性を指定するヘッダです。
「7bit」と指定していますので、7bitのJIS(JIS7)コードを使用する事になります。
こちらもメールで2バイト文字を送信する際の決まりになっています。
|
|
□空行
メールヘッダの最後に空行(\n)の出力を行っていますが、この空行がメールヘッダの終わりを意味します。
これ以降が本文となりますので忘れずに出力するようにして下さい。
|
|
■本文の出力
メールヘッダの出力が終わりましたので本文の出力を行います。
本文を出力する前に$mailbodyの改行を\nに置換しています。
普通、Windowsでの改行は\r\n、Macでの改行は\rですから、これらを全て\nに置換します。
置換が終了したら$mailbodyの2バイト文字をJISコードに変換して本文を出力します。
|
|
□更新履歴
2007.04.28 全体的に内容を見直し
|
|
|