2010-04-12 55 views
10

我想用Perl发送HTML邮件。如何使用Perl发送HTML电子邮件?

open(MAIL,"|/usr/sbin/sendmail -t"); 

    ## Mail Header 
    print MAIL "To: $to\n"; 
    print MAIL "From: $from\n"; 
    print MAIL "Subject: $subject\n\n"; 
    ## Mail Body 
    print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n" 
     . "<html><head></head><body>@emailBody"; 
close(MAIL) 

这是正确的做法吗?由于某种原因,它不工作。谢谢你的帮助。

回答

9

内容类型应该是邮件标题的一部分。现在它是邮件正文的一部分。标题与双换行符分开。因此,在主题标题之后删除第二个换行符可以解决内容类型未正确解释的问题。

3

你不应该通过管道直接与sendmail直接交谈。而是使用合适的CPAN模块。

Email::Sender就是一个例子。

Mail::Sender has a specific guide on sending HTML messages

+0

如果有,为什么说话直接是不好的sendmail的一个原因,你应该包括它; “这很糟糕”没有帮助。 – felwithe 2015-05-05 18:39:07

+0

@felwithe - 列出太多理由。为什么ANYING不应该直接在操作系统上使用并使用适当的模块(你知道sendmail需要的每个边界情况和错误处理吗?OP是否?) – DVK 2015-05-05 19:41:20

19

开始Email::Sender::SimpleEmail::Sender
有一个quickstart guide in CPAN,里卡多在他2009年问世日历

写了好use-me从快速入门指南:

use strict; 
    use Email::Sender::Simple qw(sendmail); 
    use Email::Simple; 
    use Email::Simple::Creator; 

    my $email = Email::Simple->create(
    header => [ 
     To    => '"Xavier Q. Ample" <[email protected]>', 
     From   => '"Bob Fishman" <[email protected]>', 
     Subject  => "don't forget to *enjoy the sauce*", 
     'Content-Type' => 'text/html', 
    ], 
    body => "<p>This message is short, but at least it's cheap.</p>", 
); 
    sendmail($email); 
+0

+1,这是一个很好的帖子。我为你插入了URL .. – lexu 2010-04-12 21:04:59

+0

感谢您的编辑,@lexu和Eugen – spazm 2016-12-13 09:13:48

2

如果你是刚刚发生spewy电子邮件,并且不需要大量的稳健性或调整,你总是可以只走快捷方式......

use Email::Stuff; 

my $html = <<'END_HTML'; 
<html> 
    ... 
</html> 
END_HTML 

Email::Stuff->to('"Xavier Q. Ample" <[email protected]>') 
      ->from('"Bob Fishman" <[email protected]>') 
      ->subject("Don't forget to *enjoy the sauce*") 
      ->html_body($body) 
      ->send; 
0

使用HTML标签“预”将是脚本发送一个简单的方法
在HTML电子邮件中输出 。

open(MAIL, "|/usr/sbin/sendmail -t"); 
    print MAIL "To: $EMAIL\n"; 
    print MAIL "From: $FROM\n"; 
    print MAIL "Subject: $SUBJECT"; 
    print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n"; 
    print MAIL <pre>\n$mailoutput</pre>\n; 
    close(MAIL); 

,让你做所有的格式化在你的脚本,并会
获得电子邮件相同的输出在屏幕上。 [如你所知确保
“pre”之前和之后没有空格]

1

我在使用sendmail从Perl发送MIME多部分消息时遇到了问题。

经过几个小时的挫折之后,我发现整个消息 需要在一个变量中用单条语句发送消息 到sendmail。因此,举例来说,如果你的信息是完全在 包含一个名为$ email_msg,发送通过sendmail的消息变量看起来 像:

$mailprog = '/usr/sbin/sendmail'; 
open(MAIL,"|$mailprog -t"); 
print MAIL $email_msg; 
close MAIL; 

这工作,同时采用了许多“打印MAIL‘消息内容’,”不不是 似乎发送邮件消息,某些邮件阅读器可以按预期处理。

这是在CentOS服务器上使用Perl 5.8.8。

1

您可以使用Email::MIME

my $message = Email::MIME->create(
    header_str => [ 
     From => '[email protected]', 
     To  => $address, 
     Subject => encode_mimewords($subject, 
     Charset => 'utf-8', Encoding => 'B'), 
     'Content-Type' => 'text/html', 
    ], 
    attributes => { 
     encoding => 'base64', 
     charset => 'UTF-8', 
    }, 
    body_str => $message_body, 
); 
    sendmail($message);