gpt4 book ai didi

PHP、HTML、电子邮件 - 电子邮件中的等号正在转换为不同的字符

转载 作者:可可西里 更新时间:2023-11-01 00:40:52 24 4
gpt4 key购买 nike

设置...

我正在以通常的方式通过 PHP 发送电子邮件...

代码块 0

mail('', $subject, $message, $headers);

...具有以下内容设置:

代码块 1

$boundary = uniqid('np');
$message = '';

$subject = 'Email Subject';

$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: SURL <noreply@someurl.com>\r\n";
$headers .= "To: ".$email."\r\n";

$headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";

// Plain Text
$message .= "Content-Type: text/plain; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";

$message .= 'Hi, you handsome SOB!!
\n\n
We have ...
/n/n
And ...
\n\n
http://someurl.com/.../.../?a=' . $var1 . '&b=' . $var2;

$message .= "\r\n\r\n--" . $boundary . "\r\n";

// HTML
$message .= "Content-Type: text/html; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

$message .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Some Title</title>

<style type="text/css">
... Lots of styles...
</style>

</head>
<body>

<div class="message_container">
<div class="message_logo"></div>

<div class="message_leading_line">
Hi, you handsome SOB!!
</div> <!-- end message_leading_line -->

<div class="message_top_content">
We have ...
<br/>
And ...
<a href="http://someurl.com/.../.../?a=' . $var1 . '&b=' . $var2 . '" >visit this link</a>.
</div> <!-- end message_top_content -->

<div class="message_bottom_content">
If link doesn\'t work, copy and paste...
<pre>http://someurl.com/.../.../?a=' . $var1 . '&b=' . $var2 . '</pre>
</div> <!-- end message_bottom_content -->

</div> <!-- end message_container -->

</body>
</html>';

$message .= "\r\n\r\n--" . $boundary . "--";

这一切都很好。电子邮件发送顺利。查看电子邮件,它的样式正确,所有内容都在应有的位置 - 包括所有动态添加的内容。

到目前为止的行为......

到目前为止,我已经尝试了很多测试用例,而且所有的测试用例都完全按照缩进发送。造型等等。

一个这样的成功案例有:

代码块 3-1、3-2

$var1 = '4pD9051LsVtQu96pLBH41019v28T0o4Z2I3U6urs';
$var2 = 'verPkBE415i447V6R9o';

...所以电子邮件中的链接是:

http://someurl.com/.../.../?a=4pD9051LsVtQu96pLBH41019v28T0o4Z2I3U6urs&b=verPkBE415i447V6R9o

电子邮件发送正确,链接显示正确,链接有效(点击并复制/粘贴)。完美!

问题...

最近的测试:

代码块 4-1、4-2

$var1 = '73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0';
$var2 = 'avr1owgJAAB3h4l1brw';

...所以链接是:

http://someurl.com/.../.../?a=73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b= avr1owgJAAB3h4l1brw

这一次,电子邮件发送...正确?发送时没有明显问题。乍一看,一切都是理所当然的。所有的样式都应有的样子,所有的内容都在需要的地方。

注意:显示的 Gmail 版本是后一个版本,删除了所有标记并以纯文本形式显示。仍然显示错误的 URL。

但是,经过仔细检查,电子邮件客户端中显示的链接(Apple Mail 和 Gmail,都是独立的帐户)是:

http://someurl.com/.../.../?asjbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=ver1owgJAAB3h4l1brw

区别就在问号后面。 ?a=73jb 应该是 ?asjb。单击链接不起作用,复制和粘贴也不起作用。原因很明显 - 呃!

怪癖...?

奇怪的是,如果查看与来源相同的电子邮件(查看 -> 消息 -> 原始来源),链接将完全按照它们应有的样子......

原始资源 1

To: 
Subject: Email Subject
X-PHP-Originating-Script: 2181:email.php
MIME-Version: 1.0
From: SURL <noreply@someurl.com>
To: email@email.com
Content-Type: multipart/alternative;boundary=np57849efa2a13b
X-Identified-User: {:box895.bluehost.com:...:...e.com} {sentby:program running on server}

Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

Hi, you handsome SOB!!
\n\n
We have ...
/n/n
And ...
\n\n
http://someurl.com/.../.../?a=73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=avr1owgJAAB3h4l1brw

--np57849efa2a13b
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Some Title</title>

<style type="text/css">
... Lots of styles...
</style>

</head>
<body>

<div class="message_container">
<div class="message_logo"></div>

<div class="message_leading_line">
Hi, you handsome SOB!!
</div> <!-- end message_leading_line -->

<div class="message_top_content">
We have ...
<br/>
And ...
<a href="http://someurl.com/.../.../?a=73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=avr1owgJAAB3h4l1brw" >visit this link</a>.
</div> <!-- end message_top_content -->

<div class="message_bottom_content">
If link doesn\'t work, copy and paste...
<pre>http://someurl.com/.../.../?a=73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=avr1owgJAAB3h4l1brw</pre>
</div> <!-- end message_bottom_content -->

</div> <!-- end message_container -->

