こんばんは。さっき小さな虫が髪の毛の中に侵入してきて、いつのまにか住処にされたっぽい yusukebe です。さて、今日はとあるアプリの実装で「メール送信」の機能を書いていたので、それを踏まえPerlから簡単に「メールを送信」するスクリプトを紹介します。
メール関係のモジュールはCPANに山ほど登録されていてどれを使えばわけわかめです。今回は「メールの機能は送信のみが欲しい」という目的の元、一番使われてそうで扱いやすいようなモジュールを利用することしました。そのモジュールは Mail::Sendmail という 任意の smtp サーバを経由してメールを送信するモジュールです(ソース見ずにsendmailコマンドをたたくものだと思っていました>< コメントありがとうございます)
http://search.cpan.org/dist/Mail-Sendmail/
今改めて確認したのですが、Mail-Sendmail-0.79 ではテストが「277 PASS」という状態なので信頼できそうですね。
まず、メール送信で注意したいのはタイトルと本文の文字コードです。最近は utf8 のメールもメーラーなどで扱えるようになってきましたが、それでもまだ日本の場合「iso-2022-jp」が主流です。よって、日本語のタイトルと本文を扱う場合「iso-2022-jp」にしてしまいましょう。
今回はタイトルと本文に関して、ソースに直接、utf8 の文字を記述しています。それを「iso-2022-jp」に変換するのに、Encode モジュールの encode メソッドを使っています。
- エンコード処理に関してid:nihenさんからツッコミもらいました。ありがとうございます→http://www.geminium.com/chiba_blog/2008/05/30/25/
- さらにはてぶで、メールのSubjectはMIMEエンコーディングするべきということを指摘いただきました。ありがとうございます。以下修正したコードです。
use Encode;
use utf8;
$subject = encode("MIME-Header-ISO_2022_JP", $subject);
$message = encode("iso-2022-jp", $message);
さてそうしたら準備完了です。Mail::Sendmail の sendmail メソッドに送りたいメールの情報をハッシュで渡して実行すれば、メールが送られます。ここでのポイントは Content-Type で charset を iso-2022-jp にしておくことです(デフォルトは iso-8859-1 )。
my %mail = (
"Content-Type" => 'text/plain; charset="iso-2022-jp"',
To => 'to@example.com',
From => 'from@example.com',
Subject => $subject,
Message => $message,
);
sendmail(%mail);
メーラーで確認をとるとうまく届いています。 日本語も文字化け無しです。
全てのコードはこんな具合です。
#/usr/bin/perl
use strict;
use warnings;
use Mail::Sendmail;
use Encode;
use utf8;
my $subject = "テスト";
my $message = "テストです。ほげほげ。";
$subject = encode("MIME-Header-ISO_2022_JP", $subject);
$message = encode("iso-2022-jp", $message);
my %mail = (
"Content-Type" => 'text/plain; charset="iso-2022-jp"',
To => 'to@example.com',
From => 'from@example.com',
Subject => $subject,
Message => $message,
);
sendmail(%mail);
Mail::Sendmail の詳しい使い方は POD を参考にしてください。
以上、今回はそんなに「悪くない」 Perl をスクリプトを紹介しました。
何かツッコミ、要望あれば、受け付けております。



こんにちはー
>Mail::Sendmail という sendmail を使ったメール送信を行うものです。
「sendmailコマンドを使った送信」という意味でしたら、多分違いますよ。
Mail::Sendmailは任意のsmtpサーバの25番ポートを直接叩く仕様だったと思います。
なので、ローカルのMTAを指定したとしても、設定によっては送れなかったりします(以前はまりました。。。)。