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"><p>Hi there,</p>
<p>Â </p>
<p>What is up foo</p>
代码:
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 无法在 Hostinger 上运行,也没有显示任何错误
当我们使用 phpMailer 发送带有动态内容的邮件时,如何在电子邮件正文中显示多个内联图像