我正在使用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);
答案 0 :(得分:0)
使用 setBodyText(),您只能将文本设置为电子邮件的一部分:当您在纯文本电子邮件中写入链接时,您只能编写一些没有特定含义的字符;接收邮件的客户端将会理解这是否是链接以及如何呈现它。然而,这个过程是我们无法控制的(它是客户端,取决于用户拥有的客户端)。
我认为最好的解决方案是设置Zend_Mail对象的HTML部分调用
$yourMailObject->setBodyHtml($htmlString);
执行此操作您明确告知邮件客户端如何呈现链接。
显然你必须多做一些工作,但是由于你希望客户端将HTML属性呈现为A标签,更好的方法是向他传递正确的HTML。
总结一下,工作流程如下:
$link
变量$bodyText = "Something... click here: $link ...";
$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>";
$yourMailObject->setBodyText($bodyText)->setBodyHtml($bodyHtml);
然后你像往常一样发送邮件。您可以选择以更复杂的方式自定义html,添加内嵌 css等。您也可以将其格式化为仅文本邮件(使用等宽字体),但由于您传递了正确的HTML,因此您可以确保客户端将单击正确的链接。