- 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/
我有一个名为 users 的表,其中包含列 firstname 和 lastname。 我正在努力研究如何构造 WHERE 子句以返回匹配的名字、姓氏、名字加空格和姓氏以及姓氏加逗号和名字的结果。例如
如何去掉@后面的单词?例如,如果字符串是 12 @ 8.97 MB 那么输出将变成 12 如何在 JavaScript 中执行此操作? 最佳答案 试试这个: var index = str.index
这是一个创建面包屑的函数。它最初来自其他人,但我对其进行了调整以满足我的需求。现在——我想修复“for(i in bits)”的错误语法,但是当我尝试了我认为可行的方法时,它不起作用。 for (i
这是我对 Vim 折叠的设置: hi Folded term=bold ctermfg=White 如何去掉下划线? 最佳答案 对于您未指定的属性,:hi 命令将保留前一个属性。所以如果你的color
我的程序正确输出了两个 data.frame 的结果秒 Browse[2]> Mismatch Num.Residue PDB.Residue Canonical.Residue 1
我正在为我的应用程序创建一个 NSTouchBar。当该栏显示时,我在左侧看到此 ESC 图标,在右侧看到这些其他图标: 有没有办法摆脱它们并让整个酒吧区域可用? 最佳答案 右侧的图标是“控制条”。
如何删除此文本 My First Heading My first paragraph. 看起来像 My First Heading My first paragraph. 使用
我有以下 javascript promise ,我正在循环遍历文档列表,将它们逐一上传到 Dropbox(API 调用),获取每个文档的共享链接,将它们保存在数组中,然后然后生成一封包含这些链接的电
我试图找到一个解决方案来避免 CKEditor,但旧的 FCKeditor 也去掉了任何标记从先前插入的内容到数据库。 案例: 我将 html 内容插入到数据库中,有些内容包含 元素。 我用 CKEd
这是我当前的 toString 方法 StringBuilder string = new StringBuilder(); for (int i = 0; i < knowledgeD.si
我在Java中的Hashmap中有一个键值对,我按以下方式遍历Map。 ArrayList mysection = new ArrayList(); ArrayList temp =
这个问题已经有答案了: Pandas Merging 101 (8 个回答) 已关闭 3 年前。 我想通过索引列合并两个数据帧。我的代码是: import pandas as pd import nu
我试图使用 facet_grid布置面板,例如, library(tidyverse) library(lubridate) economics %>% filter(date >= ymd(19
我有一个 C# 字符串对象,它包含一个泛型方法的代码,前面是一些标准的 C 风格多行注释。 我想我可以使用 System.Text.RegularExpressions 来删除评论 block ,但我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
我的 wrapper 中有空格,我无法摆脱它们。即使我将 paddings 设置为 0,仍然有空间。我不知道是什么问题。我不想将包装器放在 body 标签中,这样我以后可以更改我想要的内容。 我是 H
http://amz.com/New-Balance-WT910-Trail-Running/dp/B0098FOFCW/ref=zg_bsms_shoes_2 我不需要最后一个/ref=zg_bsm
我正在尝试将多名称列转换为 python 中的单名称列。现在,列名称如下所示: [('passengers', 'January'), ('passengers', 'February')
根据 Brownlees & Gallo 2006(如果您可能感兴趣),我正在尝试从报价数据系列中删除异常值。 代码运行良好,但考虑到我正在处理非常长的向量(最大的向量有 20m 的观察值,20 小时
我有一个 UITableView(恰好有一个 UISearchBar),但似乎无法弄清楚如何去掉它上方的白色/灰色边框。我需要在 UISearchBar 和它上面的黑色之间有无缝的黑色。 我已经尝试隐
我是一名优秀的程序员,十分优秀!