脚本宝典收集整理的这篇文章主要介绍了PHP,HTML,电子邮件 – 等号登录电子邮件正在转换为不同的字符,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
设置……
代码块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版本是后一版本,删除了所有标记并以纯文本形式显示.仍然提供了错误的网址.
但是,经过仔细检查,电子邮件客户端(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转换为……)?
我检查了ASCII tables和HTML Codes.在任何一种情况下,与73相关的唯一事情是大写字母“i”.
编辑1
难道你不知道我在发布这个问题之后立即偶然发现This HTML URL Encoding Reference.
在那里,你会发现s与s有关.
但是,我仍然不太确定= 73 …正在变成……然后是……当然这似乎与utf-8有关.
编辑2 – 解决方案!!
解决方案和解释时间过长,因此将其作为答案发布.
解决方法:
问题来自于这条线:
$message .= "Content-transfer-encoding: quoted-printable\r\n\r\n";
如果你想保留quoted-printable编码,有一种解决方法:
这条线……
http://someurl.com/.../.../?a=3D73jbzUN90j27ME5N6W4jh24o992V91m3R632Hlu0&b=3Davr1owgJAAB3h4l1brw
…本来可以正常工作(请注意= 3D).
但这还不够!
如果您打算使用quoted-printable,则需要将每个等号设置为= 3D.这包括你的标题,样式,脚本和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">
… 等等.
此编码类型具有以下限制:
这意味着原始内容最终可能看起来像:
...
2wtdG91WGhKTEVZVVpoWnZsamo4IiwidiI6MSwicCI6IntcInVcIjozMDA4Nzg2NixcInZcIjox=
LFwidXJsXCI6XCJodHRwOlxcXC9cXFwvdGVhbXRyZWVob3VzZS5jb21cXFwvXCIsXCJpZFwiOlw=
iN2VlMmFmYWZiNGYwNGY5MGE2Y2NjMGExZGQwODdiMWVcIixcInVybF9pZHNcIjpbXCJlMzdmNG=
JlNDQ5NzYyY2NjZDQ5MmZjNmUyZDgwMjFhMTUxODgyM2RkXCJdfSJ9">teamtreehouse.com</=
...
对于翻译来说,如果你有合适的编码设置,但不那么漂亮,可以用肉眼理解,这对翻译来说并不是什么大问题.
但为什么使用引用 – 可打印!?
继续我们的阅读,结果是一些SMTP (Simple Mail Transfer Protocol)的行限制为1000个字符.通过强制您的行不会超过76个字符(第76个= =),您不会因为特定原因而冒电子邮件失败的风险.
你怎么做呢!?
事实证明,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 declaration …
$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 . "--";
加上一些无意义的guff,因为StackOverflow不喜欢编辑少于6个字符!愚蠢而且毫无意义的限制.意味着简单的拼写错误无法纠正.
以上是脚本宝典为你收集整理的PHP,HTML,电子邮件 – 等号登录电子邮件正在转换为不同的字符全部内容,希望文章能够帮你解决PHP,HTML,电子邮件 – 等号登录电子邮件正在转换为不同的字符所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。