首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python imaplib读取gmail

python imaplib读取gmail
EN

Stack Overflow用户
提问于 2012-02-22 06:06:21
回答 4查看 2K关注 0票数 3

我正在使用imaplib在我的python命令窗口中读取gmail消息。唯一的问题是,如果电子邮件带有换行符和回车。此外,文本的格式似乎不正确。它返回=2436.49,而不是$36.49。我该如何着手清理这篇文章呢?谢谢!

示例电子邮件内容:

代码语言:javascript
复制
r\nItem name: Scanner\r\nItem=23: 130585100869\r\nPurchase Date: Oct 7, 2011\r\nUnit Price: =2436.49 USD\r\nQty: 1\r\nAmount: =2436.49USD\r\nSubtotal: =2436.49 USD\r\nShipping and handling: =240.00 USD\r\nInsurance - not offered

代码:

代码语言:javascript
复制
import imaplib
import libgmail
import re
import email
from BeautifulSoup import BeautifulSoup

USER = 'email@gmail.com'
PASSWORD = 'password'

#connecting to the gmail imap server
imap_server = imaplib.IMAP4_SSL('imap.gmail.com', 993)
imap_server.login(USER, PASSWORD)
imap_server.select('Inbox')

typ, response = imap_server.search(None, '(SUBJECT "payment received")')

Data = []

for i in response[0].split():
    results, data = imap_server.fetch(i, "(RFC822)")
    Data.append(data)
    break

for i in Data:
    print i
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-22 06:13:40

\r\n问题

\r\n问题是由于您不打印字符串,而是打印字符串的内部表示引起的。试着这样来理解我的意思:

代码语言:javascript
复制
print ['test\n']
print 'test\n'

上面打印的i是一个字符串列表,所以第一个表示开始起作用。试试这个:

代码语言:javascript
复制
print(Data[0][0][1])

我是通过检查对象来确定这一点的--您应该阅读正在使用的库的文档,以了解该对象到底由什么组成,以便了解为什么这个字段特别表示消息。或者如何将Data对象转换为更...很可口。

编码问题

尝试:

代码语言:javascript
复制
import quopri
print quopri.decodestring(Data[0][0][1])
票数 3
EN

Stack Overflow用户

发布于 2012-02-16 02:11:46

数据是带引号的可打印编码,这是一个小小的数据消息器,它应该能让你得到你想要的:

代码语言:javascript
复制
text = '''\r\nPurchase Date: Oct 7, 2011\r\nUnit Price: =2436.49 USD\r\nQty: 1\r\nAmount: =2436.49 USD\r\nSubtotal: =2436.49 USD\r\nShipping and handling: =240.00 USD\r\nInsurance - not offered : ----\r\n----------------------------------------------------------------------\r\nTax: --\r\nTotal: =2436.49 USD\r\nPayment: =2436.49 USD\r\nPayment sent to: emailaddress=40gmail.com\r\n----------------------------------------------------------------------\r\n\r\nSincerely,\r\nPayPal\r\n=20\r\n----------------------------------------------------------------------\r\nHelp Center:=20\r\nhttps://www.paypal.com/us/cgi-bin/helpweb?cmd=3D_help\r\nSecurity Center:=20\r\nhttps://www.paypal.com/us/security\r\n\r\nThis email was sent by an automated system, so if you reply, nobody will =\r\nsee it. To get in touch with us, log in to your account and click =\r\n=22Contact Us=22 at the bottom of any page.\r\n\r\n'''

raw_data = text.decode("quopri") #replace =XX for the real characters

data = [map(str.strip, l.split(":")) for l in raw_data.splitlines() if ": " in l]

print data
# [['Purchase Date', 'Oct 7, 2011'], ['Unit Price', '$36.49 USD'], ['Qty', '1'], ['Amount', '$36.49 USD'], ['Subtotal', '$36.49 USD'], ['Shipping and handling', '$0.00 USD'], ['Insurance - not offered', '----'], ['Tax', '--'], ['Total', '$36.49 USD'], ['Payment', '$36.49 USD'], ['Payment sent to', 'emailaddress@gmail.com'], ['Help Center', ''], ['Security Center', '']]

这样你就有了更容易处理的数据格式,我希望它能有所帮助。

编辑:让它更可爱:

代码语言:javascript
复制
>>> cooked = dict(data)
>>> print cooked["Unit Price"]
$36.49 USD
票数 6
EN

Stack Overflow用户

发布于 2012-02-16 01:55:07

如果这些实际上是电子邮件,您可以使用email module开始。您可以使用它来执行正确的带引号的可打印解码,并获得一些干净的文本。

不过,在此之后,您将需要编写自己的代码来提取所需的部分。这不是解析器存在的标准格式。我会使用正则表达式。

注意,\r\n很可能只是回车符后跟换行符,而不是“斜杠,r,斜杠,n”。在交互式终端中,Python将以符号形式表示控制字符和空白字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9385979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档