18

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('mymail@gmail.com');
$smtp->data();
$smtp->datasend("To: mymail\@gmail.com\n");
$smtp->quit;

このスクリプトを実行すると、出力は次のようになります。

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:<mymail@gmail.com>
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: mymail@gmail.com
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に関する十分な情報がないため、このエラーを理解できませんでした。

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

4

6 に答える 6

29

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

$smtp->auth($smtpuser, $smtppassword);
$smtp->mail('sender@example.com');
$smtp->to('mymail@gmail.com');

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

use strict;
use warnings;

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

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

my $transport = Email::Sender::Transport::SMTP->new({
  host => $smtpserver,
  port => $smtpport,
  sasl_username => $smtpuser,
  sasl_password => $smtppassword,
});

my $email = Email::Simple->create(
  header => [
    To      => 'mymail@gmail.com',
    From    => 'sender@example.com',
    Subject => 'Hi!',
  ],
  body => "This is my message\n",
);

sendmail($email, { transport => $transport });
于 2012-04-04T09:54:51.013 に答える
8

これは、STARTTLSを使用して現在Gmailで動作するcjmのスクリプトの更新バージョンです(他のSMTPサービスではテストされていません)。Email:: Sender :: Transport::SMTPの代わりにEmail::Sender :: Transport::SMTPSを使用します。

Gmailアカウントでは、「安全性の低いアプリへのアクセス」を許可する(「オンにする」)必要があります。「安全性が低い」とは暗号化されていないことを意味するのではなく、OAuth2.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   = 'user@gmail.com';
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      => 'user@example.com',
    From    => 'whatever@gmail.com',
    Subject => 'Hi!',
  ],
  body => "This is my message\n",
);

sendmail($email, { transport => $transport });
于 2015-05-14T13:55:07.303 に答える
2

MAIL FROM:SMTPコマンドがないことを訴えます。ドキュメントを見ないで、私はそれが次のように見えるだろうと思います$smtp->from('you@example.net')@cjmが書くように、あなたは必要です$smtp->mail('you@example.net');

確かに、認証後にユーザー名を指定するのは少しばかげているようですが、歴史的および下位互換性の観点からは理にかなっています(STARTTLS ESMTP仕様では、認証に必要なことを簡単に記述できます。残りのセッションは、認証が行われた後、通常のSMTPと同じように行われます)。Net::SMTPただし、これらの実装の詳細からユーザーを保護することは理にかなっています。

于 2012-04-04T09:52:08.047 に答える
0

ところで-少し遅れていますが、とにかく将来の読者のために、あなたは実際にメールを受け取りましたか?

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

于 2014-04-30T09:05:09.183 に答える
0

悲しいことに、(非常に)2014年後半に、Net :: SMTP :: SSLは1つのインストールテストのうちの1つに失敗するため、Gmail(およびその他の)Webベースのサーバーにアクセスできません。自分のメールサーバーをインストールせずに、Perlからメールを送信するために見つけることができる唯一の方法は、OutlookにそれをOLEすることです。その後、Outlookはその接続を使用して物事を実現します。

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

于 2014-12-25T03:14:36.863 に答える
0

STARTTLSを使用する電子メールサービスの場合、新しいNET::SMTPSモジュールを使用するのが最適です。次のコードを試してください。

my $msg = MIME::Lite ->new (  
From => 'from@bellsouth.net',
To => 'to@gmail.com',
Subject => 'Test Message',
Data => 'This is a test',
Type => 'text/html'
);

my $USERNAME = 'from@bellsouth.net';
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('from@bellsouth.net');
$smtps->to('to@gmail.com');
$smtps->data();
$smtps->datasend( $msg->as_string() );  
$smtps->dataend();  
$smtps->quit;
于 2017-07-08T04:55:35.340 に答える