いやはや、らくちんだねぇ

突如、さくらインターネットのSMTPサーバを利用してメールを送信してみようと思ったのですよ。具体的には、PerlのEmail::Senderを使ってさくらのレンタルサーバのSMTPサーバからメールを送信してみよう、という感じ。

今回は、以下のWebサイトを参考にしました。ありがとうございます。

さて、結論から言いますと、以下のコードにて送信ができました。ちなみに、いわゆる文字コードはUTF-8で送信しています。ISO-2022-JPで送信したい際は、上記参考サイトをご覧くださいね。

use strict;
use warnings;
use utf8;
use Encode; my $utf8 = find_encoding('utf8');

# メール作成
my $subject = $utf8->encode('テストメール');
my $body    = $utf8->encode(< <'END_BODY');
Email::Senderからのテストメールです。
END_BODY

use Email::MIME;
my $email = Email::MIME->create(
    header => [
        From    => 'from@example.com', # 送信元
        To      => 'to@example.jp',    # 送信先
        Subject => $subject,           # 件名
    ],
    body => $body,                     # 本文
    attributes => {
        content_type => 'text/plain',
        charset      => 'UTF-8',
        encoding     => '7bit',
    },
);

# SMTP接続設定
use Email::Sender::Transport::SMTP::TLS;
my $transport = Email::Sender::Transport::SMTP::TLS->new(
    {
        host     => 'example.sakura.ne.jp',
        port     => 587,
        username => 'your_username@example.sakura.ne.jp',
        password => 'your_password',
    }
);

# メール送信
use Try::Tiny;
use Email::Sender::Simple 'sendmail';
try {
    sendmail($email, {'transport' => $transport});
} catch {
    my $e = shift;
    die "Error: $e";
};

で、まぁ、ここまで到達するのに色々と四苦八苦しましてね……。っていうか、躓いたのはただ一点、『さくらのSMTPサーバへ接続する』という部分です。接続できなかったコードと接続できたコードを比較すると、

# Before
use Email::Sender::Transport::SMTP;
my $transport = Email::Sender::Transport::SMTP->new(
    {
        host          => 'smtp.example.com',
        port          => 587,
        sasl_username => 'your_username@example.sakura.ne.jp',
        sasl_password => 'your_password',
    }
);

# After
use Email::Sender::Transport::SMTP::TLS;
my $transport = Email::Sender::Transport::SMTP::TLS->new(
    {
        host     => 'example.sakura.ne.jp',
        port     => 587,
        username => 'your_username@example.sakura.ne.jp',
        password => 'your_password',
    }
);

ええ、Email::Sender::Transport::SMTPではなく、Email::Sender::Transport::SMTP::TLSを使えば直ぐだったんですね、はい。

なお、さくらのSMTPサーバではなくGmailのSMTPサーバを利用してメールを送信する際は、

use Email::Sender::Transport::SMTP::TLS;
my $transport = Email::Sender::Transport::SMTP::TLS->new(
    {
        host     => 'smtp.gmail.com',
        port     => 587,
        username => 'your_username@gmail.com',
        password => 'your_password',
    }
);

という感じに設定すれば大丈夫でした。

しかし、解ってしまえば驚くほど楽にメール送信とかできる感じですね。