如何在Perl中编写Net::SMTP电子邮件

zpjtge22  于 2023-10-24  发布在  Perl
关注(0)|答案(4)|浏览(160)

我的主机没有任何更高的电子邮件模块,所以我宁愿让这个工作没有额外的模块。
我试过使用google smtp服务器(我在XAMPP中使用\sendmail,但从未通过Net::SMTP),我试过secureserver.net smtp服务器。有和没有SSL,有和没有Hello线路,端口465或25。尝试从我的本地XAMPP服务器运行禁用了所有防火墙,尝试在goDaddy服务器上远程运行。
似乎是超时和'smtp failed'. never getting to '.'即使没有 unless($smtp) 测试.无法通过auth,但由于'smtp failed'被解雇我假设它是一个问题,我如何形成对象的初始声明?虽然我已经尝试了几种不同的方法,我没有得到任何实际的服务器错误.

my $smtp = Net::SMTP->new($smtpserver,
    SSL => 1,                   
    Timeout => 60,
    Port => $smtpport,  # tried 25 and 465
    Debug => 1
);
    unless($smtp) { #tried with and without this
        print "smtp failed<br>[".$!."]<br>and<br>".$IO::Socket::SSL::SSL_ERROR;
    }
$smtp->auth($smtpuser, $smtppassword);    #nothing under this line is done
$smtp->mail($smtpuser);            #but i have checked and double checked the data
$smtp->recipient($recipi);         #pointed to several email addys but never arrive
$smtp->data();
$smtp->datasend("From: $smtpuser");
$smtp->datasend("To: $recipi");
$smtp->datasend("Subject: test mail ver six sm loc 12"); 
$smtp->datasend("\n");
$smtp->datasend("blah blah");
$smtp->dataend();
$smtp->quit;
print"...";  #never gets printed

任何建议欢迎,唯一的事情我已经想到,* 没有 * 尝试是包括在初始对象减速认证,我找不到任何地方,显示如何做到这一点。
编辑;加 $!和$IO::Socket::SSL::SSL_ERROR Steffen建议结果是$!= [Bad file descriptor]和$IO::Socket::SSL::SSL_ERROR不返回任何内容。

9lowa7mx

9lowa7mx1#

尝试以下代码(它需要Auten::SASL模块,该模块可能不是您设置的一部分)

use strict;
use warnings;
use utf8;

use Net::SMTP 3.0;
use Authen::SASL qw(Perl);

my $sender = my $user = '[email protected]';
my $password = 'your_password';
my $receiver = '[email protected]';

my $smtp = Net::SMTP->new(
    'smtp.gmail.com',
    SSL=>1,
    Timeout => 20,
    Debug   => 1,
);

die "Initialization failed: $!" if !defined $smtp;

print "Trying to authenticate..";
$smtp->auth( $user, $password) or die "could not authenticate\n";

my $header = 
"To: $receiver
From: $sender
Content-Type: text/html
Subject: Testing Net::SMTP

";

my $body = "
The <i>body</i> of the <b>email</b> Net-SMTP example
";

$smtp->mail( $sender );
$smtp->to( $receiver );
$smtp->data();
$smtp->datasend( $header );
$smtp->datasend( $body );
$smtp->datasend( '' );
$smtp->dataend();
$smtp->quit();
jm81lzqq

jm81lzqq2#

Authen::SASL(最后更新2012)似乎不需要这些天.我不知道为什么.
这段代码足以发送到Gmail:

use v5.32;
use warnings;
use Net::SMTP;

my %smtp = (
  host => 'smtp.gmail.com',
  from     => '', # also: user
  password => q(),     # app password: https://support.google.com/accounts/answer/185833
  to       => '',
  subject  => 'Net::SMTP: Hello',
);

my $smtp = Net::SMTP->new($smtp{host},
  SSL   => 1,
  Debug => 1,
);

$smtp->auth($smtp{from}, $smtp{password});;

my $header = <<"HEADER";
To: $smtp{to}
From: $smtp{from}
Content-Type: text/html
Subject: $smtp{subject}
HEADER

my $body = <<"BODY";
The <i>body</i> of the <b>email</b> Net-SMTP example
BODY

$smtp->mail($smtp{from}); # SMTP: MAIL FROM
$smtp->to($smtp{to}); # SMTP: RCPT TO

$smtp->data(); # SMTP: DATA
$smtp->datasend($header);
$smtp->datasend($body);
$smtp->dataend(); # SMTP: .

$smtp->quit(); # SMTP: QUIT

这是对前面的答案的修改,带有方法解释注解,并且没有过多的代码,例如SSL模块和带有空字符串的datasend

g6ll5ycj

g6ll5ycj3#

我使用这个代码:

use Net::SMTP::SSL;

my $smtp = Net::SMTP::SSL->new(
    Host=>$host,
    Hello=>$host,
    Port=>465,
    Debug=>1
);

$smtp->auth($smtp_user, $smtp_pass);

# ...
u91tlkcl

u91tlkcl4#

这是我的看法。不确定我的依赖性是否足够低。IO::Socket::SSLMIME::Base64Authen::SASLNet::SMTP的依赖性。Email::Simple.我认为使用这个模块会更简单。

use strict;
use warnings;
use Net::SMTP;
use Email::Simple;

my $email = Email::Simple->create(
    header => [
      From => '[email protected]',
      To => '[email protected]',
      Subject => 'test email',
    ],
    body => 'test body (perl)',
);

my $smtp = Net::SMTP->new('mail.example.com',
    SSL => 1,
    Debug => 1);
$smtp->auth('[email protected]', '...')
    or die join', ', $!, $smtp->code, $smtp->message;
$smtp->mail('[email protected]');
$smtp->to('[email protected]');
$smtp->data($email->as_string);
$smtp->quit;

如果你想要显式TLS:

--- a.pl    2023-10-06 06:15:32.617525652 +0300
+++ b.pl    2023-10-06 06:16:18.681293590 +0300
@@ -13,8 +13,9 @@
 );
 
 my $smtp = Net::SMTP->new('mail.example.com',
-    SSL => 1,
+    Port => 587,
     Debug => 1);
+$smtp->starttls;
 $smtp->auth('[email protected]', '...')
     or die join', ', $!, $smtp->code, $smtp->message;
 $smtp->mail('[email protected]');

更完整的再现here .

相关问题