为什么有些锚标签不正确?

时间:2011-10-27 04:56:03

标签: zend-framework email-client zend-mail

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

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

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);

1 个答案:

答案 0 :(得分: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);
  5. 然后你像往常一样发送邮件。您可以选择以更复杂的方式自定义html,添加内嵌 css等。您也可以将其格式化为仅文本邮件(使用等宽字体),但由于您传递了正确的HTML,因此您可以确保客户端将单击正确的链接。