EmailHTML.pm -- html file into mime multipart message
# HTMLメール送信サンプルプログラム
use strict; use EmailHTML; use Net::SMTP;
# 初期設定
my $SMTP_HOST = "127.0.0.1"; my $MAIL_FROM = 'from@domain.name'; my $MAIL_RCPT = 'to@domain.name'; my $URL = "http://www.domain.name/i/";
# 指定 URL の内容から HTML メールを作成する
my $eh = new EmailHTML( URL => $URL ); $eh->set_header( From => $MAIL_FROM ); $eh->set_header( To => $MAIL_RCPT ); my $data = $eh->out_text();
# Net::SMTP を使ってメール送信する
my $smtp = new Net::SMTP( $SMTP_HOST ) or die "SMTP Failed - $SMTP_HOST\n"; $smtp->mail( $MAIL_FROM ) or die "Invalid sender - $MAIL_FROM\n"; $smtp->to( $MAIL_RCPT ) or die "Invalid receipts - $MAIL_RCPT\n"; $smtp->data(); $smtp->datasend( $data ); $smtp->dataend(); $smtp->quit();
指定したURLからHTMLをダウンロードし、画像ファイルを含む MIME マルチパート形式による HTML メールに変換します。
ページ内の画像も自動的にダウンロードされ、Base64エンコードされます。 HTML 中の IMG タグは <IMG SRC="cid:〜"> と書き換えられます。 (NTTドコモ宛のデコメールに利用できます)
Outlook Express、Becky! 2 で表示できることはもちろん、 NTT DoCoMo 900i シリーズのデコメールとしても受信できます。 ただし、デコメールの制限により、画像ファイルを含めた容量が 10KB 以下となっている必要があります。 10KB を超える場合は、900i 実機で受信した場合に 単なる画像ファイル添付メールとなっているため、ご注意ください。
HTML の文字コードはダウンロードしたまま変更されません。 サーバ上で Shift_JIS のコンテンツは、メール中でも Shift_JIS になります。 ISO-2022-JP、EUC-JP、UTF-8、ISO-8859-1、US-ASCII なども利用可能です。 UCS-2 などの 16bit 文字は利用できません。
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
のように META タグで文字コードが指定された場合は、そのコードとみなします。 META タグで文字コードが指定されない場合は、Shift_JIS⇒EUC-JP⇒UTF-8の順で 自動判別されます。(オプションで自動判別を OFF にすることも可能です) 文字コードの自動判別に失敗する場合は、文字コードは不明(無指定)となります。
EmailHTML.pm 自体は変換処理のみを行い、メール送信処理は行いません。 メールを送信する場合は、Net::SMTP モジュールを併用するか、 out_file() メソッドで sendmail を起動してメールを送信してください。
new()
コンストラクタ
my $eh = new EmailHTML( URL => "http://www.yahoo.co.jp/", # URL指定 HTML => undef, # 読み込みさせない場合 HTML_BASE64 => undef, # HTML部分をBase64化する HTML_QP => undef, # HTML部分をQP化する USER_AGENT => "DoCoMo/0.0/SH900i/c100", # HTTP_USER_AGENTを指定 TZ => "+0900", # Date:ヘッダ用TIMEZONE DETECT_SJIS => 1, # Shift_JIS を自動検出する DETECT_EUCJP => 1, # EUC-JP を自動検出する DETECT_UTF8 => 1, # UTF-8 を自動検出する );
HTML では、指定 URL の内容を予めダウンロード済みの際に指定できます。 HTML のダウンロードは行われません。 HTML 中の画像ファイルはダウンロードされます。
HTML_BASE64 を真にした場合、画像ファイルだけでなくマルチパート中の HTML 部分についても Base64 エンコードされます。 デフォルトでは、ダウンロード時の文字コードのまま生データで出力されます。
HTML_QP を真にした場合は、HTML 部分を Quoted-Pritable 形式にします。 メール経路が 7bit の場合などに有効です。
USER_AGENT は、HTML や画像ファイルを HTTP 経由でダウンロードする際に 利用するブラウザ名を指定します。 サーバ側でブラウザや携帯電話を自動判別している際にも利用できます。
TZ は、メールヘッダの Date: 行で指定するタイムゾーンを指定します。 デフォルトでは +0900(日本標準時)となります。
DETECT_SJIS、DETECT_EUCJP、DETECT_UTF8 は、 META タグによって HTML の文字コードが特定されなかった場合に、 HTML 中の内容から文字コードを自動判別するか否かを指定します。 真の場合は、自動判別します。偽の場合は自動判別しません。
DETECT_SJIS が真の場合は、Shift_JIS(≒CP932、IBM拡張漢字・ 携帯電話絵文字を含む)としてありえないバイト列が1バイトも 含まれない場合に、Shift_JIS として判別します。
DETECT_EUCJP が真の場合は、EUC-JP としてありえないバイト列が 1バイトも含まれない場合に、EUC-JP として判別します。
DETECT_UTF8 が真の場合は、UTF-8 としてありえないバイト列が 1バイトも含まれない場合に、UTF-8 として判別します。
Shift_JIS⇒EUC-JP⇒UTF-8 の優先順位で判別されます。 日本語ページに本モジュールを利用する場合は、全て真をお勧めします。 日本語以外のページにも利用する場合は、全て偽をお勧めします。 META タグもなく自動判別もしなかった場合は、文字コードは無指定となり メールソフト側(の HTML 表示モジュール)の HTML 文字コード自動判別 処理に依存します。
set_header()
メソッド
$eh->set_header( From => 'from@domain.name' ); $eh->set_header( To => 'to@domain.name' ); $eh->set_header( "X-Mailer" => "Microsoft Outlook Express" );
メールヘッダを指定します。 デフォルトでは、以下のヘッダが自動生成されます。
Date: out_text メソッドを呼び出した時刻 Subject: HTMLの<TITLE>〜</TITLE>タグ指定内容 Content-Type: multipart/related MIME-Version: 1.0(固定) Content-Transfer-Encoding: 7bit または 8bit(自動) X-Mailer: USER_AGENT
set_header メソッドで指定されている場合は、自動生成よりも set_header メソッドで指定された内容が優先されます。
my $head = { "From" => 'from@domain.name', "To" => 'to@domain.name', "X-Mailer" => "Microsoft Outlook Express", }; $eh->set_header( %$head );
のように複数のメールヘッダを一括指定することも可能です。
out_text()
メソッド
print $eh->out_text();
HTML 内容とページ内の画像ファイルをダウンロードして、 MIME マルチパート形式のテキスト(文字列)として取り出します。
out_file()
メソッド
$eh->out_file( "/tmp/sample.eml" );
out_file は、MIME マルチパート形式のテキストとして取り出す代わりに 指定したファイル(例えば sample.eml)にメール内容を書き込みます。
$eh->out_file( "| /usr/sbin/sendmail -t -oi" );
第1引数を“|”で始めることで外部コマンドも指定できます。 sendmail を利用してそのままメール送信する例です。 -t オプションによりメール中の To: Cc: Bcc: 行が参照されます。
get_html()
メソッド set_html()
メソッド
my $content = $eh->get_html(); $content =~ s#(</?)(\w+)#$1.uc($2)#g; $eh->set_html( $content );
HTML 中のタグを <br>⇒<BR> のように大文字化する例です。 get_html メソッドでは、(MIME マルチパート化して出力する前に) HTML の内容を先行取得できます。 例えば大文字化などの処理を行った上で set_html メソッドに渡すことで、 HTML の内容を書き換えることも可能です。 get_html メソッドを呼び出さずに set_html メソッドを呼ぶことも可能です。 HTML 内容が決まっている場合などに HTTP ダウンロードを省くことができます。
get_encoding()
メソッド set_encoding()
メソッド
get_encoding は、HTML の文字コード(charset=)を取得します。 META タグの指定内容の参照または、バイト列による自動判別となります。 get_html 処理時の確認に利用できます。(EmailHTML.pm では文字コードの 自動変換は行いません。Jcode.pm や Encode.pm などを併用してください)
set_encoding は、HTML の文字コード(charset=)を指定します。 META タグの指定内容や、バイト列の自動判別よりも優先されます。 set_html した内容で文字コードが既知の場合に有効でしょう。
Copyright 2004 Kawasaki Yusuke <u-suke [at] kawa.net> http://www.kawa.net/