php mail html格式链接保持不活动状态

时间:2013-12-31 21:11:52

标签: php email escaping

我想在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-&gt; real_escape_string进行转义可以正常工作。 网站完成后,链接的位置将会更改。 我检查代码是否在href中没有str_replace的情况下工作。没有成功。我没有成功试图逃避用户名。 标签在邮件中不可见,因此可以识别。链接未被阻止,因为它在我不使用特殊字符时起作用。将双引号更改为单引号时,可以反转效果,这意味着不是“”,而是“不起作用”。 我不认为标题与它有关,因为链接在使用普通字符时起作用。

知道问题的原因是什么? 每个答案都表示赞赏。

adear11:这是生成的标签:

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

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

1 个答案:

答案 0 :(得分:1)

您应该使用str_replace http://php.net/urlencode

而不是在电子邮件中使用urlencode

此功能专门用于编码在网址中使用的字符串

如果链接在正确形成时并不总是有效,那么用户就不会使用HTML电子邮件。

此外,虽然不是特定于您的问题,但这个脚本是疯狂的不安全。您永远不需要在不首先清理输入的情况下使用用户提供的输入(在您的情况下为$_POST)。所有这些作业至少需要通过htmlspecialchars运行。

<强>更新

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