後日 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 件のコメント:
コメントを投稿