E-Mail の生成と送信
 
アンケートをとったりするとき、内容をデータベースに保存すると同時に E-Mail で受け取りたい場合があります。E-Mail を生成することはすなわちメーラーをつくることになります。Internet のメールの世界は、もちろん規約の上に成り立っていますが、例えば日本語コードの扱い(文字化け)の問題など、メーラーを作っているベンダーごとに規約の解釈がまちまちの部分があり、完全なメーラーをつくることにはかなりの労力を必要とします。ここでは必要最低限の E-Mail を生成し送信することを目標とします。この CGI を使う場合は多数の人に送信することは避け、受信者を限定しメーラーで正しく受信でき正しく読めることを十分テストしてください。

最初の例は Mail::Send モジュールを利用した例です。Mail::Send は MailTools パッケージに含まれています。MailTools は CPAN にあります。
http://www.perl.com/CPAN/modules/by-module/Mail/MailTools-1.12.tar.gz


[サンプルプログラムの実行]
 
mail.cgi
#!/usr/bin/perl
#
#       mail.cgi
#
# (C)1999 Kaoru Fujita
#
# *** おそらく UNIX でしか動作しません。***
#
use lib './lib';

require 'jcode.pl';
require 'util.pl';

use Mail::Send;

#
# 定数
#
$Title = 'メール送信・サンプル・プログラム';
# CGI の仮想パス
$CGIPath = '/cgi-bin';
# プログラム名
use File::Basename;
$Program = basename($0);
# 日本語コード
$Encoding = 'euc';
$CharSet = 'EUC';


#
# メインプログラム
#
*data = parseInput('jis');      # E-Mail のメッセージボディはJIS

# テスト用
#$data{'Server'} = 'server.domain.name';
#$data{'From'} = 'from@email.address';
#$data{'To'} = 'to@email.address';
#$data{'Cc'} = 'cc@email.address';
#$data{'Subject'} = 'Just a test';
#$data{'Message'} = "This is a test mai.\nPls ignore this.";


sendMail();

thankYou();

exit(0);


#
#
#
sub sendMail
{
        my($mail) = Mail::Send->new();

        # メールヘッダを作成する。
        $mail->to($data{'To'});
        $mail->cc($data{'Cc'});
        $mail->bcc($data{'Bcc'});
        $mail->subject($data{'Subject'});

        # メーラー(mailx/Mail/mail)を準備する
        $mailer = $mail->open();

        # メッセージを送信する。
        print $mailer $data{'Message'};

        # メーラーをクローズする。
        $mailer->close();
}


#
#
#
sub thankYou
{
        select(STDOUT);

        print <<END_OF_THANK_YOU;
Content-Type:text/html

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$CharSet">
<TITLE>メールを送信しました。</TITLE>
</HEAD>
<BODY BGCOLOR=\"#ffffff\">
<CENTER><BR>
メールを送信しました。
</CENTER>
</BODY>
</HTML>
END_OF_THANK_YOU

        return;
}

#--End Of mail.cgi

 
mail.html
<HTML>
<HEAD>
<TITLE>メール送信</TITLE>
</HEAD>
<BODY>

<FORM action="/cgi-bin/mail.cgi">
<TABLE>
<TR>
<TD>To: </TD><TD><INPUT type="textfield" name="To" size="24"></TD>
</TR>
<TR>
<TD>Cc: </TD><TD><INPUT type="textfield" name="Cc" size="24"></TD>
</TR>
<TR>
<TD>Bcc: </TD><TD><INPUT type="textfield" name="Bcc" size="24"></TD>
</TR>
<TR>
<TD>Subj: </TD><TD><INPUT type="textfield" name="Subject" size="36"></TD>
</TR>
</TABLE>
<TEXTAREA name="Message" rows="10" cols="50">
</TEXTAREA>
<BR>
<INPUT type="submit" value="送信">
</FORM>

</BODY>
</HTML>

次の例は、SMTP(Simple Mail Transport Protocol) を使って、メールサーバに直接接続してメールを送信します。Net::SMTP を使います。

サンプルスクリプトの $Domain にドメイン名を設定してください。


[サンプルプログラムの実行]
 
mail2.cgi
#!/usr/bin/perl
#
#       mail2.cgi
#
# (C)1999 Kaoru Fujita
#
use lib './lib';

require 'jcode.pl';
require 'util.pl';

use Net::SMTP;

