root権限がなく、特定のユーザで使う場合は、
% perl Makefile.PL LIB=/home/me/lib
% make test
% make
% perl maketest.pl
※ 特定ユーザでインストールした場合、-I<LIB=で指定した場所> オプションが必要。
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はつかない(但しソースを見るとついてる)。要するにつくかどうかは受信メーラ依存。
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- ...」の文章はつかない。
(...$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 を入れること。
結局代表的なメーラー「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エンコーディングライブラリを自作したほうが美しいかも。