アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » モダンPerlの世界へようこそ » 第20回 Email::Sender:メールを送信する

モダンPerlの世界へようこそ

第20回 Email::Sender:メールを送信する

メール送信のあれこれ

たとえばウェブアプリケーションでなにかの注文を受け取ったとき,あるいはシステム管理ツールでなにか異常を発見したとき,ユーザや管理者にメールを送れるようにしたい,というのはよくある要件です。昔はヒアドキュメントやテンプレートエンジンなどを使って送信したいメールを用意したあと,sendmailへのパイプを開いてメールを流し込んでいたものですが,いまはメールの作成から送信まで,すべてモジュールを使って実現できるようになっています。

とはいえ,需要が大きいだけにメール関係のモジュールは山のようにあります。ディストリビューション(パッケージ)の数だけで500を数えますし,メール関係の名前がついたモジュールは現在CPANにアップロードされている7万以上ものモジュールのほぼ1割を占めるほどです。これではどれを使えばよいのかわからないという声があがるのも当然でしょう。

そこで今回はPerl Email Projectというコミュニティがおすすめするモジュールを中心に,モダンなメールの送信法をまとめてみます。

Perl Email Projectとは?

PEPことPerl Email Projectは,当時よく使われていた「Mail::」ないし「MIME::」で始まるモジュール群の不具合や複雑さに業を煮やしたサイモン・カズンズ(Simon Cozens)氏やリチャード・クランプ(Richard Clamp)氏,サイモン・ウィストウ(Simon Wistow)氏らが2003年頃に始めたプロジェクトです。いまでは新しいツールの作成にとどまらず,バグが放置されている古い関連モジュールのメンテナンスや,既知の問題とその解決策をまとめたりする作業も行われていますが,当初の目的は,Email::SimpleのPODにあるように「使うのもメンテも簡単な,無駄のない,高速で外部依存も最小限にとどめた,正しい」メール関係モジュールをつくることでした。PEPのモジュールは既存のモジュールとの混乱を避けるために「Email::」以下の名前空間にまとめられています。だから,モダンな実装が欲しければ基本的にはその名前空間にあるモジュール群を使っていけばよい,ということになります(逆にいうと,このプロジェクトに関係のないメール関連モジュールにはEmail::という名前をつけないほうがよいでしょう)。

Perl Email Projectが管理しているモジュールは,Task::Email::PEP::All,あるいはClass::DBIに依存しているEmail::Storeを外したTask::Email::PEP::NoStoreを使うとまとめてインストールできます。

> cpan Task::Email::PEP::NoStore

また,同プロジェクトのWikiにはおすすめモジュールの一覧などもまとまっています。

Email::MIMEを使ってメールを作成する

さて,今日の本題ですが,メールを送信するにはまずメールそのものを作成する必要があります。そのためのツール自体いくつもありますが,日常的な用途ではEmail::Simpleや,そのラッパであるEmail::MIMEを使うのがおすすめです(Email::Simpleでは添付ファイルなどの処理ができないので,ふつうはEmail::MIMEを使うことになるでしょう)。

Email::MIMEを使ってISO-2022-JPベースのごく一般的なメールを作成する場合はこのようになります。

use strict;
use warnings;
use utf8;
use Email::MIME;
use Email::MIME::Creator;
use Encode;
# use Encode::compat::MIME::Header::ISO_2022_JP; # perl < 5.8.8

my $email = Email::MIME->create(
  header => [
    From    => encode('MIME-Header-ISO_2022_JP' => '"F.U." <foo@example.com>'),
    To      => encode('MIME-Header-ISO_2022_JP' => '"B.A." <bar@example.jp>'),
    Subject => encode('MIME-Header-ISO_2022_JP' => 'タイトル'),
  ],
  attributes => {
    content_type => 'text/plain',
    charset      => 'ISO-2022-JP',
    encoding     => '7bit',
  },
  body => encode('iso-2022-jp' => '本文'),
);

# print $email->as_string;

headerには追加したいヘッダのフィールド名とその内容の組を列挙します。このフィールド名はそのままメールヘッダに流用されます(省略表記などはありません)。必須ヘッダのひとつであるDateヘッダについては,指定がなければEmail::MIME(や,Email::Simple)のほうで自動的に用意してくれます。特定の時間を指定したい場合はEmail::Date::Formatを使うのが簡単です。

use Email::Date::Format 'email_date'

my $email = Email::MIME->create(
  header => [
    Date => email_date( time - 60 * 60 ),
    ...,
  ],
  body => '...',
);

また,Encodeのバージョンが2.11より古い場合はMIMEヘッダのISO-2022-JPエンコードに対応していません。Perl 5.8.8以降であればコアに入っていますが,それ以前のPerlを使っている方でEncodeをアップグレードできない場合は,Encode::compat::MIME::Header::ISO_2022_JPというモジュールをご利用ください。

単純な用途では特に指定する必要はありませんが,attributesを利用すると一部のヘッダを簡単に表記できます(attributesを使わずheaderのなかで直接指定してしまってもかまいません)。本稿執筆時点で対応しているキーはcontent_type,charset,encoding,disposition,name,filename,format,boundaryです。

bodyにはメール本文をスカラー,または配列リファレンスの形で渡せます。

なお,先日公開されたEmail::MIME 1.900以降,headerやbodyのかわりにheader_str,body_strというキーを使うと,attributesで指定したcharsetやencodingの値をもとに内部でエンコードしてくれるようになりました。これは,UTF-8のメールを送る際には非常に便利です。

use utf8;

my $email = Email::MIME->create(
  header_str => [
    From    => '"F.U." <foo@example.com>',
    To      => '"B.A." <bar@example.jp>',
    Subject => 'タイトル',
  ],
  attributes => {
    content_type => 'text/plain',
    charset      => 'UTF-8',
    encoding     => 'base64',
  },
  body_str => '本文',
);

ただし,body_strの方はこれでよいのですが,header_strについてはEncode::MIME::HeaderのエンコードがUTF-8にしか対応していないため,charsetの指定によらずUTF-8でエンコードされてしまいます。ISO-2022-JP,あるいは携帯電話向けにShift-JISなどのヘッダが必要な場合は,strのつかないheaderを使って自分でエンコードしたほうがよいでしょう(※1)。

※1

ISO-2022-JPについてはEmail::MIME::Creator::ISO_2022_JPというモジュールを用意しておきました。

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス