テキストメールを送信する方法

CGIテクニック集トップへ





概要

メールをsendmailコマンドで送信します。CGIのフォームメールなどの送信部分になります。通常のテキストを送信できます。Net::SMTPを使ってメールを送信する方法も参照ください。

必用な処理

  1. PerlのPackage, Jcodeを読み込む
  2. 宛先などの必要な設定をする
  3. メール内容を設定する
  4. メールヘッダを設定する
  5. メールを送信する
  6. 送信終了メッセージを表示する

サンプルコード

 use Jcode;
 
 my $to_mail = 'tomail@dummy.com';
 my $from_mail = 'frommail@dummy.com';
 my $subject = 'テキストメール';
 my $mail_cmd = 'sendmail -t';
 
 my $contents = '
 テキストのメールです。
 この内容がメール本文に含まれます。
 通常はフォームメールの送信フォームなどから引き渡されます。
 ';
 
 $contents = jcode($contents)->jis;
 
 my $header;
 $header = "From: " . jcode("$from_mail")->mime_encode . "\n";
 $header .= "To: " . jcode("$to_mail")->mime_encode . "\n";
 $header .= "Subject: " . jcode($subject)->mime_encode . "\n";
 $header .= "MIME-Version: 1.0\n";
 $header .= "Content-type: text/plain; charset=ISO-2022-JP\n";
 $header .= "Content-Transfer-Encoding: 7bit\n\n";
 
 if (open(SMAIL, "| $mail_cmd")){
        print SMAIL $header;
        print SMAIL $contents;
        close(SMAIL);
 } else {
        &error("メールコマンドが実行できません。<br>$mail_cmdが正しいか確認してください。");
 }
 
 prnit "Content-Type: text/html\n\n";
 print "送信しました。";

コードの解説

 use Jcode;

必要なPerlのPackageをロードします。

 my $to_mail = 'tomail@dummy.com';
 my $from_mail = 'frommail@dummy.com';
 my $subject = 'テキストメール';
 my $mail_cmd = 'sendmail -t';

送り先メールアドレス、送り主メールアドレス、メールのタイトル、メールコマンドを変数に入力します。通常CGIの場合はメールアドレスやタイトルの値は送信フォームから引き渡されます。この例では簡便の為に直接変数を設定しています。 sendmailはヘッダを本文に埋め込む方式の為に-tのオプションが必要になります。

 my $contents = '
 テキストのメールです。
 この内容がメール本文に含まれます。
 通常はフォームメールの送信フォームなどから引き渡されます。
 ';

メールの内容を変数に入力しています。この内容もCGIの場合は送信フォームから引き渡されます。

 $contents = jcode($contents)->jis;

メール内容をJISにコード変換します。これは必ずしもJISでなくてもかまいません。Shift_JIS, EUC-JP, UTF-8などなんでもかまいませんが、ヘッダのコード指定と一致しないといけません。

 my $header;
 $header = "From: " . jcode("$from_mail")->mime_encode . "\n";
 $header .= "To: " . jcode("$to_mail")->mime_encode . "\n";
 $header .= "Subject: " . jcode($subject)->mime_encode . "\n";

ヘッダを指定します。ここでは変数に入力しています。jcode()->mime_encodeによりメールアドレスとタイトルをエンコードします。これによってアドレスやタイトルに日本語が入っている場合でも受け取り側のメールソフトで日本語が表示できるようになります。

 $header .= "MIME-Version: 1.0\n";
 $header .= "Content-type: text/plain; charset=ISO-2022-JP\n";
 $header .= "Content-Transfer-Encoding: 7bit\n\n";

ここもヘッダです。Content-typeの設定をtext/plainにしているので内容の文は通常のテキストとして処理されます。charsetがISO-2022-JPなのでJISと判断されます。 最後の二回連続の改行によりヘッダの終わりを宣言できます。

 if (open(SMAIL, "| $mail_cmd")){
        print SMAIL $header;
        print SMAIL $contents;
        close(SMAIL);
 } else {
        &error("メールコマンドが実行できません。<br>$mail_cmdが正しいか確認してください。");
 }

メールを送信します。コマンドをパイプでオープンし、ヘッダ、内容をそのコマンドに送信します。コマンドがオープンできない場合にエラーを返します。

 prnit "Content-Type: text/html\n\n";
 print "送信しました。";

必要であれば送信終了ページを表示します。そのままLocationで次のページに飛ぶのもよいでしょう。

関連するCGIテクニック

HTMLメールを送信する方法
Net::SMTPを使ってメールを送信する方法
Net::SMTP::TLSを使って認証付きサーバーからメールを送信する方法
JISの長文メールの文字化けの解消