目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

Perlでメール送信してみた。ついでにPythonも

ちょっと仕事でメールを送信するスクリプトを書かなきゃいけないみたいなので調べてみました。

Net::SMTP

とりあえずググってみて、一番最初に見つけた方法がNet::SMTPを使う方法です。ちょっとSMTPサーバとやりとりしているあたりがくどい感じがします。

#!/usr/bin/env perl
use Encode;
use Net::SMTP;
use warnings;
use strict;
use utf8;

# メールを作成します。
my $from    = '送信元アドレス';
my $mailto  = '宛先アドレス';
my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メールタイトル');
my $header  = "From: $from\n" .
              "To: $mailto\n" .
              "Subject: $subject\n" .
              "Mime-Version: 1.0\n" .
              "Content-Type: text/plain; charset = ISO-2022-JP\n" .
              "Content-Trensfer-Encoding: 7bit\n";
my $message = Encode::encode('iso-2022-jp', 'メール本文');

# SMTPサーバに接続します。
my $smtp = Net::SMTP->new('SMTPサーバ名');
if ( !$smtp ) {
     print encode('iso-2022-jp',  "メールサーバーにアクセスできません\n");
     exit;
}

# メールを送信します。
$smtp->mail($from);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend($header);
$smtp->datasend($message);
$smtp->dataend();
$smtp->quit;

Email編

ほかに何かいいモジュールを探していた時に見つけたのが、Email::Sendです。こっちの方がすっきりしていて良い感じです。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Encode;
use Email::MIME;
use Email::MIME::Creator;
use Email::Send;

# メールオブジェクトを生成します。
my $mail = Email::MIME->create(
    header => [
        From    => '送信元アドレス',
        To      => '宛先アドレス',
        Subject => Encode::encode('MIME-Header-ISO_2022_JP', 'メールタイトル'),
    ],
    parts => [
        encode('iso-2022-jp', 'メール本文'),
    ],
);

# メールを送信します。
my $sender = Email::Send->new({mailer => 'SMTP'});
$sender->mailer_args([Host => 'SMTPサーバ名']);
$sender->send($mail);

Python

ついでにPythonでも。

#!/usr/bin/env python
#coding: utf-8
import smtplib
import email.MIMEText
import email.Utils

mail_from = '送信元アドレス'
mail_to   = '宛先アドレス'

# メール作成
message  = email.MIMEText.MIMEText(u"メール本文".encode('ISO-2022-JP'), 'plain', 'ISO-2022-JP')
message['Subject']  = u"メールタイトル".encode('ISO-2022-JP')
message['From']     = mail_from
message['To']       = mail_to
message['Date']     = email.Utils.formatdate()

# メール送信
smtp = smtplib.SMTP("SMTPサーバ")
smtp.sendmail(mail_from, [mail_to], message.as_string())
smtp.close()

ちなみに、理由はよく分からないのですが、会社のSMTPサーバで試していたところ上の2つのスクリプトは時々失敗するんですね。Pythonスクリプトの方は一回も失敗したことがないのですが。

また、Net::SMTPの方でメールを送信すると、タイムスタンプが実際の時間の1時間前になっているんですよね。不思議だ。