使用PHP中的mail()以HTML格式正确显示电子邮件

时间:2013-07-29 16:17:55

标签: php html email thunderbird

我正在尝试用PHP编写一个简单的批处理电子邮件进程,它循环遍历MySQL表中的许多订阅者,并发送一封带有我Wordpress数据库文章的HTML电子邮件。

在我的代码中,我有用于订阅者名称的电子邮件和占位符的HTML,然后是文章的正文,例如(一个非常简单的示例)

<html><body><h1>Hello ##NAME##</h1><div>##CONTENT##</div></body></html>

我先解析字符串,将## CONTENT ##替换为我的MySQL语句的输出,然后为每个订阅者替换名称,然后再发送一个简单的函数调用,例如

$headers = "From: The UK Horse Racing Tipster <$from>\r\n"
    "X-Mailer: PHP/" . phpversion() ."\r\n"
    "MIME-Version: 1.0\r\n"
    "Content-Type: text/html; charset=utf-8\r\n" 
    "Content-Transfer-Encoding: 8bit\r\n\r\n";


$r = mail($to, $subject, $body, $headers); 

然而,我遇到的问题包括:

- 有些人的邮件客户端正在输出HTML作为纯文本(我使用Thunderbird,它显示HTML,简单HTML和纯文本对我来说好,将HTML转换为其他模式 - 但其他人都在抱怨。

- 我引用的图像(如链接图像,例如http://mywebsite.com/logo.jpg没有显示 - 即使我点击加载远程内容按钮。我不知道为什么,代码没问题,服务器很快

- 在我从Wordpress获取的代码中,通过替换## CONTENT ##占位符将其插入到HTML模板中,我遇到了内容左侧奇数空格的问题。例如,如果我在Thunderbird中查看消息源,我从帖子中获取的内容由于某种原因是自动换行的,但是在屏幕的左侧,您可以注意到实际帖子或HTML中不存在的额外空格。我发了电子邮件。

例如,如果您注意到以下小例子,则可以看到由于左侧第一个空格而导致大量HTML标记被破坏。

<tr>
<td>
<p>Hi Rob</p><div><p>Here is today's newsletter
 Rememember that our members now get to..<strong
 >access all our information <table
 ></tr><tr><td>BLAH</td></tr></table><p><st
 rong>some broken info from <a href="ww
 w.mywebsite.com">mywebsite.com</a></p>
</tr>
</table>

这意味着我必须运行大量正则表达式才能删除所有这些空格!不需要和完全矫枉过正 - 再加上我永远无法处理每次出现破坏的标签,因为内容的长度会发生变化,所以我永远不知道空格会出现在标签/单词的哪个位置。

这显然可以使格式化的HTML看起来破碎,破碎的图像,带有间隙的单词和其他格式问题。

我不知道为什么会出现这些空格,但它只发生在我从数据库中获取并插入模板的文本中。

显然,如果可能,我想解决所有这些问题。

处理HTML电子邮件的最佳方法是什么,而不会进行全面的过度杀伤并编写正确的电子邮件解析器。

非常感谢任何帮助。

由于

0 个答案:

没有答案