Net::SMTPを使ってメールを送信する方法

CGIテクニック集トップへ





概要

PerlのPackage, Net::SMTPを使ってメールを送信します。CGIのフォームメールなどの送信部分になります。Net::SMTP::TLSを使って認証付きサーバーからメールを送信する方法も参照ください。

必用な処理

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

サンプルコード

 use Jcode;
 use Net::SMTP;
 
 my $mailhost = 'smtp.mailhost.com';
 my $to_mail = 'tomail@dummy.com';
 my $from_mail = 'frommail@dummy.com';
 my $subject = 'テキストメール';
 
 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";
 
 my $smtp = Net::SMTP->new($mailhost);
 $smtp->mail($from_mail);
 $smtp->to($to_mail);
 $smtp->data();
 $smtp->datasend($header);
 $smtp->datasend($contents);
 $smtp->dataend();
 $smtp->quit;
 
 prnit "Content-Type: text/html\n\n";
 print "送信しました。";

コードの解説

 use Jcode;
 use Net::SMTP;

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

 my $mailhost = 'smtp.mailhost.com';

使用するSMTPサーバー名を指定します。この部分は必ず適切に指定してください。

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

送り先メールアドレス、送り主メールアドレス、メールのタイトル、メールコマンドを変数に入力します。通常CGIの場合はメールアドレスやタイトルの値は送信フォームから引き渡されます。この例では簡便の為に直接変数を設定しています。

 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と判断されます。 最後の二回連続の改行によりヘッダの終わりを宣言できます。

 my $smtp = Net::SMTP->new($mailhost);
 $smtp->mail($from_mail);
 $smtp->to($to_mail);
 $smtp->data();
 $smtp->datasend($header);
 $smtp->datasend($contents);
 $smtp->dataend();
 $smtp->quit;

メールを送信します。Net::SMTPのオブジェクトを作成し、それに対して各メソッドを起動します。

SASL認証が必要な場合は以下のメソッドがmailメソッドの前に必要になります。

 $smtp->auth($username,$password);

このメソッドを使うにはPerlのPackage, Authen::SASLがインストールされていないといけません。そのモジュールがインストールされてない場合にauthメソッドは0を返しますのでそれを利用してエラーメッセージを表示させることもできます。

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

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

関連するCGIテクニック

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