Mail::Sendmail でメール送信

| 1 Comment | 0 TrackBacks | このエントリーをはてなブックマークに追加 このエントリーのはてなブックマーク件数

こんばんは。さっき小さな虫が髪の毛の中に侵入してきて、いつのまにか住処にされたっぽい 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 メソッドを使っています。

  • さらにはてぶで、メールの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 をスクリプトを紹介しました。

何かツッコミ、要望あれば、受け付けております。

No TrackBacks

TrackBack URL: http://perl-mongers.org/MT/mt-tb.cgi/29

1 Comment

こんにちはー

>Mail::Sendmail という sendmail を使ったメール送信を行うものです。

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

Leave a comment

About this Entry

This page contains a single entry by yusukebe published on May 30, 2008 1:13 AM.

++しようぜ! was the previous entry in this blog.

Acme::Oppaiで学ぶメソッドチェイン is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

Creative Commons License
This blog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en