使用 Python 和 imaplib 处理编码消息

soc*_*dtk 3 python imaplib

在过去的几天里,我一直在编写一个脚本来解析自动生成的帮助台票证并将其内容存储到数据库中。在测试时,我遇到了几封电子邮件,这些电子邮件似乎已被编码并导致脚本失败。下面是其中一个 RFC822 的示例:

"[(b'9255 (RFC822 {12558}', b'发送至: XXXXXXXXX\r\n已接收: 通过 10.220.77.132,SMTP ID g4csp176213vck;\r\n 2014 年 7 月 28 日星期一 09:37:05 -0700 (PDT)\r\nX-已接收:于 10.67.30.130 接收,SMTP ID ke2mr39896936pad.44.1406565425185;\r\n 2014 年 7 月 28 日星期一 09:37:05 -0700 (PDT)\r\n返回路径: \r\ n已接收:来自 XXXXXXXXX (XXXXXXXXX [74.125.149.112])\r\n,由 XXXXXXXXX 发送,SMTP ID 为 yh3si18379315pab.170.2014.07.28.09.37.04\r\n ;\r\n 2014 年 7 月 28 日星期一 09:37:04 -0700 (PDT)\r\n已接收 SPF: 无(XXXXXXXXX: XXXXXXXXX 未指定允许的发件人主机) client-ip=74.125.149.141;\r\n身份验证结果: XXXXXXXXX;\r\n spf=中性 (XXXXXXXXX : XXXXXXXXX 未指定允许的发件人主机) v\r\n已接收:由 XXXXXXXXX ([74.125.148.10]) 使用 SMTP 从 XXXXXXXXX ([74.125.149.141]) 发送;\r\n\tMon, 28 Jul 2014 16:37: 04 GMT\r\n已接收:由 XXXXXXXXX ([74.125.148.12]) 与 SXXXXXXXXX 从 XXXXXXXXX ([209.85.213.178])(使用 TLSv1)发送;2014 年 7 月 28 日星期一 09:37:04 PDT\r\n已接收:由 XXXXXXXXX SMTP ID uq10sf3897971igb.11\r\n 为 ; 2014 年 7 月 28 日星期一 09:37:03 -0700 (PDT)\r\nX-Google-DKIM-签名:v=1;a=rsa-sha256;c=放松/放松;\r\nd=1e100.net; s=20130820;\r\nh=x-gm-message-state:mime-version:from:to:date:subject:message-id\r\n :x-original-sender:x-original-authentication-results :优先级\r\n :邮件列表:列表id:列表帖子:列表帮助:列表存档\r\n :列表取消订阅:内容类型:内容传输编码;\r\n bh =H+FlcmWQAFURCHnDFK/bNHUOvofUAPB8bcDYlBceyxE=;\r\nb=LoR8D1MK8eoDG9DLkP9gkfR82+EGUIEeOTLpqymqxyx9HJl0C9BW6iwPD7OgrJFbV4\r\n xWYumML6RCinpcZc4d6VCDSw+akXLdhiol +lbWJBZWvgN4BQPgHJwCF6EaHYf3h8j4tq\r\n /KAZIkXowz4/WKW8STri4BVjlA2a4LPwV/wazP+I9Kvr1yz433ymd+iCY1V0NexTI+cb\r\n 9m3IyL8sqB0+Efyu+XQrR2y7ZdX DPwdzGS /WNHJBtKga5xPDtPga+21pozVMCbuCc/cj\r\n Cx9me6cVo19PrNKIOtSimDZ1u6ELdpVr4iprYQSaT8arYYiCPHJE34OFPlqspTxjm1eI\r\n ngyg==\r\nX-Gm-消息状态:ALoCoQkb908wRLWedDE+ CtRzjD6VwC6Nja6duttyoVAdf+TFFn+uCxFB0Kwd5jk411YWdMD2G6HuFeRj2y3q7EzTe/vTvPLfymDIkHwZQa1r1zQ8I1B254t6v01ourR8InF/41aPGnnD\r\nX-收到:10.42 之前。 48.74,SMTP ID r10mr26049776icf.18.1406565423564;\r\n 2014 年 7 月 28 日星期一 09:37:03 -0700 (PDT)\r\nX-已接收:由 10.42.48.74 接收,SMTP ID r10mr26049775icf.18.1 406565423537;\r\n 星期一, 2014 年 7 月 28 日 09:37:03 -0700 (PDT)\r\nX-BeenThere: XXXXXXXXX\r\n已接收: 于 10.50.153.15 发送,SMTP ID vc15ls1961411igb.42.gmail;2014 年 7 月 28 日星期一\r\n 09:37:03 -0700 (PDT)\r\nX-已接收:于 10.66.254.37 发送,SMTP ID af5mr39703901pad.113.1406565423331;\r\n 2014 年 7 月 28 日星期一 09:37: 03 -0700 (PDT)\r\n已接收: XXXXXXXXX (XXXXXXXXX [74.125.149.158])\r\n,由 XXXXXXXXX 发送,SMTP ID da9si9190520pdb.425.2014.07.28.09.37.02\r\n ;\r\n 周一,2014 年 7 月 28 日 09:37:03 -0700 (PDT)\r\n已收到 SPF:无(XXXXXXXXX:XXXXXXXXX 未指定允许的发件人主机) client-ip=207.211.31.47;\r\n已接收:由 XXXXXXXXX ([74.125.148.10]) 使用 SMTP 从 XXXXXXXXX ([207.211.31.47]) 发送;\r\n\tMon, 28 2014 年 7 月 16:37:02 GMT\r\n收到:来自 XXXXXXXXX (XXXXXXXXX\r\n [129.135.112.43])(使用 TLS),作者:XXXXXXXXX;2014 年 7 月 28 日星期一\r\n 12:37:01 -0400\r\n已收到: XXXXXXXXX\r\n (129.135.112.45) 从 XXXXXXXXX (129.135.128.210) 发送,Microsoft SMTP 服务器 ID 14.3.181.6;2014 年 7 月 28 日星期一\r\n 11:36:58 -0500\r\n收到:来自 ITSDC50 ([127.0.0.1]),由 XXXXXXXXX 与 Microsoft\r\n SMTPSVC(6.0.3790.4675);\t 星期一,28 2014 年 7 月 11:36:58 -0500\r\nMIME 版本:1.0\r\n发件人:\r\n收件人:\r\n日期:2014 年 7 月 28 日星期一 11:36:58 -0500\r\n主题:调度IT/关怀案例:SC-118656-7031\r\n消息 ID:\r\nX-OriginalArrivalTime:2014 年 7 月 28 日 16:36:58.0498 (UTC) FILETIME=[26792E20:01CFAA82]\r\nX-MC-Unique : 114072812370105901\r\nX-pstn 级别: (S:85.19264/99.90000 CV:99.9000 FC:95.5390 LC:95.5390 R:95.9108 P:95.9108 M:97.0282 C:98.6951 )\r\ nX-pstn-dkim: 0 已跳过:未启用\r\nX-pstn-设置:1 (0.1500:0.1500) cv gt6 gt5 gt4 gt3 gt2 gt1\r\nX-pstn-地址:来自 [1094/49]\r\nX-pstn-nxpr: disp=中性,envrcpt=XXXXXXXXX\r\nX-pstn-nxp:bodyHash=9500f76054cf97c2a0eec20f8940768958faf6c3,headerHash=eb9362a172738328a8b8a8ae406c42a63f5545f9,keyName=4,rcptHash =e0dd4695780dcb1818e78b482447ac976870bcbe,sourceip=207.211.31.47,版本=1\r\nX-原始发件人: XXXXXXXXX\r\nX-原始身份验证结果:XXXXXXXXX;spf=neutral\r\n (XXXXXXXXX: XXXXXXXXX 未指定允许的发件人\r\n 主机) smtp.mail=XXXXXXXXX\r\n优先级:列表\r\n邮件列表:列表 XXXXXXXXX 联系人 XXXXXXXXX\r\n列表 ID : \r\nX-Google-Group-Id: 511158325204\r\n列表-发布: , \r\n列表-帮助: , \r\n列表-存档: \r\n列表-取消订阅: ,\r\n \r \n内容类型:文本/纯文本;字符集=UTF-8\r\n内容传输编码:base64\r\nX-pstn-neptune:0/0/0.00/0\r\nX-pstn-级别:(S:65.87536/99.90000 CV:99.9000 FC :95.5390 LC:95.5390 R:95.9108 P:95.9108 M:97.0282 C:98.6951 )\r\nX-pstn-dkim: 0 已跳过:未启用\r\nX-pstn-settings: 5 (2.0000:0.0200) s cv fc lc gt6 gt5 gt4 GT3 gt2 gt1 ft lt rpmc \r\nX-pstn-地址:来自 [db-null] \r\nX-pstn-nxpr:disp=neutral,envrcpt=XXXXXXXXX\r\nX-pstn-nxp :bodyHash = 45f4f2e59005199791055b3d1f937e1d3fb7d7ca,headerHash = ca981838d5783da04d9d38e3fffc3f5907100fcf,keyName = 4,rcptHash = 4f3dee680a09495dc5b095849a42 25f49c4a45f4,源IP = 74.125.149.141,

电子邮件正文是否经过编码?如果是这样,我应该如何处理解码?

Jon*_*fer 5

您可以使用该email包来实现此目的。那里有一个列表,列表的第一项是一个元组,其中第二个元素是整个电子邮件。让\xe2\x80\x99s 说你有一个名为 的变量中的 bytes 对象msg_bytes。然后您可以使用以下方法解析消息:

\n\n
import email.parser\nmsg = email.parser.BytesParser().parsebytes(msg_bytes)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以访问消息的不同部分(请参阅 中的文档email.message.Message):

\n\n
# get a bytes object containing the base64-decoded message\ntextbytes = msg.get_payload(decode=True)\n\n# get the content charset\ncontent_charset = msg.get_content_charset()\n\n# decode the text to obtain a string object\ntext = textbytes.decode(content_charset)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将能够处理大多数(如果不是全部)有效电子邮件。

\n