PHPMailer doesn't show HTML


PHPMailer doesn't show HTML

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

我正在使用TinyMCE为电子邮件正文提供一个编辑器,并将其传递给PHPMailer发送。除了html在Outlook等客户端中查看时没有正确显示外,其他一切都很好。我已经确定了$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>';
    }
}

虽然我在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>';
}