2012-04-04 41 views
12

私はSMTP経由でPerlでメールを送信しようとしています。PerlでSMTP経由でメールを送信

私はこれのためのスクリプトを書いています。

Net::SMTP>>> Net::SMTP(2.31) 
Net::SMTP>>> Net::Cmd(2.29) 
Net::SMTP>>>  Exporter(5.65) 
Net::SMTP>>> IO::Socket::INET(1.31) 
Net::SMTP>>>  IO::Socket(1.32) 
Net::SMTP>>>  IO::Handle(1.31) 
Net::SMTP=GLOB(0x273faf0)<<< 220 server GMX Mailservices E 
Net::SMTP=GLOB(0x273faf0)>>> EHLO localhost.localdomain 
Net::SMTP=GLOB(0x273faf0)<<< 250-server GMX Mailservices 
Net::SMTP=GLOB(0x273faf0)<<< 250-8BITMIME 
Net::SMTP=GLOB(0x273faf0)<<< 250-ENHANCEDSTATUSCODES 
Net::SMTP=GLOB(0x273faf0)<<< 250-SIZE 
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH=LOGIN PLAIN 
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH LOGIN PLAIN 
Net::SMTP=GLOB(0x273faf0)<<< 250 STARTTLS 
Net::SMTP=GLOB(0x273faf0)>>> RCPT TO:<[email protected]> 
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001} 
Net::SMTP=GLOB(0x273faf0)>>> DATA 
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001} 
Net::SMTP=GLOB(0x273faf0)>>> To: [email protected] 
Net::SMTP=GLOB(0x273faf0)>>> . 
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001} 
Net::SMTP=GLOB(0x273faf0)>>> QUIT 
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001} 

私はPerlとSMTPに関する十分な情報を持っていないので、私はこのエラーを理解することができませんでした:私はこのスクリプトを実行すると

#!perl 
use warnings; 
use strict; 
use Net::SMTP; 

my $smtpserver = 'server'; 
my $smtpport = 25; 
my $smtpuser = 'username'; 
my $smtppassword = 'password'; 

my $smtp = Net::SMTP->new($smtpserver, Port=>$smtpport, Timeout => 10, Debug => 1); 
die "Could not connect to server!\n" unless $smtp; 

$smtp->auth($smtpuser, $smtppassword); 
$smtp->to('[email protected]'); 
$smtp->data(); 
$smtp->datasend("To: mymail\@gmail.com\n"); 
$smtp->quit; 

は、私の出力は次のようなものです。

どうすればこの問題を解決できますか?

答えて

21

送信者の電子メールアドレスを指定するMAILコマンドを使用してSMTPセッションを開始する必要があります(必要に応じて承認後)。そのため、「MAIL first」(5xxはエラー応答)という応答が返されます。だから、:

$smtp->auth($smtpuser, $smtppassword); 
$smtp->mail('[email protected]'); 
$smtp->to('[email protected]'); 

しかし、あなたはSMTPの専門家ではないなら、なぜ代わりに低レベルNet::SMTPEmail::Senderのような高レベルのモジュールを使用していませんか?

+0

私はあなたの答えが私の問題を解決すると確信していますが、私は新しい質問があります。私は窓で働いています。私はEmail :: Senderをperlのライブラリにインストールしようとしました。私はmingw32を使用しますが、それはインストールされませんでした。 – Selin

+1

別の質問を、おそらくスーパーユーザに投稿してください。 – tripleee

+0

プレーンテキストの代わりにHTMLコンテンツを送信するにはどうすればよいですか? –

1

SMTPコマンドの不足について文句を言います。 任意のドキュメントを見ていなければ、私は@cjmが、あなたは確かに$smtp->mail('[email protected]');

必要がある書き込みのように、それは$smtp->from('[email protected]')ようになりたいと思うだろう、あなただけで認証した後に愚かなビットは、ユーザー名を指定しているようです履歴と後方互換性の観点からは理にかなっています(STARTTLS ESMTP仕様では、認証を行うために必要なことを簡単に述べることができ、認証が完了した後は通常のSMTPのように残ります)。しかし、Net::SMTPはこれらの実装の詳細からあなたを守ることは意味があります。

+2

Net :: SMTPは低レベルモジュールです。それは詳細からあなたを守るために設計されていません。これを行うための上位モジュール(Email :: Senderなど)があります。 – cjm

0

Btw - 少し遅れても、将来の読者のためにとにかく、あなたは実際にメールを受信しましたか?

添付の出力にエラーはありません。コンストラクタでデバッグ(デバッグ=> 1)を有効にしました。これらのメッセージは、一度0に設定すると消えてしまいます。 SMTPを使用する利点は、在庫インストールに含まれていることです。モジュールを追加する必要はありません。

0

悲しいことに、悲しいことに、2014年後半、Net :: SMTP :: SSLは1つのインストールテストで失敗し、gmail(およびその他の)Webベースのサーバーには到達できません。自分のメールサーバーをインストールしないと、Perlから電子メールを送信する唯一の方法は、OLEにOutlookに送信することです。 Outlookはその接続を使用して何かを起こさせます。

私が間違っていることを証明できることを願っています。

5

STARTTLS(他のSMTPサービスではテストされていません)を使用してGmailで現在動作しているcjmスクリプトの更新版です Email:Sender :: Transport :: SMTPSの代わりにEmail :: Sender :: Transport :: SMTPSを使用します。 SMTP Gmailアカウントは「安全性の低いアプリのためのアクセス」許可を持っている必要があります

(「オン」) - 暗号化されていないという意味ではありませんここで、「安全性の低い」、それだけではOAuth 2.0

を使用していない意味のようです
use strict; 
use warnings; 

use Email::Sender::Simple qw(sendmail); 
use Email::Sender::Transport::SMTPS; 
use Email::Simple(); 
use Email::Simple::Creator(); 

my $smtpserver = 'smtp.gmail.com'; 
my $smtpport = 587; 
my $smtpuser = '[email protected]'; 
my $smtppassword = 'password'; 

my $transport = Email::Sender::Transport::SMTPS->new({ 
    host => $smtpserver, 
    ssl => 'starttls', 
    port => $smtpport, 
    sasl_username => $smtpuser, 
    sasl_password => $smtppassword, 
    debug => 1, 
}); 


my $email = Email::Simple->create(
    header => [ 
    To  => '[email protected]', 
    From => '[email protected]', 
    Subject => 'Hi!', 
    ], 
    body => "This is my message\n", 
); 

sendmail($email, { transport => $transport }); 
0

STARTTLSを使用するメールサービスの場合は、新しいNET :: SMTPSモジュールを使用することをお勧めします。次のコードを試してください:

my $msg = MIME::Lite ->new ( 
From => '[email protected]', 
To => '[email protected]', 
Subject => 'Test Message', 
Data => 'This is a test', 
Type => 'text/html' 
); 

my $USERNAME = '[email protected]'; 
my $PASSWORD = 'abc123'; 

my $smtps = Net::SMTPS->new("smtp.mail.att.net", Port => 587, doSSL => 'starttls', SSL_version=>'TLSv1'); 

$smtps->auth ($USERNAME, $PASSWORD) or die("Could not authenticate with bellsouth.\n"); 

$smtps ->mail('[email protected]'); 
$smtps->to('[email protected]'); 
$smtps->data(); 
$smtps->datasend($msg->as_string()); 
$smtps->dataend(); 
$smtps->quit; 
関連する問題