この日記の方針。
- この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
- ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
- 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
- perl -e die
2008-09-03 (Wed)メールを送るなど
■ [MIME][Encode] MIME::Lite で添付ファイル付きメールを送る

MIME::Lite を使うと、添付ファイルつきのメールも簡単に送ることができる。
ちょっと Encode でつまずいた。誰か教えてください。
#!/usr/bin/perl # ソースの文字コードは UTF-8 use strict; use Encode; use MIME::Lite; my $msg = MIME::Lite->new( From => 'from@example.com', To => 'to@example.com', Subject => encode('MIME-Header-ISO_2022_JP', 'メールの件名'), Type => 'multipart/mixed', ); my $message = <<EOF; メールのテスト MIME::Liteでメールを送っています。 EOF # 本文。 $msg->attach( Type => 'text/plain; charset="ISO-2022-JP"', # ISO-2022-JPのエンコードがうまく行かず、ちょっとトリッキーな方法。 # おそらくもっとスマートな方法があって、誰か頭の良い人が書き直してくれるに違いない。 Data => encode('ISO-2022-JP', decode('UTF-8', $message)), ); # 添付ファイル。 # attach() を繰り返せば、複数のファイルを添付することも可能。 $msg->attach( Type => 'image/gif', Path => '/path/to/file.gif', # ファイルのパスを指定する。 Filename => 'attach.gif', # この名前で保存される。 Disposition => 'attachment', # よくわからん。決め打ち。 ); # send() の引数でSMTPのアドレスを指定できるっぽい。 # 空だと Net::SMTP のデフォルト値? $msg->send(); # デバッグ用。文字列として表示する。 #print $msg->as_string();
添付ファイルを扱うならこの方法が一番簡単。と思われる。
参照
EncodeモジュールでのMIME Encode
Encodeモジュールで文字コードの変換ができるが、MIMEエンコードをするには以下のようにすればよい。
use Encode; encode('MIME-Header-ISO_2022_JP', $subject)詳細はperldoc Encode::MIME::Headerを参照。
MIME::Lite - 添付付きメールの送信
添付付きメールを送信するにはMIME::Liteを利用すると便利です。Net::SMTP や直接Sendmailにパイプして添付を送信する場合、boundryでメッセージ部分と添付部分をきちんと区切ればよいのですが、すこしでも間違えるとうまく送れないことが多いので、こちらのモジュールを使用することをお勧めします。
トラックバック - http://perl.g.hatena.ne.jp/Cress/20080903
UTF-8フラグが立ってないと Encode::encode はうまくいかないです。
from_to($message, 'utf8', 'ISO-2022-JP') でどうでしょう
from_toだとうまく行くことは確認してある(なのに何故かencodeで書き換えた・・・)ので、そちらで行こうと思います。