我正在使用 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 发送一封测试电子邮件,但它返回系统找不到指定的路径的主要内容,如果未能解决你的问题,请参考以下文章

以 HTML 格式发送电子邮件 [重复]

当我在 laravel 中发送邮件时发送 Html 标签

使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件

从您的应用程序发送一封带有 Swift 附件图像的电子邮件

Perl - 使用带有身份验证的 MIME::Lite 发送电子邮件时遇到问题

发送大量邮件而不发疯(SendGrid?云?)[关闭]