Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. モジュール
  3. here

MIME::Lite - メールを簡単に送信

MIME::Liteモジュールを使えばメールを簡単に送信することができます。

MIME::Liteはデフォルトでsenmailコマンドを利用するのでsendmailあるいはpostfixをインストールしておきましょう。

メールの送信方法にはいくつかの手法がありますが、sendmailコマンドでメールを送信するのが、メールのいろいろな問題に対処するのに簡単だと思います。

メールを送信する

メールを送信するには以下のようにします。マルチパートメッセージという形式で作成して、テキストや画像をアタッチして送信するのが簡単です。

use MIME::Lite;

# マルチパートメッセージの作成
my $msg = MIME::Lite->new(
  From    => 'me@myhost.com',
  To      => 'you@yourhost.com',
  Cc      => 'some@other.com, some@more.com',
  Subject => 'A message with 2 parts...',
  Type    => 'multipart/mixed'
);

# テキストを追加
$msg->attach(
  Type     => 'TEXT',
  Data     => "Here's the GIF file you wanted"
);

# 画像を追加
$msg->attach(
  Type     => 'image/gif',
  Path     => 'aaa000123.gif',
  Filename => 'logo.gif',
  Disposition => 'attachment'
);

# メールを送信
$msg->send;
  1. newメソッドで送信内容を作成します。
  2. atachメソッドでテキストや画像などのデータを追加します。
  3. sendメソッドでメールを送信します。

MIME::Liteで日本語のメールを送る

MIME::Liteで日本語のメールを送る場合は、エンコーディングについて考える必要があります。

次の二つのことを覚えましょう。

  1. ヘッダ部分のタイトル(Subject)はMIME-Header-ISO_2022_JPでエンコードします。
  2. 本文のテキストデータについてはISO-2022-JPでエンコードします。

UTF-8でのエンコーディングでもたいていの場合はよいかとは思うのですが、上記のエンコーディングを使っておくと安全です。

ソースコードはUTF-8で保存して、先頭ではutf8プラグマを有効にしましょう。

上記のサンプルを日本語送信用に書き直すと次のようになります。

use utf8;
use MIME::Lite;
use Encode 'encode';

# マルチパートメッセージの作成
my $msg = MIME::Lite->new(
  From    => 'me@myhost.com',
  To      => 'you@yourhost.com',
  Cc      => 'some@other.com, some@more.com',
  Subject => encode('MIME-Header-ISO_2022_JP', 'メールタイトル'),
  Type    => 'multipart/mixed'
);

# テキストを追加
$msg->attach(
  Type     => 'TEXT',
  Data     => encode('ISO-2022-JP', 'メール本文のテキスト'),
);

# 画像を追加
$msg->attach(
  Type     => 'image/gif',
  Path     => 'aaa000123.gif',
  Filename => 'logo.gif',
  Disposition => 'attachment'
);

# メールを送信「
$msg->send;

UTF-8で送信する場合

2017年現在は、どうなっているのかはよくわかりませんが、UTF-8で送っちゃう場合も多いような気もしますので、そちらのサンプルも掲載しておきます。

use utf8;
use MIME::Lite;
use Encode 'encode';

# マルチパートメッセージの作成
my $msg = MIME::Lite->new(
  From    => 'me@myhost.com',
  To      => 'you@yourhost.com',
  Cc      => 'some@other.com, some@more.com',
  Subject => encode('MIME-Header', 'メールタイトル'),
  Type    => 'multipart/mixed'
);

# テキストを追加
$msg->attach(
  Type     => 'TEXT',
  Data     => encode('UTF-8', 'メール本文のテキスト'),
);

# 画像を追加
$msg->attach(
  Type     => 'image/gif',
  Path     => 'aaa000123.gif',
  Filename => 'logo.gif',
  Disposition => 'attachment'
);

# メールを送信「
$msg->send;

Perlの文字コードについてわからない場合はEncodeモジュールの解説記事をご覧ください。

FAQ

MIME::Liteに関するFAQに答えます。

MIME::Liteは非推奨になっているようですが

MIME::Liteは簡単に使えますが、現在は非推奨になっています。

MIME::Liteは個人的にはもっとも使いやすいメール送信モジュールですが、コミュニティの意向に従う場合はEmail::Senderを使いましょう。

文字化けが発生します

UTF-8で表現できても「ISO-2022-JP」では表現できない文字があることが原因です。

このような場合はUTF-8でエンコーディングしてメールを送信するか、UTF-8で表現される文字を「ISO-2022-JP」に変換可能な文字に置換しましょう。