PHP,HTML,电子邮件 – 等号登录电子邮件正在转换为不同的字符

设置……

我通过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版本是后一版本,删除了所有标记并以纯文本形式显示.仍然提供了错误的网址.

但是,经过仔细检查,电子邮件客户端(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 tablesHTML 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";

根据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,则需要将每个等号设置为= 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">

… 等等.

此编码类型具有以下限制:

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</=
...

对于翻译来说,如果你有合适的编码设置,但不那么漂亮,可以用肉眼理解,这对翻译来说并不是什么大问题.

但为什么使用引用 – 可打印!?

继续我们的阅读,结果是一些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个字符!愚蠢而且毫无意义的限制.意味着简单的拼写错误无法纠正.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。