くれすのPerl日記 このページをアンテナに追加 RSSフィード

この日記の方針。

  1. この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
  2. ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
  3. 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
  4. perl -e die

2008-09-03 (Wed)メールを送るなど

[][] MIME::Lite で添付ファイル付きメールを送る 21:37  MIME::Lite で添付ファイル付きメールを送る - くれすのPerl日記 を含むブックマーク はてなブックマーク -  MIME::Lite で添付ファイル付きメールを送る - くれすのPerl日記  MIME::Lite で添付ファイル付きメールを送る - くれすのPerl日記 のブックマークコメント

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でメッセージ部分と添付部分をきちんと区切ればよいのですが、すこしでも間違えるとうまく送れないことが多いので、こちらのモジュールを使用することをお勧めします。

UchimataUchimata2008/09/20 02:01# もう解決してるかもですが…
UTF-8フラグが立ってないと Encode::encode はうまくいかないです。
from_to($message, 'utf8', 'ISO-2022-JP') でどうでしょう

CressCress2008/09/25 00:14まだ検証できていないですが、確かにUTF-8フラグ回りが怪しいですね。
from_toだとうまく行くことは確認してある(なのに何故かencodeで書き換えた・・・)ので、そちらで行こうと思います。

トラックバック - http://perl.g.hatena.ne.jp/Cress/20080903