Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

メール送信ライブラリ作成

研究内容

メールを送信する関数をライブラリにしておきます。

詳細

メールを送る処理というのはこれからも何度もでてくる可能性がありますから、 使いやすい形で関数、ライブラリにしておこうと思います。

結果

引数は

関数の引数は、差出人名、差出人メールアドレス、 送信先名、送信先メールアドレス、件名、本文の6つです。 いずれも、省略可とします。

その他にもいくつかの情報を送信しましょう

本文の後ろに、 送信した時刻や、 アクセス解析のところで研究した、訪問者のホスト名などを 自動的に追加するようにします。 これは、イタズラなどが連続して起きたようなときに、 特定のホスト名の訪問者の送信を禁止するなどの処理ができるかな、 と思うからです。

作成したCGIプログラム

sendmail.cgi
#!/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",
	'info@perl-labo.org',
	$form{'subject'},
	$form{'message'}))
{
	print "メールを送信しました。ありがとうございました";
}
else
{
	print "メールの送信に失敗しました。";
}
sendmail.pl
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 の宣言の中で配列からのコピーを行っています。 local 宣言をするときには、このように値の代入を同時に行うことができます。

分かったこと

  1. ($a, $b, ...) = @array; という形で配列内のデータを変数にコピーできます。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。