ちょっと仕事でメールを送信するスクリプトを書かなきゃいけないみたいなので調べてみました。
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時間前になっているんですよね。不思議だ。