#
# 定数
#
$Title = 'メール送信・サンプル・プログラム(2)';
# CGI の仮想パス
$CGIPath = '/cgi-bin';
# プログラム名
use File::Basename;
$Program = basename($0);
# 漢字コード
$Encoding = 'euc';
$CharSet = 'EUC';
# ドメイン名
$Domain = 'smtp.domain.name';


#
# メインプログラム
#
*data = parseInput('jis');      # E-Mail のメッセージボディはJIS

# テスト用
#$data{'Server'} = 'server.domain.name';
#$data{'From'} = 'from@email.address';
#$data{'To'} = 'to@email.address';
#$data{'Cc'} = 'cc@email.address';
#$data{'Subject'} = 'Just a test';
#$data{'Message'} = "This is a test mai.\nPls ignore this.";

sendMail();

thankYou();

exit(0);


#
#
#
sub sendMail
{
        # サーバと接続する
        my($server) = new Net::SMTP($data{'Server'}, Hello => $Domain);

        unless ($server) {
                exitError(qq(メールサーバ[$data{'Server'}]に接続できません。));
        }

        foreach ($data{'Cc'}, $data{'Bcc'}) {
                next unless $_;
                $recipients = $recipients.',' if $recipients;
                $recipients = $recipients.$_;
        }
        # メッセージの送信
        $server->mail($data{'From'});
        $server->to($data{'To'});
        $server->recipient($recipients);
        $server->data();
        $server->datasend("Content-Type: text/plain; charset=iso-2022-jp\n");
        $server->datasend("To: $data{'To'}\n");
        $server->datasend("Cc: $data{'Cc'}\n");
        $server->datasend("Bcc: $data{'Bcc'}\n") if ($data{'Bcc'});
        $server->datasend("From: $data{'From'}\n");
        $server->datasend("Subject: $data{'Subject'}\n");
        $server->datasend("\n");        # ヘッダの終わり

        $server->datasend($data{'Message'});
        $server->dataend();

        # サーバとの接続をクローズ
        $server->quit();
}

#
#
#
sub thankYou
{
        select(STDOUT);

        local($message) = $data{'Message'};
        jcode'convert(*message, $Encoding);
        print <<END_OF_THANK_YOU;
Content-Type: text/html

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$CharSet">
<TITLE>メールを送信しました。</TITLE>
</HEAD>
<BODY BGCOLOR=\"#ffffff\">
<CENTER><BR>
メールを送信しました。
</CENTER>
<HR NOSHADE>
SMTP Server: $data{'Server'}<BR>
To: $data{'To'}<BR>
Cc: $data{'Cc'}<BR>
Bcc: $data{'Bcc'}<BR>
From: $data{'From'}<BR>
Subject: $data{'Subject'}<BR>
Message: <BR>
<PRE>
$message
</PRE>
<HR NOSHADE>
</BODY>
</HTML>
END_OF_THANK_YOU

        return;
}

#--End Of mail2.cgi

 
mail2.html
<HTML>
<HEAD>
<TITLE>メール送信(2)</TITLE>
</HEAD>
<BODY>

<FORM action="/cgi-bin/mail2.cgi">
<TABLE>
<TR>
<TD>メールサーバ: </TD><TD><INPUT type="textfield" name="Server" size="24">
<FONT COLOR="Red">(SMTP サーバを指定してください)</FONT></TD>
</TR>
<TR>
<TD>From: </TD><TD><INPUT type="textfield" name="From" size="24"></TD>
</TR>
<TR>
<TD>To: </TD><TD><INPUT type="textfield" name="To" size="24"></TD>
</TR>
<TR>
<TD>Cc: </TD><TD><INPUT type="textfield" name="Cc" size="24"></TD>
</TR>
<TR>
<TD>Bcc: </TD><TD><INPUT type="textfield" name="Bcc" size="24"></TD>
</TR>
<TR>
<TD>Subject: </TD><TD><INPUT type="textfield" name="Subject" size="36"></TD>
</TR>
</TABLE>
<TEXTAREA name="Message" rows="10" cols="50">
</TEXTAREA>
<BR>
<INPUT type="submit" value="送信">
</FORM>

</BODY>
</HTML>

ここでは具体例は示しませんが、POP(Post Office Protocol) を使って、POPサーバに接続してメールを受信することもできます。この場合は Net::POP3 を使います。



ファイル一覧

cgi-bin/mail.cgi
cgi-bin/mail2.cgi
cgi-bin/lib/util.pl

docs/Samples/mail.html
docs/Samples/mail2.html