frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

忘れっぽい自分のために覚書(笑)-sendmail から NetSMTP へ

12日の日記に書いた

「受信拒否されたメール」のその後。

あの時、拒否されたのは

arcor.deのメールアドレス宛のメールだったんだけど、

こうやって拒否するIPをリスト化しているのは

arcor.deではなくて「SORBS」なる

プロジェクトらしい。

つまり、このSORBSのリストを、

他のプロバイダーも利用してるかもしれないので

今後、どのメールアドレスに送ったら

同じ現象(受信拒否)が起こるのか、わからんという事。

うーん、こりゃ、拒否されないで済むIPで

メールを送信するプログラムを組まないとアカンな。

っつー訳で。

今までは、perlスクリプト上で

sendmailを呼んで、メールを送信するという

典型的(?)な方法でやってたんだけど、

そうすると、今回拒否されちゃった

問題のサーバーのIP経由でメールが送られてしまうので、

Net::SMTP モジュールを使って

SMTPサーバー経由でメールを送信する事にしました。

が、SMTPサーバーのIPは、SORBSで調べてみると

どうやら拒否されないIPらしいので

楽勝と思ったら、意外に梃子摺ってですね。

何度やっても、SMTPサーバーが

メールを送信してくれないので、

何が問題かと思ったら、

どうやらPOP before SMTPになっている模様。

メーラーで送信する時には

POP before SMTPSMTP認証の設定をしなくても

送信できるのに、なんでperlから呼ぶとダメなんだ?

訳わかんないなぁ…はぁ。

仕方ないので、単純に Net::POP3

一度POPサーバーにログインしてから

SMTPサーバーにアクセスしたら

今度はうまく送信できるようになりました(^-^)/

わーい、わーい。

Net::SMTPのサンプル


#!/usr/bin/perl --

use Net::POP3 ;

use Net::SMTP ;

local $MAIL = {

'SERVER'=>'SMTP_server' ,

'ID'=>'your_id' ,

'PASS'=>'your_password' ,

'FROM'=>'your_address' ,

'TO'=>'recipients_address'

} ;

$MAIL->{BODY} =<<_EOT_ ;

To: $MAIL->{TO}

From: $MAIL->{FROM}

Subject: test

your message

_EOT_

&popBeforeSmtp() ;

&sendmail() ;

exit() ;

sub sendmail {

my $SMTP = Net::SMTP -> new(

$MAIL->{SERVER} ,

Hello => $MAIL->{SERVER} ,

Timeout => 60 ) ;

die "SMTPサーバーに接続できないよ\n" unless $SMTP;

$SMTP->mail( $MAIL-{FROM} ) ;

$SMTP->to( $MAIL->{TO} ) ;

$SMTP->data() ;

$SMTP->datasend( "$MAIL->{BODY}\n" ) ;

$SMTP->dataend() ;

$SMTP->quit ;

}

sub popBeforeSmtp() {

my $POP = Net::POP3->new( $MAIL->{SERVER} ) ;

die "POPサーバーに接続できへんで\n" unless $POP ;

$POP->login( $MAIL->{ID} , $MAIL->{PASS} ) ;

die "IDかパスワードが違うんじゃない?\n" unless $POP ;

$POP->quit ;

}