【问题标题】:How can I send an HTML email with Perl?如何使用 Perl 发送 HTML 电子邮件?
【发布时间】:2011-02-07 02:17:08
【问题描述】:

我正在尝试使用 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)

这是正确的做法吗?由于某种原因它不起作用。感谢您的帮助。

【问题讨论】:

    标签: html perl email


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不应该真正通过管道直接与 sendmail 交谈。而是使用适当的 CPAN 模块。

      Email::Sender 就是一个例子。

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

      【讨论】:

      • 如果有理由直接与 sendmail 通信不好,您应该包含它; “这很糟糕”没有帮助。
      • @felwithe - 列出的理由太多。为什么不应该直接用操作系统完成任何事情并使用适当的模块的许多抽象原因(你知道 sendmail 所需的每个边缘情况和错误处理吗?OP 吗?)
      【解决方案3】:

      Email::Sender::SimpleEmail::Sender 开头。
      有一个quickstart guide in CPAN,Ricardo 在他的 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" <x.ample@example.com>',
            From           => '"Bob Fishman" <orz@example.mil>',
            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);
      

      【讨论】:

        【解决方案4】:

        如果您只是生成大量的电子邮件并且不需要大量的健壮性或调整,您总是可以走捷径...

        use Email::Stuff;
        
        my $html = <<'END_HTML';
        <html>
          ...
        </html>
        END_HTML
        
        Email::Stuff->to('"Xavier Q. Ample" <x.ample@example.com>')
                    ->from('"Bob Fishman" <orz@example.mil>')
                    ->subject("Don't forget to *enjoy the sauce*")
                    ->html_body($body)
                    ->send;
        

        【讨论】:

          【解决方案5】:

          使用 html 标签“pre”将是发送脚本的一种简单方法
          在 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”前后没有空格]

          【讨论】:

            【解决方案6】:

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

            经过几个小时的沮丧后,我发现整个消息 需要在带有 at 单个语句的变量中才能发送消息 发送邮件。例如,如果您的消息完全包含在 一个名为 $email_msg 的变量,通过 sendmail 发送消息看起来 喜欢:

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

            这行得通,而使用许多“打印邮件”消息内容“”不 似乎发送了一些邮件阅读器可以按预期处理的邮件消息。

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

            【讨论】:

              【解决方案7】:

              您可以使用Email::MIME

                  my $message = Email::MIME->create(
                  header_str => [
                    From    => 'no-reply@example.com',
                    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);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-01-01
                • 1970-01-01
                • 2012-10-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多