php邮件html格式链接仍处于非活动状态

php邮件html格式链接仍处于非活动状态,php,email,escaping,Php,Email,Escaping,我想在php中创建一个邮件函数,让访问者创建并激活一个用户帐户。为此,我制作了一封带有链接的邮件,该链接指向激活帐户的页面。现在的问题是,有些人希望使用干扰电子邮件中代码的字符。例如:“和”。我试图转义这些字符,但当这些字符出现时,链接变为非活动状态。邮件已发送,但链接不可链接 这就是代码的样子 变量是在PHP中设置的 $New_user->Username = $db->real_escape_string($_POST['un']); $RawUn = $_POST['un'];

我想在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));
$message=数组(
“你好”。$New\u user->Username.,
, “
”, “欢迎来到MakeMo。
”, “要开始使用您的帐户,您必须激活它。
”, '只需单击,即可开始。
, '登录并检查其是否有效。如果无效,请与我们联系(电子邮件位于网站上)。
, '您的密码:'.$New\u user->password.
', “
”, “亲切的问候,
”, “
”, "行政";; $header=数组( “发件人:makeamemoofficial@gmail.com', 答复:makeamemoofficial@gmail.com', “内容类型:text/html”); 邮件($New_user->Email,“MakeAMemo=>newaccount”,内爆(“\r\n”,$message),内爆(“\r\n”,$header));
我已经与数据库建立了连接,因此使用$db->real\u escape\u字符串进行转义工作正常。 链接的位置将在网站完成后更改。 我检查了在href中没有str_替换的情况下代码是否工作。没有成功。我也没有成功尝试不逃避用户名。 标签在邮件中不可见,因此可以识别。链接没有被阻止,因为当我不使用特殊字符时,它确实起作用。将双引号更改为单引号时,效果相反,这意味着不能使用“”,而不是“”。 我不认为标题与此有关,因为链接在使用普通字符时确实有效

知道我的问题是什么吗? 每一个答案都很感激

adear11:以下是生成的标记:

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


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

您应该使用
urlencode,而不是在电子邮件中使用
str\u replace

此函数专门用于对URL中使用的字符串进行编码

至于链接,当它被正确地构造时并不总是工作,可能是因为用户没有使用HTML电子邮件

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

更新


鉴于您所遇到的问题,我会考虑不将实际数据传递到URL中,而是将数据保存到DB中,然后生成一个令牌放在URL中。如果您生成一个带有“代码> UnqID的令牌,您将不会遇到这些特殊字符的麻烦,因为字符串将是字母数字的。er单击链接,只需抓取与令牌关联的数据,然后像URL中的数据一样继续操作。

我尝试了这个htmlspecialchars,但我得到一个错误,我使用了一个未定义的常量作为第二个参数。我从php.net复制了它。因此,在使用mysql(I)时,我总是清理我的输入。无论您对用户输入做什么,您都应该对其进行清理。理论上,用户可以在您的表单中嵌入代码,然后通过电子邮件发送到输入的任何电子邮件地址。当用户单击链接时,它可能会做各种不愉快的事情。您可以用实际生成的标记更新OP吗?我已将其放置在b问题的关键。我刚发现,当查看源代码时,标签是空的。当查看纯文本时,我并不认为链接对我有效。应该转换为url安全字符的所有内容似乎都是。如果你将此链接复制/粘贴到浏览器中,是否有效?我在下面更新了我的答案,并提出了新建议。