PHP邮件:链接中的普通字符正在被替换

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;

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;

 $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部分,而不仅仅是其中的一部分。是的,这起到了作用。另外,我删除了错误的标记,感谢您指出它