- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
(因为这是我的第一个 SO 问题,我只想说我希望它不是太特定于 Zend。据我所知这应该不是问题。虽然我可以将它发布在Zend 特定的论坛,我觉得我至少有可能在这里得到一个好的答案,特别是因为答案可能涉及超越 Zend Framework 的与 MIME 相关的问题。我基本上是想了解我是否在facing 应该被认为是 ZF 错误,或者如果我误解了某些东西或误用了它。)
我一直在使用 Zend_Mail 构建一条 MIME 消息,该消息通过电子邮件分发服务 SendGrid 发送。他们的平台允许您通过他们的 SMTP 服务器发送电子邮件,但在您使用特殊 header (X-SMTPAPI) 时提供附加功能,该 header 的值为专有参数的 JSON 编码字符串,可能会变得很长。
最终,我传递的 header 太长了(我认为 >1000 个字符),并且出现了错误。我很困惑,因为我知道在我将值传递给 Zend_Mail::addHeader() 之前它是通过 PHP 的 native wordwrap() 函数传递的,所以我认为行长度永远不会成为问题。
事实证明,addHeader() 非常有意地去除了换行符,并且没有通过注释的方式进行特别解释。
// In Zend_Mail::addHeader()
$value = $this->_filterOther($value);
// In Zend_Mail::_filterOther()
$rule = array("\r" => '',
"\n" => '',
"\t" => '',
);
return strtr($data, $rule);
好吧,一开始这似乎很合理——也许 ZF 想要完全控制格式和换行。 Zend_Mail::addHeader() 中调用的下一个方法是
$value = $this->_encodeHeader($value);
此方法对值进行编码(根据需要引用可打印或 base64)并将其分成适当长度的行,但仅如果它包含由 Zend_Mime 确定的“不可打印字符”::isPrintable($value).
查看那个方法,换行符 (\n) 确实被认为是不可打印的字符!因此,如果在之前的方法调用中没有将它们从字符串中剥离,那么长 header 将被编码为 QP 并分成 72 个字符的行,一切都会正常进行。事实上,我做了一个测试,在其中我注释掉了对 _filterOther() 的调用,并且长 header 被编码并且没有问题地通过。但是现在我只是粗心地攻击了 ZF,而没有真正理解我删除的行背后的目的,所以这不是一个长期的解决方案。
我的中期解决方案是扩展 Zend_Mail 并创建一个新方法 addHeaderForceEncode(),它总是对标题的值进行编码,因此总是将它分成短行。但我仍然不满意,因为我不明白为什么 _filterOther() 调用首先是必要的——也许我根本不应该解决它。
任何人都可以向我解释为什么存在这种剥离换行符的行为吗?如果标题不包含除换行符之外的任何“不可打印字符”,这似乎不可避免地会导致标题变得太长的情况。
我对这个主题做了很多不同的搜索,并查看了一些 ZF 错误报告,但没有看到有人谈论这个。令人惊讶的是,这似乎是一个非常晦涩的问题。仅供引用,我正在使用 ZF 1.11.11。
更新:如果有人想关注我打开的 ZF 问题,请看这里:Zend_Mail::addHeader() UNfolds long headers, then throws exception
最佳答案
您可能遇到了一些问题。每RFC 2821 , SMTP 中的文本行不能超过 1000 个字符:
text line
The maximum total length of a text line including the is 1000 characters (not counting the leading dot duplicated for transparency). This number may be increased by the use of SMTP Service Extensions.
标题不能包含换行符,所以这可能就是 Zend 去除它们的原因。对于长 header ,通常会插入一个换行符(SMTP 中的 CRLF)和一个制表符来“换行”它们。
摘自 RFC 822 :
Each header field can be viewed as a single, logical line of ASCII characters, comprising a field-name and a field-body. For convenience, the field-body portion of this conceptual entity can be split into a multiple-line representation; this is called "folding". The general rule is that wherever there may be linear-white-space (NOT simply LWSP-chars), a CRLF immediately followed by AT LEAST one LWSP-char may instead be inserted.
我会说 _encodeHeader()
函数应该查看行的长度,如果标题比某个神奇的值长,则执行“换行和制表”以使其跨越多行.
关于php - 不明白为什么 Zend_Mail::addHeader() 去掉换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719322/
实例如下: ? 1
我正在我的网络应用程序过滤器中运行,该过滤器从外部源接收有关用户的信息,无论他是否登录。这是我的过滤器: @Override public void doFilter( ServletRequest
我从 apache.org 下载了 HttpComponents 库,并将 httpclient-4.3.5.jar 添加到了 Eclipse 项目中的库中。现在我尝试向 HttpPost 添加 he
是否可以使用 Response.AddHeader 特别是我正在尝试使用它的“刷新”。 我需要它在重定向之前暂停,但运行代码的位置在代码隐藏的 ASCX 中。当我的代码隐藏中有以下内容时,它什么都不做
有没有人向 ExpandableListActivity 添加静态 header 。请帮忙,我想在 ExpandableListActivity 中创建一个标题。谢谢深海 最佳答案 只需膨胀所需的 V
(因为这是我的第一个 SO 问题,我只想说我希望它不是太特定于 Zend。据我所知这应该不是问题。虽然我可以将它发布在Zend 特定的论坛,我觉得我至少有可能在这里得到一个好的答案,特别是因为答案可能
在使用拦截器和身份验证器添加访问 token header 时,当服务器以 401 响应时,我的身份验证器被正确调用。 Authenticator 通过单独的网络调用更新访问 token 并将其设置在
我们使用 ASP.Net 4.0。在我们的代码中,我们经常使用 Response.AddHeader("x", "y") .这和 Response.AppendHeader("x", "y") 完全一
我正在学习 Java 数据结构类(class),目前正在学习单链表。在addHead方法中,为什么我们需要检查tail == null?当 true 时,为什么 tail = head? public
在 C# Web 应用程序中,我使用 Response.Redirect("HR.aspx")并且它的工作没有问题。但是,当我尝试使用 Response.AddHeader("Refresh", "3
- (FMWebDAVRequest*) createDirectory { if (!_endSelector) { _endSelector = @selector(requestDidC
使用 Apache HttpClient 版本时: org.apache.httpcomponents httpclient 4.5.6 setHeader 和 addHe
我在页面上有一个 asp.net 超链接,单击它会在新窗口中打开一个新页面: lnkPrint.NavigateUrl = blah blah; lnkPrint.Target = "_blank";
本文整理了Java中org.apache.tomcat.websocket.WsWebSocketContainer.addHeader()方法的一些代码示例,展示了WsWebSocketContai
我知道这是一个愚蠢的问题,但我不是这方面的专家。 我正在关注教程 http://www.joshuawinn.com/fix-html5-validator-error-bad-value-x-ua-
我正在我的经典 ASP 页面 (vb) 上放置一个自动重定向。我想从变量 (url2) 调用 url 而不是对其进行硬编码。只需要知道正确的语法是什么。这是我当前的代码: Response.AddHe
我有一些代码,如下所示: public class EGOChervonAPIMethods extends HttpServlet { public void doPost(HttpServ
在我注意到我的代码可能在以经典模式设置的服务器上运行之前,我一直在使用 Response.Header.Add()。在这种情况下,异常“此操作需要 IIS 集成管道模式”。被提出。 我切换到 Resp
我是 python 的新手,正在尝试做一些看似微不足道的事情:我想将 if-not-modified header 添加到传递时间的 http 请求中,现在减去 60 秒。我在 now() - 60
我可以使用 setHeader 来设置新的标题吗? 还是我需要先addHeader,然后使用setHeader方法? 最佳答案 文档说您可以使用 addHeader 方法将多个值添加到特定 heade
我是一名优秀的程序员,十分优秀!