http://www.stackasterisk.jp/tech/program/perl03_03.jsp
3.Perlからメール(Mail)を送信する
メールを送信する際のいくつかの方法を書きます。メール送信のための設定は予め済ませておいてください。
■単純なテキストメールを送る
perl 自体でメールを送信する方法(Net::SMTP モジュールを使う)もあるのですが、ちょっとしたメールを送るにはすこし大げさすぎるので、sendmail を使う方法を説明します。MTA にはほかにも qmail や Postfix がよく使われていますが、いずれも sendmail 互換のコマンドが用意されています。
ここでは、パイプで sendmail にデータを渡す方法でメールを送信するプログラムを紹介します。
#!/usr/bin/perl
$from = "mats?@hogehoge.hoge"; $to = "mats?@hogehoge.hoge";
open MAIL, "|nkf -j -m0| /usr/sbin/sendmail -f $from -t $to";
print MAIL "From: $from?n"; print MAIL "Subject: This is a test mail.?n"; print MAIL "To: $to?n"; print MAIL "?n"; print MAIL "ほげほげ?n";
close MAIL;
ここで使っている nkf というプログラムは文字コードの変換をするプログラムです。メールは JIS コードで送信しなければならないという決まりがあります。したがって、-j オプションで JIS コードに変換しています。しかし、 送信するメールの量が多い場合にこのような文字コードの変換方法を用いてはいけません。理由は、nkf を子プロセスとして起動するために、システムのパフォーマンスが落ちるからです。そういった場合は jcode.pl などを使って、Perl プログラム内であらかじめ文字コードの変換を行っておくべきです。
また、ヘッダのところに日本語を使いたい場合は MIME エンコードしてやらないといけません。これは、メールの決まりで、ヘッダ部にマルチバイト文字の使用が許されていないからです。ちなみに、上のプログラムで nkf に -m0 というオプションがついていますが、こうしておかないと nkf はせっかく MIME エンコードした文字を勝手にデコードしてしまうからです。 MIME エンコードについてはこちらをご覧ください。
もうひとつ、メールの決まりとして、ヘッダ部と本文の境界には改行だけの行を使います。ヘッダ部にはそういった行が存在してはいけません。また、ヘッダが2行以上にわたる場合は、2行目以降の先頭が半角スペースまたはタブで始まっていなければならないという決まりがあります。
もっと細かくいろいろな決まりがあるのですが、おさえておくべきはこのぐらいです。 下に、メールを送信するための関数を書いておきます。マルチバイトを含むサブジェクトを扱えるようにしています。また、nkf を使わずに、Perl プログラム内部で文字コードを JIS に変換しています。使用するためには別途下記のプログラムが必要です。 mimew.pl (ver 2.02) jcode.pl (ver 2.13)
#!/usr/bin/perl
require "mimew.pl"; require "jcode.pl";
$from = "mats?@hogehoge.hoge"; $to = "mats?@hogehoge.hoge"; $subject = "テストメール"; $body = <<EOT; メールを送信するときは、本文をJIS コードで。 また、ヘッダ部にマルチバイト文字を含めたい場合には MIME エンコードしてやる必要があります。 ご注意ください。 EOT
my_sendmail($from, $to, $subject, $body);
sub my_sendmail($$$$) {
local ($from, $to, $subject, $body) = @_;
# subject を MIME エンコード & JIS 変換
$subject = mimeencode( jcode'jis($subject) );
# 本文を JIS 変換 $body = jcode'jis($body);
open MAIL, "|/usr/sbin/sendmail -f $from -t $to";
print MAIL "From: $from?n"; print MAIL "Subject: $subject?n"; print MAIL "To: $to?n"; print MAIL "?n"; print MAIL "$body?n"; close MAIL;
}
▼Java や Linux を体系的に学びましょう!▼
Stack*のアイティーブーストが、 新学習方式のカリキュラムを開発しました! 9500円から(*1)、Java や Linux を体系的に学べます!! (*1 テキスト代のみの税別料金です)
■添付ファイル付きメールを送信する
添付ファイル付きメールの送信する関数をご紹介しておきます。関数の使い方としては、From アドレス、To アドレス、メール件名、メール本文、添付データ、添付データのファイル名を引数として与えると、そのファイルを添付したメールを送信することができます。
使用には、やはりmimew.pl (ver 2.02) と jcode.pl (ver 2.13) が必要です。
中身についてですが、ポイントは下記です。 MIME マルチパートの書式(Boundary や、Content-Type などヘッダ類)を理解する。 サブジェクトと、添付ファイルのファイル名(必要があれば From も)は MIME エンコード(mimeencode 関数利用)する。 メール本文は JIS コードに変換する。 添付ファイルの内容は、base64 でエンコードする。 メール送信用のプログラム(sendmail や、qmail-inject など)のオプションを man で調べておく。 というところです。適宜カスタマイズしてご利用ください。
#!/usr/bin/perl require 'jcode.pl'; require 'mimew.pl';
$from = "mats?@hogehoge.hoge"; $to = "mats?@hogehoge.hoge"; $subject = "件名"; $body = "ここは、メールの本文になります。"; $attach_data = &myCreateTextFunction; $filename = "filename.txt";
sendAttachMail( $from, $to, $subject, $body, $attach_data, $filename);
##------------------------------------------------ 添付ファイル付きメール送信関数
## sendAttachMail( $from, $to, $subject, $body, $attach_data, $filename);
## ------------------------------------------------------------------------------
## From, To は、メアドのみを渡す。 "who" <who@mail.aaa> とかは駄目。
## $subject, $body, $attach_data, $filename のエンコードは関数内でやるので、
## 普通に EUC を渡せば OK 。
##------------------------------------------------------------------------------ sub sendAttachMail ($$$$$$) { local( $from, $to, $subject, $body, $attach_tmp, $filename) = @_; local $attach = ""; local $boundary = "-*-*-*-*-*-*-*-*-Boundary_" . time . "_" . $$;
# デリミタを退避し、デフォルトの ?n にする。 $oldDelim = $/; undef $/;
### サブジェクトを jis にして、MIME エンコード $subject = mimeencode(jcode'jis($subject));
### 本文を jis に $body = jcode'jis($body);
### 添付するデータを、base64 でエンコード $attach = &bodyencode($attach_tmp, "b64"); $attach .= &benflush("b64");
### ファイル名を sjis にして MIME エンコード。(推奨 ascii ) $filename = mimeencode(jcode'sjis($filename));
### メールの送信 open MAIL, "|/usr/sbin/sendmail -f $from $to";
########################## メールの組み上げ
### 全体のヘッダ print MAIL "MIME-Version: 1.0?n"; print MAIL "Content-Type: Multipart/Mixed; boundary=?"$boundary?"?n"; print MAIL "Content-Transfer-Encoding:Base64?n"; print MAIL "From: $from?n"; print MAIL "To: $to?n"; print MAIL "Subject: $subject?n";
### メール本文のパート print MAIL "--$boundary?n"; print MAIL "Content-Type: text/plain; charset=?"ISO-2022-JP?"?n"; print MAIL "?n"; print MAIL "$body?n";
### 添付ファイルのパート print MAIL "--$boundary?n"; print MAIL "Content-Type: application/octet-stream; name=?"$filename?"?n"; print MAIL "Content-Transfer-Encoding: base64?n"; print MAIL "Content-Disposition: attachment; filename=?"$filename?"?n"; print MAIL "?n"; print MAIL "$attach?n"; print MAIL "?n";
### マルチパートのおわり。 print MAIL "--$boundary" . "--?n";
close MAIL;
# デリミタの復元 $/ = $oldDelim; }
上記において、デリミタの操作をしていますが、mimeencode 関数が ?n であることを要求します。特にデリミタを変更していない場合は不要です。
●この記事はあなたのお役に立ちましたか? 非常に役に立った 役に立った どちらでもない 役に立たなかった 全く役に立たなかった
●ご意見・ご感想があればご記入ください。
【 目次 】 1.PerlをCGIで利用する 2.Perlからデータベース(DataBase)に接続する 3.Perlからメール(Mail)を送信する
【 関連記事 】 【連載】Perl 第1回:Perl基本 第2回:Perl中級 第3回:Perl応用 第4回:Perlその他