分123メール送信のあれこれたとえばウェブアプリケーションでなにかの注文を受け取ったとき,あるいはシステム管理ツールでなにか異常を発見したとき,ユーザや管理者にメールを送れるようにしたい,というのはよくある要件です。昔はヒアドキュメントやテンプレートエンジンなどを使って送信したいメールを用意したあと,sendmailへのパイプを開いてメールを流し込んでいたものですが,いまはメールの作成から送信まで,すべてモジュールを使って実現できるようになっています。いえ,需要が大きいだけにメール関係のモジュールは山のようにあります。ディストリビューション(パッケージ)の数だけで500を数えますし,メール関係の名前がついたモジュールは現在CPANにアップロードされている7万以上ものモジュールのほぼ1割を占めるほどです。これではどれを使えばよいのかわからないという声があがるのも当然でしょう。Projectというコミュニティがおすすめするモジュールを中心に,モダンなメールの送信法をまとめてみます。Wistow)氏らが2003年頃に始めたプロジェクトです。いまでは新しいツールの作成にとどまらず,バグが放置されている古い関連モジュールのメンテナンスや,既知の問題とその解決策をまとめたりする作業も行われていますが,当初の目的は,Email::SimpleのPODにあるように「使うのもメンテも簡単な,無駄のない,高速で外部依存も最小限にとどめた,正しい」メール関係モジュールをつくることでした。PEPのモジュールは既存のモジュールとの混乱を避けるために「Email::」以下の名前空間にまとめられています。モダンな実装が欲しければ基本的にはその名前空間にあるモジュール群を使っていけばよい,ということになります(逆にいうと,このプロジェクトに関係のないメール関連モジュールにはEmail::という名前をつけないほうがよいでしょう⁠)⁠。Projectが管理しているモジュールは,Task::Email::PEP::All,あるいはClass::DBIに依存しているEmail::Storeを外したTask::Email::PEP::NoStoreを使うとまとめてインストールできます。Task::Email::PEP::NoStoreまた,同プロジェクトのWikiにはおすすめモジュールの一覧などもまとまっています。Email::MIMEを使ってメールを作成するさて,今日の本題ですが,メールを送信するにはまずメールそのものを作成する必要があります。そのためのツール自体いくつもありますが,日常的な用途ではEmail::Simpleや,そのラッパであるEmail::MIMEを使うのがおすすめです(Email::Simpleでは添付ファイルなどの処理ができないので,ふつうはEmail::MIMEを使うことになるでしょう⁠)⁠。Email::MIMEを使ってISO-2022-JPベースのごく一般的なメールを作成する場合はこのようになります。$email->as_string;headerには追加したいヘッダのフィールド名とその内容の組を列挙します。このフィールド名はそのままメールヘッダに流用されます(省略表記などはありません⁠)⁠。必須ヘッダのひとつであるDateヘッダについては,指定がなければEmail::MIME(や,Email::Simple)のほうで自動的に用意してくれます。特定の時間を指定したい場合はEmail::Date::Formatを使うのが簡単です。'...',);また,Encodeのバージョンが2.11より古い場合はMIMEヘッダのISO-2022-JPエンコードに対応していません。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にはメール本文をスカラー,または配列リファレンスの形で渡せます。1.900以降,headerやbodyのかわりにheader_str,body_strというキーを使うと,attributesで指定したcharsetやencodingの値をもとに内部でエンコードしてくれるようになりました。これは,UTF-8のメールを送る際には非常に便利です。'本文',);ただし,body_strの方はこれでよいのですが,header_strについてはEncode::MIME::HeaderのエンコードがUTF-8にしか対応していないため,charsetの指定によらずUTF-8でエンコードされてしまいます。ISO-2022-JP,あるいは携帯電話向けにShift-JISなどのヘッダが必要な場合は,strのつかないheaderを使って自分でエンコードしたほうがよいでしょう(※1⁠)⁠。※1ISO-2022-JPについてはEmail::MIME::Creator::ISO_2022_JPというモジュールを用意しておきました。Email::Sender著者プロフィール石垣憲一(いしがきけんいち)あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。