2009年3月17日火曜日

FreeBSD,Perlで,プロバイダの認証あり587番ポートへのメール送信

 Net::SMTP::TLS は2006年1月以来更新が止まっていて,2016年時点ではすでに非推奨になっている。 そこで,2016年11月に FreeBSD で,Perl で gmail からメールを送る:Net::SMTP::TLS をやめて,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うことにした というのを書いたので,そちらも参照してみて欲しい。
 後日 FreeBSD,Perl スクリプトで,GmailのSMTPからメールを送るというのを書いた。 そちらも参考にしてみて欲しい。
とあるプロバイダの下にあるサーバーにいろいろと作業をさせているが,そいつからのメールを受け取りたい時があった。サーバーではPerlで作業をさせている(cgiやけど)ので,Perlでメールを送りたいと思ったが,プロバイダの下流なのでちょっと制限があった。その話。

プロバイダはスパムメールを避けるために,SMTPの認証を要求してくる。さらにサブミッションポートが587番になっている。そこにPerlからメールを送りたい,というのが今回のミッション。きっとCPAN辺りにいいモジュールがあるに違いないと思って検索してみた。今回ヒットしたのが,Net::SMTP::TLSとかNet::SMTPなど。Net::SMTPもSASL認証(SMTP-AUTH認証)をしてくれるが,サブミッションポートの指定の仕方がわからなかったので,今回はNet::SMTP::TLSを使ってみることにした。ただし,名前の通りTLS(暗号化通信)を使うためのモジュールなのだが,うちのプロバイダはTLSを使うとなっていないので,TLSを使わない,という指定が必要だった。

まずはインストール。FreeBSDなのでportsからインストール。場所は
/usr/ports/mail/p5-Net-SMTP-TSL/
そこで,make install cleanとしてインストールした。インストール時にオプションを聞かれたので,オプションをつけておいた。オプションの内容は忘れた。dns関係だっけ?

インストールできれば,後は使い方。基本は下記のような感じらしい。
use Net::SMTP::TLS;
my $mailer = new Net::SMTP::TLS(
     'smtpauth.yyyy.ne.jp',
     NoTLS   =>      'NO',
     Port    =>      587,
     User    =>      'hogehoge',
     Password=>      'poyopoyo');
$mailer->mail('hogehoge@yyyy.ne.jp');
$mailer->to('punipuni@xxxx.com');
$mailer->data;
$mailer->datasend("Sent thru TLS!");
$mailer->dataend;
$mailer->quit;
ここで,hogehogeはプロバイダでのメール用のアカウント名,poyopoyoはそのパスワード,smtpauth.yyyy.ne.jpはSMTPのためのサーバー,hogehoge@yyyy.ne.jpは送信元のメールアドレス、punipuni@xxxx.comは相手先のメールアドレス。
     NoTLS => 'NO',
の行は、TLSを使わない場合に必要な行。TLSを使う場合には行自体を削除しないといけない。実際にはdataやdatasendの部分にe-mailらしいヘッダーをつけないといけないので、そこはネットで検索して、他の人のを参考にしてみた。結果はこんな感じ。Jcode.pmはあらかじめ
/usr/ports/japanese/p5-Jcode/
からインストールしておかないといけないが。
#! /usr/local/bin/perl

use Jcode;
use Net::SMTP::TLS;

my $mailhost = 'smtpauth.yyyy.ne.jp'; # SMTP用のサーバー名
my $mailport = 587; # SMTP用のポート番号。25番のことも多い。
my $mail_username = 'hogehoge'; # メールアカウント
my $mail_password = 'poyopoyo'; # メールのパスワード

my $from_mail = 'hogehoge@yyyy.ne.jp'; # 送信元のメールアドレス
my $to_mail = 'punipuni@xxxx.com'; # 宛先のメールアドレス
my $subject = 'メールのサブジェクトを書いてください';
$subject = jcode($subject)->jis; # これはJcode.pmの処理

$message = 'これはテストです。'."¥n";
$message .= '適当なメッセージを書いてください。'."¥n";
$message = jcode($message)->jis; # これもJcode.pmの処理

my $header;
$header = "From: ".jcode("$from_mail")->mime_encode."¥n";
$header .= "To: ".jcode("$to_mail")->mime_encode."¥n";
$header .= "Subject: ".jcode($subject)->mime_encode."¥n";
$header .= "MIME-Version: 1.0¥n";
$header .= "Content-type: text/plain; charset=ISO-2022-JP¥n";
$header .= "Content-Transfer-Encoding: 7bit¥n¥n";

my $smtp = new Net::SMTP::TLS(
     $mailhost,
     NoTLS => 'NO',
     Port => $mailport,
     User => $mail_username,
     Password => $mail_password
     );
# TLSを使う時には、NoTLS => 'NO'の行を削除すること

$smtp->mail($from_mail);
$smtp->to($to_mail);
$smtp->data();
$smtp->datasend($header);
$smtp->datasend($message);
$smtp->dataend();
$smtp->quit;

print "'".$to_mail."'宛に送信しました。¥n";
一度お試しあれ

0 件のコメント: