在perl中发送html电子邮件不起作用

时间:2013-10-04 20:42:58

标签: perl

以下是我用来发送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()调用

打开(MAIL,“| 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";

然后一切正常。如果我

将“核心”改回“得分”,或

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

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

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

谢谢, 亚历

4 个答案:

答案 0 :(得分: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";

答案 1 :(得分:1)

根据您的更新信息,听起来Sendmail配置为拒绝邮件主题太长的邮件。然而,人们现在不喜欢使用Sendmail,部分原因是因为它的配置很难解决,部分原因是因为它存在安全错误。

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

答案 2 :(得分:1)

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

您不能依赖于从系统到系统的操作系统命令,并且您不能依赖它们实际配置。

自5.8.8起,

Net::SMTP包含在Perl中。它不依赖于sendmail的配置,它通常有效。我在很多程序中一遍又一遍地使用它。我从来没有用它来进行MIME消息处理。但是,看起来您无论如何都要手动执行MIME位,因此Net::SMTP应该可以正常工作。

但是,Perl中的常见问题解答有一个How do I use MIME to make an attachment to a mail message指向Email::MIME模块。这不是标准Perl的一部分,但不应该太难安装。

答案 3 :(得分:0)

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

它支持HTML电子邮件,SMTP身份验证,附件等。使用Mail :: SendEasy,您还可以删除sendmail程序的使用。因此,如果sendmail程序出现问题,通常会在使用Mail :: SendEasy

时自动解决

You can find out more about it at here.