0

我正在使用 Zend_Mail 通过 SMTP 发送文本电子邮件。在测试环境中,我注意到当通过浏览器客户端收集我的电子邮件时,URL 已被转换为超链接,但链接和普通文本之间的边界被绘制在错误的位置。

例如,在下面的电子邮件片段中,您可以看到我已向用户发送了一封注册电子邮件。它包括“id”和“code”的参数。您将看到,在这种情况下,浏览器客户端已确定“id”是超链接的一部分,但“代码”不是。

please follow this link <a href="http://mydomain.com/user/validate/id/18">http://mydomain.com/user/validate/id/18</a>/code/1a0d917c1512c700f7237ae1f3727e47 If you did not...

有时,“边界”是在任意位置绘制的——例如,在代码字段的一半处!

通过 Outlook 等客户端收集电子邮件时,似乎没有出现此问题。

大概这是我的 PHP 环境和我的浏览器客户端之间的某种字符集不兼容。话虽如此,我使用的是标准的 PHP 安装,并且在我的浏览器客户端中接收来自其他站点的链接没有问题。(浏览器客户端作为网站管理员帐户的一部分提供。)

有任何想法吗?

更新:这是生成链接的代码。尝试了各种组合,包括 EOT、单引号、双引号......结果相同......

$id         = $options['id'];
$code       = $options['validation'];
$link       = "http://mydomain.com/user/validate/id/" . $id . "/code/" . $code;

$body = 'Thanks for registering ... please follow this 
link ' . $link . ' If you did not request ....please ignore it.';

$this->setBodyText($body);
4

1 回答 1

0

使用setBodyText(),您可以设置电子邮件的仅文本部分:当您在纯文本电子邮件中编写链接时,您只会编写一些没有特殊含义的字符;接收邮件的客户将了解这是否是一个链接以及如何呈现它。然而,这个过程是我们无法控制的(它是客户端,取决于用户拥有的客户端)。

我认为最好的解决方案是同时设置 Zend_Mail 对象的 HTML 部分,调用

$yourMailObject->setBodyHtml($htmlString);

这样做可以明确告诉邮件客户端如何呈现链接

显然您必须多做一些工作,但是由于您希望客户端将 HTML 属性呈现为 A 标记,因此更好的方法是将正确的 HTML 传递给他。

总而言之,工作流程如下:

  1. 确定链接并将其(假设)放入$link变量中
  2. 以纯文本格式准备邮件正文:$bodyText = "Something... click here: $link ...";
  3. 以 HTML 格式准备邮件正文:$bodyHtml = "<body><p>Click the link below</p><p><a href='$link'>$link</a></p><p>Or copy and paste in your browser the url:<br/><pre>$link</pre></p></body>";
  4. 调用邮件对象的两个方法:$yourMailObject->setBodyText($bodyText)->setBodyHtml($bodyHtml);

然后你可以像往常一样发送邮件。您可以选择以更复杂的方式自定义 html,添加内联css 等等。您还可以将其格式化为纯文本邮件(使用等宽字体),但由于您传递了正确的 HTML,您可以确保客户端将单击正确的链接。

于 2011-10-27T23:07:28.520 回答