1

下面是我用来发送 HTML 电子邮件的 perl 代码:

#!/usr/bin/perl
use strict;
use warnings;
use Switch;
use IO::File;

my $score = 2;
my $to = 'abc@a.com';
my $from = 'def@b.com';
my $subject = "SHV summary report for servers with score $score or higher";
my $mailbody = '<html><body>Hello</body></html>';
open(MAIL,"|/usr/sbin/sendmail -t");
    print MAIL "To: $to\n";
    print MAIL "From: $from\n";
    print MAIL "Subject: $subject\n";
    print MAIL "Content-Type: text/html; charset=utf-8\n\n"
        . "$mailbody";

close(MAIL);

它不工作。我没有收到任何电子邮件。但是,如果我将 open () 调用替换为:

打开(邮件,“|cat -t”);

它打印以下内容:

To: abc@a.com
From: def@b.com
Subject: SHV summary report for servers with score 2 or higher
Content-Type: text/html; charset=utf-8

<html><body>Hello</body></html>

如果我更换:

my $subject = "SHV summary report for servers with score $score or higher";

和:

my $subject = "SHV summary report for servers with core $score";

然后一切正常。如果我

将“core”改回“score”,或

在字符串中添加“或更高”,或

将其更改为“SHV 得分 $score 或更高”

它停止工作。有谁知道为什么?

谢谢,亚历克斯

4

4 回答 4

1

根据您更新的信息,Sendmail 似乎被配置为拒绝主题行过长的邮件。然而,现在人们不太喜欢使用 Sendmail,部分原因是它的配置很难解决,部分原因是它充满了安全错误。

可能可以解决主题行问题,但是我对Sendmail配置的了解不够,无法帮助您。您可以尝试切换到PostfixQMail 之类的东西,但我建议只使用一个模块。我没有这方面的经验,但Net::SMTP看起来很有希望(您需要设置一个邮件服务器以使用 Net::SMTP,在您的情况下可能是“localhost”,假设您继续运行 Sendmail 或其他邮件服务器程序在与 Perl 脚本相同的系统上)。

于 2013-10-04T23:45:32.800 回答
1

首先,当 Perl 有更多 Perlish 解决方案时,不要使用操作系统命令

您不能依赖在系统之间运行的操作系统命令,也不能依赖于它们的实际配置。

Net::SMTP自 5.8.8 起包含在 Perl 中。它不依赖于sendmail配置,它通常可以工作。我在许多程序中一遍又一遍地使用它。我从未将它用于 MIME 消息处理。但是,看起来您无论如何都在手动执行 MIME 位,所以Net::SMTP应该可以。

但是,Perl 中的常见问题解答有一个如何使用 MIME 为指向Email::MIME模块的邮件添加附件。这不是标准 Perl 的一部分,但安装起来应该不会太难。

于 2013-10-06T02:13:09.287 回答
1

将其更改为:

open( MAIL, qq(| /usr/sbin/sendmail -t abc\@a.com)) or die "failed on sending email ";
print MAIL "From:$from\n";
print MAIL "To:$to\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-Type: text/html; charset=utf-8\n\n"
print MAIL "\n$mailbody";
于 2013-10-04T21:01:34.060 回答
0

Mail::SendEasy 应该是一种快速简便的替代解决方案。

它支持 HTML 电子邮件、SMTP 身份验证、附件等。使用 Mail::SendEasy,您还可以省去 sendmail 程序的使用。因此,如果 sendmail 程序有问题或问题,这通常会在使用 Mail::SendEasy 时自动解决

你可以在这里找到更多关于它的信息。

于 2013-10-19T12:22:02.073 回答