我正在使用 perl 发送一封测试电子邮件,但它返回系统找不到指定的路径
Posted
技术标签:
【中文标题】我正在使用 perl 发送一封测试电子邮件,但它返回系统找不到指定的路径【英文标题】:I'm sending a test email using perl but it comes back with system can't find path specified 【发布时间】:2014-08-01 19:47:02 【问题描述】:我试过了:
#!/usr/bin/perl
$to = 'abcd@gmail.com';
$from = 'webmaster@yourdomain.com';
$subject = 'Test Email';
$message = 'This is test email sent by Perl Script';
open(MAIL, "|/usr/sbin/sendmail -t");
# Email Header
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n"
但它会返回 The system cannot find the path specified
。
我也试过了:
#!/usr/bin/perl
use MIME::Lite;
$to = 'abcd@gmail.com';
$cc = 'efgh@mail.com';
$from = 'webmaster@yourdomain.com';
$subject = 'Test Email';
$message = 'This is test email sent by Perl Script';
$msg = MIME::Lite->new(
From => $from,
To => $to,
Cc => $cc,
Subject => $subject,
Data => $message
);
$msg->send;
print "Email Sent Successfully\n";
但它返回SMTP Failed to connect to mail server: No such file or directory at G:\email_test.pl line 18
如何解决这个/这些问题,以便我可以成功发送电子邮件?这些似乎是使用 PERL 发送电子邮件时使用的两个常见示例,但我无法让它们工作。
【问题讨论】:
看起来您是在 Windows 上运行此程序,而/usr/sbin/sendmail
将不存在。您需要为脚本提供要使用的 SMTP 中继服务器的地址。
是的,@AndrewMedico 所说的 - 您正在打开一个进入 /usr/sbin/sendmail -t
的管道,这在任何 Windows 机器上都不是有效路径。顺便说一句,在最近可能的错误位置(在本例中为open
)捕获错误是一种很好的做法
@AndrewMedico 那么我该如何解决呢?通过将open(MAIL, "|/usr/sbin/sendmail -t")
替换为open(SMTPserverName)
?如果是这样,SMTP 服务器是否需要使用单引号等?
使用 MIME::Lite(注意:已过时,不推荐)你可以做例如$msg->send('smtp', 'mail.mydomain.com');
其中mail.mydomain.com
是您的传出 SMTP 服务器。
我爱 MIME::Lite!推荐的替代品是什么?
【参考方案1】:
如果您收到G:\email_test.pl
,我假设您使用的是 Windows 机器。我在您的程序中看到open(MAIL, "|/usr/sbin/sendmail -t");
,它指的是Unix/Linux 系统上的程序。
在 Perl 中,Net::SMTP 模块随几乎所有 Perl 发行版一起提供。我强烈建议人们使用它,除非他们需要对邮件进行 MIME 编码。
该模块使用起来也非常简单,尽管公认不如其他电子邮件模块那么简单。 Net::SMTP
假设您知道 SMTP 的工作原理。幸运的是,SMTP 中的 S 代表 Simple。当然,称它为 Simple 的人与认为 Emacs 是一个直观的程序编辑器的人是同一群人。
# /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use constant
SMTP_HOST => 'mailhost',
TO => 'abcd@gmail.com',
FROM => 'efgh@mail.com',
SUBJECT => 'Test Email',
USER => 'question_guy',
PASSWORD => 'swordfish,
;
my $smtp = Net::SMTP->new( SMTP_HOST ) # This is your SMTP host
or die qq(Cannot create Net::SMTP Object);
$smtp->auth( USER, PASSWORD ) # If you have to use authentication
or die qq(Can't authenticate into ) . SMTP_HOST;
$smtp->mail( FROM );
$smtp->to( TO );
my $message = "Subject: " . SUBJECT . "\n"
. "To: " . TO . "\n"
. 'This is test email sent by Perl Script';
$smtp->data;
$smtp->datasend( $message );
$smtp->dataend;
$smtp->quit;
以上内容未经测试,但我是从我编写的使用Net::SMTP
的程序中输入的。查看Net::SMTP
文档并尝试使用它。
【讨论】:
我得到Can't locate object method "new" via package "Net::SMTP" on the line
my $smtp =....`。 Net::SMTP 已加载到我的机器上。
有趣。我期待可能是语法错误,但不是这个。我编写了一个五行程序,其中我只是创建了一个Net::SMTP
对象。那行得通,或者至少我没有得到 that 错误。可能您没有调用您认为的模块? ikegami 有一个很好的建议来验证它。你可以执行perldoc Net::SMTP
。对吗?以上是关于我正在使用 perl 发送一封测试电子邮件,但它返回系统找不到指定的路径的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件