Net::SMTP::TLSを使って認証付きサーバーからメールを送信する方法

CGIテクニック集トップへ





概要

PerlのPackage, Net::SMTP::TLSを使ってメールを送信します。CGIのフォームメールなどの送信部分になります。gmail等のメールホストを利用してCGIからメールを送信することができます。Net::SMTPを使ってメールを送信する方法も参照ください。

必用な処理

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

サンプルコード

 use Jcode;
 use Net::SMTP::TLS;
 
 my $mailhost = 'smtp.gmail.com';
 my $mailport = 587;
 my $mail_username = 'username';
 my $mail_password = 'password';
 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::TLS->new($mailhost,
                           Port => $mailport,
                           User => $mail_username,
                           Password => $mail_password
                           );
 $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::TLS;

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

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

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

 my $mailport = 587;

SMTPポート名を指定します。利用するSMTPサーバーの説明を読んで適切に指定してください。多くのサーバーが587を利用していますが必ずしもそうでなくても良いのでこの番号はサーバーによって違う場合があります。

 my $mail_username = 'username';
 my $mail_password = 'password';

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::TLS->new($mailhost,
                           Port => $mailport,
                           User => $mail_username,
                           Password => $mail_password
                           );

Net::SMTP::TLSのオブジェクトを作成します。この時点でSMTPサーバー名、ポート番号、ユーザー名、パスワードを渡す必要があります。

 $smtp->mail($from_mail);
 $smtp->to($to_mail);
 $smtp->data();
 $smtp->datasend($header);
 $smtp->datasend($contents);
 $smtp->dataend();
 $smtp->quit;

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

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

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

関連するCGIテクニック

テキストメールを送信する方法
HTMLメールを送信する方法
Net::SMTPを使ってメールを送信する方法
JISの長文メールの文字化けの解消