Perl/ActivePerl For UNIX/Linux/Windows
 
TryThe Homepage
初めてのCGI
CGI 研究室
ダイナミックCGI
ダウンロード
サービス
サーバ構築(Windows)
データベースアクセス
有料サービス
FAQ
お問い合わせ
このページを印刷
Webからのメール送信機能
このコーナーでは、メール送信ライブラリ「sendemail.pl」を使ってすべてのスクリプトでメール送信を可能にする学習をします。 今回は、UNIX及びLinuxのSendmailを使用しますので、Windowsサーバではご利用いただけません。
Windows用メール送信機能は、ホームサーバの構築で解説しています。
  1. メール送信ライブラリ
    あなたのプロバイダが「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;
    }

  2. 使い方
    • 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); }
      こうしておけば訪問者にエラーで送信できなかった事をお知らせで来ます。

  3. 使ってみる
    それでは実際にカスタム掲示板を使って、 掲示板に書き込まれた記事をすべて管理者のメールで受け取るスクリプトを考えてみましょう。

    初期設定部に「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には、 今回ご紹介したスクリプトの上位バージョンが標準で装備されています。
Copyright 2004 Terra. All rights reserved. No reproduction or republication without written