PHPMailer 不显示 HTML

Posted

技术标签:

【中文标题】PHPMailer 不显示 HTML【英文标题】:PHPMailer doesn't show HTML 【发布时间】:2016-04-09 10:56:54 【问题描述】:

我正在构建一个批量电子邮件工具来处理我们的客户列表,了解一些即将进行的迁移。我们当前的群发邮件工具在这种特殊情况下并没有完全解决问题,我选择只构建一个。

我正在使用 TinyMCE 为电子邮件正文提供一个编辑器,并将其传递给 phpMailer 以发送出去。一切都很好,除了在 Outlook 等客户端查看时 html 无法正确显示。我已经确定$mail->isHTML(true) 已设置,所以我现在不知所措。

我在 bulk_mail_sender() 函数中回显了 $message 的值并且它是正确的。如果我将此字符串粘贴为 $mail->Body 它可以工作。但是,如果我将 $message 设置为 $mail->Body,它会变成各种奇怪的字符。

消息来源:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">&lt;p&gt;Hi there,&lt;/p&gt;
&lt;p&gt;Â&nbsp;&lt;/p&gt;
&lt;p&gt;What is up foo&lt;/p&gt;

代码:

function bulk_mail_sender($vars, $emails, $subject, $message)

    foreach ($emails as $email)
    
        $mail = new PHPMailer;
        $mail->isSMTP();                                    // Set mailer to use SMTP
        $mail->SMTPAuth = true;                             // Enable SMTP authentication
        $mail->Host = $vars['opt_host'];                    // Specify main SMTP Server
        $mail->Port = $vars['opt_port'];                    // TCP port
        $mail->Username = $vars['opt_user'];                // SMTP Username
        $mail->Password = $vars['opt_pass'];                // SMTP Password
        $mail->SMTPSecure = $vars['opt_type'];              // Enable TLS / SSL encryption

        $mail->setFrom($vars['opt_sender_email'], $vars['opt_sender_name']);

        $mail->addAddress($email);
        $mail->addReplyTo($vars['opt_sender_email'], $vars['opt_sender_name']);
        $mail->isHTML(true);

        $mail->Subject = $subject;
        $mail->Body = $message;

        if(!$mail->send())
        
            echo 'Message failed to send to ' . $email;
            echo 'Mailer Error: ' . $mail->ErrorInfo . '</br></br>';
        
        else
        
            echo 'Message has been sent to ' . $email . '</br>';
        
    


function bulk_mail_output($vars)
   
    if (!empty($_POST))
    
        $subject = $_POST['subject'];
        $message = $_POST['message'];

        $emails = $_POST['emails'];
        $emails = explode(PHP_EOL, $emails);

        bulk_mail_sender($vars, $emails, $subject, $message);
    
    else
    
        echo '<form method="POST" action="">';

        echo 'Subject: <input type="text" name="subject" id="subject"></br></br>';
        echo '<textarea rows="10" cols="100" name="message" id="message"></textarea></br></br>';

        echo '<h3>Email Addresses</h3>';
        echo '<textarea rows="10" cols="100" name="emails" id="emails"></textarea></br></br>';

        echo '<input type="submit" value="Submit">';

        echo '</form>';

        echo '<script language="javascript" type="text/javascript" src="../includes/jscript/tiny_mce/tiny_mce.js"></script> 
                <script language="javascript" type="text/javascript"> 

                    tinyMCE.init(
                        mode: "exact",
                        elements: "message",
                        theme: "advanced",
                        entity_encoding: "raw",
                        convert_urls: false,
                        relative_urls: false,
                        plugins: "style,table,advlink,inlinepopups,media,searchreplace,contextmenu,paste,directionality,visualchars,xhtmlxtras",
                        theme_advanced_buttons1: "cut,copy,paste,pastetext,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect,|,search,replace",
                        theme_advanced_buttons2: "bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,|,forecolor,backcolor,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,cleanup,code,help",
                        theme_advanced_buttons3: "", // tablecontrols
                        theme_advanced_toolbar_location: "top",
                        theme_advanced_toolbar_align: "left",
                        theme_advanced_statusbar_location: "bottom",
                        theme_advanced_resizing: true
                    );

                    function toggleEditor(id)
                    
                        if (!tinyMCE.get(id))
                            tinyMCE.execCommand(\'mceAddControl\', false, id);
                        else
                            tinyMCE.execCommand(\'mceRemoveControl\', false, id);
                    
                </script>';
    

【问题讨论】:

您没有说出实际问题是什么——“没有正确显示”并没有什么好说的。实体或 Unicode 内容应该可以正常工作,所以你可能做错了什么。在 html 处理方面,这一前景的另一个因素是一堆垃圾。 【参考方案1】:

虽然我无法在 TinyMCE 中找到解决此问题的方法,但使用的解决方法是在将 $message 变量设置为邮件正文时将其包装在 html_entity_decode 函数中。我宁愿第一次正确地从 TinyMCE 传递数据,但是由于某种原因无法完全禁用实体编码。

$mail = new PHPMailer;
$mail->CharSet = "UTF-8";
$mail->isSMTP();                                    // Set mailer to use SMTP
$mail->SMTPAuth = true;                             // Enable SMTP authentication
$mail->Host = $vars['opt_host'];                    // Specify main SMTP Server
$mail->Port = $vars['opt_port'];                    // TCP port
$mail->Username = $vars['opt_user'];                // SMTP Username
$mail->Password = $vars['opt_pass'];                // SMTP Password
$mail->SMTPSecure = $vars['opt_type'];              // Enable TLS / SSL encryption

$mail->setFrom($vars['opt_sender_email'], $vars['opt_sender_name']);
$mail->addReplyTo($vars['opt_sender_email'], $vars['opt_sender_name']);

$mail->addAddress($email);
$mail->isHTML(true);

$mail->Subject = $subject;
$mail->Body = html_entity_decode($message);

if(!$mail->send())

    echo 'Message failed to send to ' . $email;
    echo 'Mailer Error: ' . $mail->ErrorInfo . '</br></br>';

else

    echo 'Message has been sent to ' . $email . '</br>';

【讨论】:

以上是关于PHPMailer 不显示 HTML的主要内容,如果未能解决你的问题,请参考以下文章

PHPMailer 或 php 邮件功能 - 显示密件抄送地址

phpmailer 的一些参数

PHPMailer 无法在 Hostinger 上运行,也没有显示任何错误

当我们使用 phpMailer 发送带有动态内容的邮件时,如何在电子邮件正文中显示多个内联图像

如何查看纯文本电子邮件客户端如何显示PHPMailer的AltBody?

PHPmailer:SMTP 连接()失败(不工作)