[MyTools / Memoz / MIME::Lite ]

MIME::Lite


■ インストール

rootになって tar.gz 解凍後、
% perl Makefile.PL
% make test
% make

root権限がなく、特定のユーザで使う場合は、
% perl Makefile.PL LIB=/home/me/lib
% make test
% make


■ テスト

mimetest.pl ... コマンドラインで実行する簡単なプログラム

% perl maketest.pl

※ 特定ユーザでインストールした場合、-I<LIB=で指定した場所> オプションが必要。


■ 使い方

use MIME::Lite; を宣言すること。



■ Tips

● 文章+添付メールを送る

 標準は以下のようにする。(日本語はJIS。)


my $msg = new MIME::Lite(
                         From=>'hoge@mytools.net'
                       , To=>'bar@mytools.net'
                       , Encoding=>'binary'
                       , Type=>'multipart/xxx'
                        );

### テキスト部の追加
$msg->append(
             Type=>'TEXT'
           , Data=>'添付するよん〜'
             );

### 添付ファイル
$msg->append(
             Type=>'binary'
           , Content-type=>'application/octet-stream'
           , Encoding=>'Base64'
           , File=>'/foo/bar/attach.file'
           , Name=>'attach.file'
             );

open(MAIL, "/usr/lib/sendmail -t") || die $!;
$msg->print(\*MAIL);
close(MAIL);

 一部のメーラでは送られてきたメールの頭に「This is a multipart-....」という文章がつく。Outlookはつかない(但しソースを見るとついてる)。要するにつくかどうかは受信メーラ依存。



● 文章のみのメールを送る

 普通のメールも次のようにすれば一応送ることはできる。(日本語はJIS。)


my $msg = new MIME::Lite(
                From=>'hoge@mytools.net'
              , To=>'bar@mytools.net'
              , Encoding=>'binary'
              , Type=>'TEXT'
              , Data=>'メール本文ですよ〜'
                        );
open(MAIL, "/usr/lib/sendmail -t") || die $!;
$msg->print(\*MAIL);
close(MAIL);
 この場合「This is a multipart- ...」の文章はつかない。



● Bcc, Errors-to, Reply-to 等を付ける

 new時に「Bcc=>」とか「Errors-to=>」とか付けたがダメ。結局 header_as_string, body_as_string を使って間にヘッダを割り込ませる。



(...$msg作成後、送信部で...)

open(MAIL, "/usr/lib/sendmail -t") || die $!;
print MAIL $msg->header_as_string;
print MAIL "Errors-to: error\@mytools.net\n";
print MAIL "Reply-to: reply\@mytools.net\n";
print MAIL "Bcc: copy1@mytools.net,copy2@mytools.net, ....\n";
print MAIL "\n";
print MAIL $msg->body_as_string;
close(MAIL);

という具合にやったらうまくいった。ヘッダとボディの間には必ず改行 \n を入れること。



● 現場で使ってみたら…

 某お客様で「CGIメールからファイルを添付したい」とのご要望があったのでこいつを使ってみたところ、「化けて読めない」とか「メール本文まで添付になった」等の苦情が。手の届く範囲のメーラーでは全部試して上手く行ったのに、それ以外でダメなケースが噴出したようです。特に Outlook の Exchange Server版で問題が多かったです。

 結局代表的なメーラー「Becky!」の添付ファイルを解析して、その構造を完全コピーしたところうまくいきました。具体的には下のような感じ。


### インスタンス作成
my $msg = new MIME::Lite(
                         From=>'hoge@mytools.net'
                       , To=>'bar@mytools.net'
                       , Type=>'multipart/mixed'
                        );

### 添付ファイルの処理
$msg->append(
             Type=>'binary'
           , Content-type=>'application/octet-stream'
           , Encoding=>'Base64'
           , File=>'/foo/bar/attach.file'
           , Name=>'attach.file'
             );

### boundary を拾う
$boundary = ???;

### 送信ロジック
open(MAIL, "/usr/lib/sendmail -t") || die $!;

### ヘッダは上と同じ
print MAIL $msg->header_as_string;
print MAIL "Errors-to: error\@mytools.net\n";
print MAIL "Reply-to: reply\@mytools.net\n";
print MAIL "Bcc: copy1@mytools.net,copy2@mytools.net, ....\n";
print MAIL "\n";

### 本文はここで書く(日本語はJIS)
print MAIL <<EOP;
$boundary
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

本文だよん

$boundary
EOP

### その後添付部分を出力
print MAIL "\n";
print MAIL $msg->body_as_string;
close(MAIL);

 結局MIME::Liteを使うのは body_as_string のためだけということに。MIMEエンコーディングライブラリを自作したほうが美しいかも。



[MyTools / Memoz]