Webからのメール送信機能 |
- このコーナーでは、メール送信ライブラリ「sendemail.pl」を使ってすべてのスクリプトでメール送信を可能にする学習をします。
今回は、UNIX及びLinuxのSendmailを使用しますので、Windowsサーバではご利用いただけません。
Windows用メール送信機能は、ホームサーバの構築で解説しています。
- メール送信ライブラリ
あなたのプロバイダが「sendmail」を開放している場合は、このライブラリ(
sendemail.pl )をダウンロードし、
拡張子を.plに変更して パーミッションを「755」に設定します。
sub send_email {
local($subject, $from, $to, $cc, $bcc, $body) = @_;
local(@TO) = split(/\,/, $to);
local(@CC) = split(/\,/, $cc);
local(@BCC) = split(/\,/,$bcc);
local($attach_file) = '';
local($mailto) = '';
local($i);
$i = 1;
#不正なメタコマンドや、スペースを排除してアドレスだけを取得
foreach $ml (@TO, @CC, @BCC) {
if ($ml =~ /([#-9A-~\-\_]+\@[#-9A-~\-\_\.]+)/) {
if ($i == 1) { $mailto = "$1"; }
else { $mailto .= "\,$1"; }
}
$i++;
}
#正式な送信アドレスが無い場合はエラーを返す
if (!$mailto) { return(1); }
#sendmailユーティリティをオープンする(失敗したらエラーを返す)
if (!open(MAIL,"| $sendmail -t $mailto")) { return(1); }
#実際にメールを送信する
if (!$bcc) { print MAIL "To: $to\n"; }
print MAIL "From: $from\n";
print MAIL "CC: $cc\n" if $cc;
print MAIL "Subject: $subject\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/plain;\n\n";
print MAIL $body;
print MAIL "\n";
#オプションのテキストファイル添付
if ($attach_file) {
if (-e $attach_file) {
if (!(open(TEXT, $attach_file))) { return(1); }
print MAIL "Attachment:\t$filename\n";
print MAIL "Encoding:\tNone\n\n";
while (<TEXT>) { s/^\.([\n\r\f]+)/..$1/; print MAIL }
close(TEXT);
print MAIL "\n\n";
}
}
close(MAIL);
0;
}
|
|
- 使い方
- send_email()関数を使用する場合は、使用するスクリプトの初期設定部に「sendemail.pl」を読み込み、
sendmailユーティリティのパスを指定する必要が有ります。
require './sendemail.pl';
$sendmail = '/usr/lib/sendmail';
|
|
sendmailのパスは、必ず$sendmailというグローバル変数に格納しなければなりません。
sendmailを開放していないプロバイダでも、UNIXの「mail」コマンドや、
「xmail」コマンドが使用できる場合も有りますので、
$sendmail = 'mail';
$sendmail = 'xmail';
などと指定してテストしてみてもいいですね。
- send_email()関数は、6つのパラメータを付けて呼び出す必要が有ります。
$subject | メールの件名 |
$from | 差し出し人メールアドレス |
$to | 送信先メールアドレス |
$cc | カーボンコピーのメールアドレスリスト |
$bcc | ブラインドカーボンコピーのメールアドレスリスト |
$body | 本文 |
【基本型】
&send_email(題名,送信者,受信者,CC,BCC,本文);
&send_email(ありがとう,from@inforyoma.com,mailto@mailbox.jp,'','','ご登録ありがとうございました。');
CC、BCCのメールアドレスのリストは、「,」で区切っていくつでも指定できます。
転送が必要ない場合は、''(ヌル)を指定して下さい。
$subject = 'ありがとう';
$from = 'terra@ps.inforyoma.or.jp';
$to = 'abc@mailbox.or.jp';
$cc = 'xyz@mailbox.jp,def@mailbox.jp,ghi@mailbox.jp';
$bcc = '';
$body = "=====================================\n";
$body .= "ゲストブックにご登録ありがとうございました。\n";
$body .= "またのお越しを心よりお待ちしております。";
$body .= "=====================================\n";
&send_email($subject,$from,$to,$cc,$bcc,$body);
|
|
- send_email()関数は、メールの送信に成功した場合は「0」を、失敗すると「0」以外を返します。
この機能を使ってエラーを検出できます。
if (&send_email($subject,$from,$to,$cc,$bcc,$body)) { &error(send_email); }
|
|
こうしておけば訪問者にエラーで送信できなかった事をお知らせで来ます。
- 使ってみる
それでは実際にカスタム掲示板を使って、
掲示板に書き込まれた記事をすべて管理者のメールで受け取るスクリプトを考えてみましょう。
初期設定部に「sendemail.pl」を読み込み、sendmailユーティリティのパスを指定する。
#日本語コード変換モジュール
require './jcode.pl';
#このコードの下にsendemail.plをインクルードし、sendmailのパスを指定します。
require './sendemail.pl';
$sendmail = '/usr/lib/sendmail';
#管理者のメールアドレスを設定します。
$masteremail = 'xxx@mailbox.or.jp';
|
|
記事書き込みルーチンにメール送信を追加する。
sub regist {
&cookie_regist;
if ($FORM{'comment'} ne '') {
if ($FORM{'name'} eq '') { &error(bad_name); }
if ($email_check eq 'yes' && $FORM{'email'} eq '') { &error(bad_email); }
$count = @DATA;
if ($count >= $max) { pop(@DATA); }
if ($count < 1) {
$new_code = 1;
} else {
($date,$code,$re,$name,$email,$HP,
$subject,$comment,$host,$agent) = split(/\,/,$DATA[0]);
$new_code = $code + 1;
}
$value = "$date_now\,$new_code\,$FORM{'res'}";
$value .= "\,$FORM{'name'}\,$FORM{'email'}";
$value .= "\,$FORM{'HP'}\,$FORM{'subject'}\,$FORM{'comment'}";
$value .= "\,$hostaddr\,$softagent\n";
unshift(@DATA,$value);
if (!open(NOTE,">$datafile")) { &error(bad_file); }
print NOTE @DATA;
close(NOTE);
#ここからが追加されたメール送信ルーチンです。
#管理者自身の投稿は送信しない
if ($masteremail ne $FORM{'email'}) {
#訪問者が記入した題名をメールの件名にする(未記入なら「無題」にする)
$subject = $FORM{'subject'};
if (!$subject) { $subject = '無題'; }
#訪問者のアドレスをチェックして有効なら差し出し人アドレス$fromにセットする
if ($FORM{'email'} =~ /([#-9A-~\-\_]+\@[#-9A-~\-\_\.]+)/) {
$from = $1;
}
if (!$from) { $from = 'nomail@xxxxxxxx.xx.xx'; }
#本文を作成する
$body = "== CustomBBS ========================\n";
$body .= "$FORM{'name'}さん\n";
$body .= "$FORM{'comment'}\n";
$body .= "======================================\n";
#メール送信用に文字コードを「jis」に変換する
&jcode'convert(*subject,'jis');
&jcode'convert(*body,'jis');
#send_email()関数を呼び出し、メールを送信する
}
#これで完成です。
}
}
|
|
このように、sendemail.plライブラリを使えば、簡単にスクリプトにメール送信機能を付けられます。
当サイトが公開している関数ライブラリ「perl-lib.pl」をご使用の場合は、併用できません。perl-lib.plには、
今回ご紹介したスクリプトの上位バージョンが標準で装備されています。
|
|