如何将DateTime结构转换为其等效的RFC 822日期时间格式的字符串表示形式,并将此字符串表示形式解析回.NET中的DateTime结构?RFC-822日期时间格式用于许多规范,例如RSS联合格式.
鉴于Python 2.6中的RFC822消息,我如何获得正确的文本/纯文本内容部分?基本上,我想要的算法是这样的:
message = email.message_from_string(raw_message)
if has_mime_part(message, "text/plain"):
mime_part = get_mime_part(message, "text/plain")
text_content = decode_mime_part(mime_part)
elif has_mime_part(message, "text/html"):
mime_part = get_mime_part(message, "text/html")
html = decode_mime_part(mime_part)
text_content = render_html_to_plaintext(html)
else:
# fallback
text_content = str(message)
return text_content
Run Code Online (Sandbox Code Playgroud)
这些事,我get_mime_part和has_mime_part拍下来,但我不太清楚如何从MIME部分解码的文本.我可以使用编码文本get_payload(),但如果我尝试使用方法的decode参数get_payload()(请参阅doc),当我在text/plain部分调用它时会出现错误:
Run Code Online (Sandbox Code Playgroud)File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ email/message.py", line 189, in get_payload raise TypeError('Expected list, got %s' % type(self._payload)) TypeError: Expected list, got <type 'str'>
另外,我不知道如何使用HTML并尽可能地将其呈现为文本.
在使用f12工具时,即,当我请求网页时,响应标头具有内容类型.这也可以称为MIME类型吗?或者有区别吗?
我知道如何以相反的方式做到这一点...它将是:
>>> dt.rfc822()
'Sun, 09 Mar 1997 13:45:00 -0500'
Run Code Online (Sandbox Code Playgroud) 我正在尝试为multipart/relatedC++/Qt 实现一个基本的MIME解析器.
到目前为止,我一直在为头文件编写一些基本的解析器代码,我正在阅读RFC以了解如何尽可能接近规范来完成所有操作.不幸的是,RFC中有一部分让我感到困惑:
来自RFC882第3.1.1节:
每个标题字段可以被视为ASCII字符的单个逻辑行,包括字段名称和字段主体.为方便起见,该概念实体的场体部分可以分成多线表示; 这被称为"折叠".一般规则是,只要存在线性白空间(不仅仅是LWSP-chars),就可以替换地插入紧接着一个LWSP-char的CRLF.因此,单行
好吧,所以我简单地解析一个头字段,如果一个CRLF跟随线性空格,我只是以有用的方式连接它们以产生一个标题行.我们继续......
来自RFC2045第5.1节:
在RFC 822的Augmented BNF表示法中,Content-Type头字段值定义如下:
Run Code Online (Sandbox Code Playgroud)content := "Content-Type" ":" type "/" subtype *(";" parameter) ; Matching of media type and subtype ; is ALWAYS case-insensitive.[...]
Run Code Online (Sandbox Code Playgroud)parameter := attribute "=" value attribute := token ; Matching of attributes ; is ALWAYS case-insensitive. value := token / quoted-string token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, or tspecials>
好的.所以,如果您想要指定Content-Type带参数的标头,只需这样做:
Content-Type: multipart/related; foo=bar; something=else
Run Code Online (Sandbox Code Playgroud)
...并且相同标题的折叠版本看起来像这样:
Content-Type: multipart/related;
foo=bar; …Run Code Online (Sandbox Code Playgroud) 信封与smtp中的电子邮件之间的确切区别是什么?
为什么协议需要信封?在蜗牛邮件中,信件不需要包含地址,邮递员看不到(至少这是您想要相信的),所以所有路由完全基于信封,这对我来说很清楚.
但是在电子邮件中,字母本身是可解析的,并且包含诸如From:和To:之类的标题.为什么这还不足以路由电子邮件?为什么我们需要一个信封?
信封和电子邮件本身之间的分歧是什么意思?这是否一定意味着有人试图对系统进行游戏,或者在某些情况下(在什么情况下?),它们之间存在差异是合法的.
您的澄清非常受欢迎.
困惑的电子邮件接收器.
我经常看到自动电子邮件后缀有一条消息
*请注意:此电子邮件是从无法接收传入电子邮件的地址发送的.如果您需要再次就此问题与我们联系,请使用上面的链接.
请不要回复这个信息; 它是从一个不受监控的电子邮件地址发送的.此消息是与您使用Twitter相关的服务电子邮件.
需要帮忙?访问Google Checkout帮助中心.请不要回复这个信息.
直接在此警告下方,Gmail会向我显示回复输入字段.在我看来,应该有一些标题可以附加到这样的自动电子邮件,告诉收件人的电子邮件客户端不允许回复.
有这样的标题吗?如果没有,控制电子邮件格式的团体是否曾经讨论过它?
我有一个JS日期,由Dojo转换为RFC822格式.函数调用--dojo.date.toRfc3339(jsDate)生成以下日期 - 2007-02-26T20:15:00 + 02:00.
我有一个应用程序使用Java日期SimpleDateFormat来解析上面生成的日期.由于时区,我在解析此日期格式时遇到问题.我试图使用
YYYY-MM-DD'T'hh:MM:SSZ
这失败了,因为时区的'Z'不期望':'字符.有谁知道如何指定一个模式来处理带有':'的RFC822日期?
修订:
感谢您正确解释我想要做的事情:)我想说的是日期是在RFC3339中生成的,我需要RFC822.看起来我将不得不重写JavaScript.我希望我不必这样做,并且可以指定日期格式模式而不必修改任何Java代码,因为日期格式只是注入到应用程序的Spring bean中.
只是为了完整性,有没有办法在日期格式表达式中指定忽略序列中的字符(不进行字符串操作/替换)?在这种情况下,我会说忽略任何':'或者只是忽略所有时区?
我目前正在考虑在C#中序列化一个MailMessage对象,虽然网上有一些示例的变体,但它们会序列化为二进制,这种点错过了IMO点.
我的方法是,我想将MailMessage序列化为RFC2822 eml字符串,下面的代码就是我提出的.
public string SerializeEmail(MailMessageArgs e)
{
string rfc822eml = "";
Guid g = Guid.NewGuid();
lock (g.ToString())
{
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\tmpspool");
di.CreateSubdirectory(g.ToString());
string spoolDir = @"C:\tmpspool\" + g.ToString();
SmtpClient Client = new SmtpClient("localhost");
Client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
Client.PickupDirectoryLocation = spoolDir;
Client.Send(e.mailObj);
var files = from file in Directory.EnumerateFiles(spoolDir)
select file;
string serializedEml = files.First();
rfc822eml = File.ReadAllText(serializedEml);
File.Delete(serializedEml);
Directory.Delete(spoolDir);
}
return rfc822eml;
}
Run Code Online (Sandbox Code Playgroud)
它非常讨厌,但确实有效.理想情况下,我会创建一个新的SMTPClient并添加一个Serialize函数,该函数将自动返回rfc822字符串,而不会访问文件系统.
由于我似乎无法使用Visual Studio跟踪SMTPClient.Send函数,因此这种"理想"的处理方式有点棘手.
我已经通过在Peter Huber的POP3MimeClient和POP3MailClient类中添加一些小的更改来整理RFC消息的反序列化,这样我就可以将HDD上的文件或字符串反序列化为MailMessage.
对我唠叨的是,我真的应该能够使用流序列化MailMessaage并将流写入我选择的字符串 - 或 - 文件而不是绕过房子创建基于GUID的文件夹,如上面的代码所做的那样并将文件内容读回字符串...
关于如何使这更优雅的任何指示将非常感激.
谢谢.