</body>
</html>

--np57849efa2a13b--

这是怎么回事?发送的数据看起来 是正确的,但在非常特殊的情况下会显示所有 cattywampus。为什么 =73 转换为 s(或者,也许 a=73 转换为 as...)?

我检查过 ASCII tablesHTML Codes .在任何一种情况下,唯一与 73 关联的是大写字母“i”。

编辑 1

你不知道我会偶然发现 This HTML URL Encoding Reference发布此问题后立即。

在那里,您会找到与 s 关联的 %73

但是,我仍然不太确定 =73... 是如何变成 %73... 然后 s...。当然似乎与 utf-8 有关。

当然我不是第一个发送电子邮件的人,一定有办法......

编辑 2 - 解决方案!!

解决方案和解释太长,所以将其发布为答案。

最佳答案

问题来自线路:

$message .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

根据 Good ol' Wiki :

QP works by using the equals sign "=" as an escape character.

如果您想保留 quoted-printable 编码,有一种解决方法:

... an ASCII equal sign (decimal value 61) must be represented by "=3D". All characters except printable ASCII characters or end of line characters must be encoded in this fashion.

所以这条线...

http://someurl.com/.../.../?a=3D73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=3Davr1owgJAAB3h4l1brw

...本来可以正常工作(注意 =3D)。

但这还不够!

如果您要使用quoted-printable,您需要将EVERY等号设置为=3D。这包括在您的 header 、样式、脚本和 html 等中。

例如,查看来自 TeamTreehouse 的“忘记密码”电子邮件的前几行,它也使用 quoted-printable 编码:

... Headers and plain-text version above ...

Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.=
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF-8">
<title>Treehouse</title>


<style type=3D"text/css">
... some styles, no equals signs ...
</style>
</head>

<body leftmargin=3D"0" marginwidth=3D"0" topmargin=3D"0" marginheight=3D"0"=
offset=3D"0" style=3D"-webkit-text-size-adjust: none; background: #edeff0;=
margin: 0; padding: 0; width: 100% !important" bgcolor=3D"#edeff0">
<center>
<table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" height=3D"100%"=
width=3D"100%" style=3D"background: #edeff0; color: #9ba6b0; font-family: =
Helvetica,sans-serif; font-size: 14px; height: 100% !important; margin: 0; =
padding: 0; width: 100% !important" bgcolor=3D"#edeff0">

...等等。

这种编码类型有以下限制:

Lines of Quoted-Printable encoded data must not be longer than 76 characters. To satisfy this requirement without altering the encoded text, soft line breaks may be added as desired. A soft line break consists of an "=" at the end of an encoded line...

这意味着原始内容最终可能看起来像:

...
2wtdG91WGhKTEVZVVpoWnZsamo4IiwidiI6MSwicCI6IntcInVcIjozMDA4Nzg2NixcInZcIjox=
LFwidXJsXCI6XCJodHRwOlxcXC9cXFwvdGVhbXRyZWVob3VzZS5jb21cXFwvXCIsXCJpZFwiOlw=
iN2VlMmFmYWZiNGYwNGY5MGE2Y2NjMGExZGQwODdiMWVcIixcInVybF9pZHNcIjpbXCJlMzdmNG=
JlNDQ5NzYyY2NjZDQ5MmZjNmUyZDgwMjFhMTUxODgyM2RkXCJdfSJ9">teamtreehouse.com</=
...

如果你有适当的编码集,对解释器来说没什么大不了的,但肉眼不那么漂亮和可理解。

但为什么要使用 quoted-printable!?

继续我们的阅读,结果是一些 SMTP (Simple Mail Transfer Protocol)行限制为 1000 个字符。通过强制您的行不超过 76 个字符(第 76 个字符为 =),您就不会冒电子邮件因特定原因而失败的风险。 p>

你是怎么做到的!?

事实证明,PHP 有一个 native function ,就为了这个……

quoted_printable_encode(string);

^ 使用问题中的确切电子邮件代码对其进行了测试,并像宣传的那样工作!

做同样的事情(我知道,这可能很明显):

<?php 
$var = '... some huge, long string...';

$var2 = quoted_printable_encode($var);
?>

然后为了一个很好的视觉比较...

<html>
<body>

<?php

echo '<pre>' . htmlspecialchars($var) . '</pre>';

echo '<br><hr><br>';

echo '<pre>' . htmlspecialchars($var2) . '</pre>';

?>

</body>
</html>

注意:对于您的电子邮件(如问题),您只想对 Content-Transfer-Encoding: quoted-printable 声明之后的部分进行编码...

$message .= "Content-Type: text/html; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

$tmp = '<html>... long, formatted, beautiful...</html>';

$message .= quoted_printable_encode($tmp);

$message .= "\r\n\r\n--" . $boundary . "--";

加上一些毫无意义的废话,因为 StackOverflow 不喜欢少于 6 个字符的编辑!愚蠢且毫无意义的限制。表示无法更正简单的拼写错误。

关于PHP、HTML、电子邮件 - 电子邮件中的等号正在转换为不同的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38324093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com