PHP邮件:链接中的普通字符正在被替换
Im使用简单脚本发送测试电子邮件:PHP邮件:链接中的普通字符正在被替换,php,encoding,Php,Encoding,Im使用简单脚本发送测试电子邮件: $sql = "SELECT name, update_url FROM `accounts` WHERE `subscription_id` = '4692'"; $res = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($res); $name = $row["name"]; $updateUrl = $row["update_url"]; echo $updateUrl;
$sql = "SELECT name, update_url FROM `accounts` WHERE `subscription_id` = '4692'";
$res = mysqli_query($con, $sql);
$row = mysqli_fetch_assoc($res);
$name = $row["name"];
$updateUrl = $row["update_url"];
echo $updateUrl;
$subject = 'Subscription Payment Has Failed';
$message = 'Hi ' . $name . ',
Your subscription payment has failed. You can use the link below to update your payment information if needed:
' . $updateUrl .'
Cheers,
test name';
$headers = 'From: test ' . "\r\n";
$headers .= "Content-type: text/plain; charset=\"UTF-8\"; format=flowed \r\n";
$headers .= "Mime-Version: 1.0 \r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable \r\n";
mail($email, $subject, $message, $headers);
我遇到的问题是,,
$updateUrl即使正确存储在数据库中,也会通过邮件发送
更确切地说:
在数据库中,它的存储方式如下:
在发送的邮件中,它的接收方式如下:
d75f25e599e3c842ea5288f47e
请注意,'=40'替换为'@','=46'替换为'F','=01'替换为空格
这是什么原因造成的?这是什么类型的字符表示/编码
值得一提的是,当以内容类型为text/HTML的HTML发送时,仍然会发生这种情况。您必须使用:
正在使用此代码对消息的每一行进行编码(如果使用“引用的可打印”编码:
public function encodeQP($string, $line_max = 76)
{
// Use native function if it's available (>= PHP5.3)
if (function_exists('quoted_printable_encode')) {
return quoted_printable_encode($string);
}
// Fall back to a pure PHP implementation
$string = str_replace(
array('%20', '%0D%0A.', '%0D%0A', '%'),
array(' ', "\r\n=2E", "\r\n", '='),
rawurlencode($string)
);
return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
}
您需要对正在发送的邮件执行此操作。至少是这样 请查看PHPMailer正在使用的代码。发送电子邮件是一种黑色艺术。这是并且是完全正常的。问题是您正在声明内容传输编码,但没有对要匹配的内容进行编码,因此任何看起来像QP编码的内容都被错误解码。您需要将其应用于整个MIME部分(在您的案例中,这是整个消息),而不仅仅是URL,使用如下方式:
mail($email, $subject, quoted_printable_encode($message), $headers);
调用此命令也会将文本包装为76个字符行,但这不会影响传递消息的外观,因为编码是无损的
如果您没有使用PHPMailer,请不要将您的问题标记为PHPMailer。根据您的电子邮件提供商的不同,电子邮件很可能在到达您的收件箱之前经过消毒,以保护其用户免受恶意电子邮件的侵害。您确定要发送UTF-8吗?您的数据库是否存储UTF-8?您收到的是某种ASCII十六进制code替换:ASCII hex 40=
@
ACII hex 46=F
,而ASCII hex 1不可打印,因此您得到了一个空格。这是使用引用的可打印编码的错误方式。您需要将其应用于整个MIME部分,而不仅仅是其中的一部分。是的,这起到了作用。另外,我删除了错误的标记,感谢您指出它