【问题标题】:php mail html format link remains inactivephp 邮件 html 格式链接保持非活动状态
【发布时间】:2014-01-03 01:19:29
【问题描述】:

我想在 php 中创建一个邮件功能,让访问者创建和激活用户帐户。为此,我发了一封邮件,其中包含一个链接,该链接指向激活帐户的页面。现在的问题是有些人想使用干扰电子邮件中代码的字符。例如:“”和“”。我试图转义这些字符,但是当出现这样的字符时,链接将变为非活动状态。邮件已发送,但链接无法点击。

这就是代码的样子。

变量在 PHP 中设置

$New_user->Username = $db->real_escape_string($_POST['un']);
$RawUn = $_POST['un'];
$New_user->Password = $_POST['pw'];
$New_user->Email = $_POST['em'];
$CheckEmail = explode("@", $New_user->Email);
$New_user->Country = $_POST['cn'];
$New_user->City = $_POST['ct'];
//$NEW_USER IS AN OBJECT CREATED TO HOLD ACCOUNT INFORMATION SUCH AS USERNAME AND EMAIL
//$RAWUN IS A VARIABLE TO HAVE AN UNESCAPED VALUE OF THE USERNAME TO INSERT IN THE INPUT FIELD IF SOMETHING WENT WRONG

检查值后,发送邮件:

$message = array(   
    'Hello ' . $New_user->Username . ',<br/>',
    '<br/>',
    'Welcome to MakeAMemo.<br/>',
    'To start working with your account you will have to activate it.<br/>',
    'Just click on the <a href="localhost/makeamemo.com/ConfirmAccount.php?Un=' . str_replace(" ", "+", $New_user->Username) . '&Em=' . $db->real_escape_string($New_user->Email) . '&Action=Create">link</a> and you are ready to go.<br/>',
    'Log in and check if it works. If not, please contact us(E-mail is on the website).<br/>',
    'Your password: ' . $New_user->Password . '<br/>',
    '<br/>',
    'Kind regards,<br/>',
    '<br/>',
    'Administration');
$header =   array(
    'From: makeamemoofficial@gmail.com',
    'Reply-To: makeamemoofficial@gmail.com',
    'Content-type: text/html');
mail($New_user->Email,"MakeAMemo => New account",implode("\r\n", $message),implode("\r\n", $header));

我已经与数据库建立了连接,因此使用 $db->real_escape_string 进行转义可以正常工作。 链接的位置将在网站完成后更改。 我检查了代码是否在没有 href 中的 str_replace 的情况下工作。没有成功。我没有成功尝试不逃避用户名。 标签在邮件中是不可见的,因此可以识别。该链接没有被阻止,因为当我不使用特殊字符时它确实有效。当把双引号变成单引号时,你的效果是反转的,这意味着代替“”,''不起作用。 我认为标题与它无关,因为链接在使用普通字符时确实有效。

知道我的问题的原因是什么吗? 每一个答案都值得赞赏。

aear11:这里是生成的标签:

<a href="localhost/makeamemo.com/ConfirmAccount.php?Un=%22s+avonds&Em=dennis.heutinck%40gmail.com&Action=Create">link</a>

"s avonds 是一个不正确的荷兰语单词,其中包含一些需要测试的字符。

【问题讨论】:

  • 该链接对我来说似乎有效。应该转换为 url 安全字符的所有内容似乎都是。如果您将此链接复制/粘贴到浏览器中,它可以工作吗?
  • 我用新的建议更新了下面的答案。

标签: php email escaping


【解决方案1】:

您不应在电子邮件中使用str_replace,而应使用urlencode http://php.net/urlencode

此函数专门用于编码字符串以在 urls 中使用

至于链接在正确形成时并不总是有效,可能是用户没有使用 HTML 电子邮件。

此外,虽然不是针对您的问题,但此脚本非常不安全。您永远不需要使用用户提供的输入(在您的情况下为$_POST)而不先清理输入。至少,所有这些分配都需要通过htmlspecialchars 运行。

更新

考虑到您遇到的麻烦,我会考虑不在 URL 中传递实际数据。相反,我会将数据保存到数据库中,然后生成一个令牌以放入 url。如果您使用uniqid 生成令牌,则这些特殊字符不会有任何问题,因为字符串将是字母数字。用户单击链接后,只需获取与令牌关联的数据,然后像数据在 URL 中一样继续操作。

【讨论】:

  • 我尝试了这个 htmlspecialchars,但是我收到了一个错误,我使用了一个未定义的常量作为第二个参数。我从 php.net 复制它
  • 因此,我在使用 mysql(i) 时总是清理我的输入。
  • 无论您在做什么,都应该始终清理用户输入。理论上,用户可以在您的表单中嵌入代码,该代码将通过电子邮件发送到输入的任何电子邮件地址。当用户点击链接时,它可能会做各种令人讨厌的事情。
  • 你能用实际生成的 标签更新 OP 吗?
  • 我把它放在问题的底部。我刚刚在查看源代码时发现 标记为空。查看纯文本时,它不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多