|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
メールを送信する関数をライブラリにしておきます。
メールを送る処理というのはこれからも何度もでてくる可能性がありますから、 使いやすい形で関数、ライブラリにしておこうと思います。
関数の引数は、差出人名、差出人メールアドレス、 送信先名、送信先メールアドレス、件名、本文の7つです。 いずれも、省略可とします。
本文の後ろに、 送信した時刻や、 アクセス解析のところで研究した、訪問者のホスト名などを 自動的に追加するようにします。 これは、イタズラなどが連続して起きたようなときに、 特定のホスト名の訪問者の送信を禁止するなどの処理ができるかな、 と思うからです。
#!/usr/bin/perl
require 'getformdata.pl';
require 'sendmail.pl';
%form = plab::getformdata();
print "Content-type: text/html\n";
print "\n";
if (plab::sendmail(
$form{'name'},
$form{'from'},
"PerlLabo",
'admin@perl-labo.org',
$form{'subject'},
$form{'message'}))
{
print "メールを送信しました。ありがとうございました";
}
else
{
print "メールの送信に失敗しました。";
}
package plab;
# sendmailのパス
$sendmailpath = '/usr/sbin/sendmail';
# (差出人名, 差出人メールアドレス, 送信先名, 送信先メールアドレス, 件名, 本文)
# いずれも省略可
sub sendmail
{
local($ip, $host, @tim, $year, $mon, $t);
local ($from_name, $from_adr, $to_name, $to_adr, $subject, $body) = @_;
# Fromメールアドレスがからっぽだとエラーになるので
# もしからっぽなら仮に送信先アドレスを入れます
if ($from_adr eq "") {
$from_adr = $to_adr;
}
if (! open(MAIL, "| $sendmailpath -t")) {
return 0;
}
# 汚染チェック
$from_name =~ s/\r|\n//g;
$from_adr =~ s/\r|\n//g;
$to_name =~ s/\r|\n//g;
$to_adr =~ s/\r|\n//g;
$subject =~ s/\r|\n//g;
print MAIL "From: $from_name<$from_adr>\n";
print MAIL "To: $to_name<$to_adr>\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
print MAIL "\n";
print MAIL "$body\n";
$ip = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack("C4", split('\.', $ip)), 2) || $ip;
@tim = localtime(time());
$year = $tim[5] + 1900;
$mon = $tim[4] + 1;
$t = sprintf('%02d:%02d:%02d', $tim[2], $tim[1], $tim[0]);
print MAIL "\n";
print MAIL "----------------------------\n";
print MAIL "DateTime : $year/$mon/$tim[3] $t\n";
print MAIL "Host : $host\n";
close MAIL;
return 1;
}
1;
適当にメッセージを入れて送信しちゃってください (^^ 送信先は当サイト管理人ですので、なにかメッセージなど頂けると嬉しいです。
無事動きました。 これでメール送信はバッチリですね!
($from_name, $from_adr, $to_name, $to_adr, $subject, $body) = @_; というところがあります。 これは、配列からスカラー変数へのコピーになります。 配列の1つ目のデータが左の1つ目の変数に、というように順番にコピーされます。 スカラー変数というのは、今まで単に「変数」って言い続けてたやつですが、 配列や連想配列ではない変数ということを強調した言い方です。
それに、local の宣言の中で配列からのコピーを行っています。 local 宣言をするときには、このように値の代入を同時に行うことができます。
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |