这是我的代码:
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('example@gmail.com', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
此时我收到错误消息
AttributeError: 'str' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)
Python 3不再有解码,我是对的吗?我怎样才能解决这个问题?
另外,在:
data = conn.fetch('1', '(BODY[HEADER])')
Run Code Online (Sandbox Code Playgroud)
我只选择第一封电子邮件.我该如何选择全部?
我希望能够使用Python将GMail中的电子邮件从收件箱移动到另一个文件夹.我使用imaplib,无法弄清楚如何做到这一点.
我想从用户的收件箱中解析一些电子邮件,但是当我这样做时:
typ, msg_data = imap_conn.fetch(uid, '(RFC822)')
Run Code Online (Sandbox Code Playgroud)
它将电子邮件标记为SEEN或阅读.这不是所需的功能.你知道我怎么能把电子邮件保持在以前的凝视中看到或不看?
我想从IMAP4服务器获取整个消息.在python docs中,如果发现这段代码有效:
>>> t, data = M.fetch('1', '(RFC822)')
>>> body = data[0][1]
Run Code Online (Sandbox Code Playgroud)
我想知道我是否总能相信数据[0] [1]返回消息正文.当我运行'RFC822.SIZE'时,我只有一个字符串而不是一个元组.
我已经浏览了rfc1730,但我无法找出'RFC822'的正确响应结构.从imaplib文档中判断获取结果结构也很困难.
这是我在获取时获得的内容RFC822:
('OK', [('1 (RFC822 {858569}', 'body of the message', ')')])
Run Code Online (Sandbox Code Playgroud)
但当RFC822.SIZE我拿到我的时候:
('OK', ['1 (RFC822.SIZE 847403)'])
Run Code Online (Sandbox Code Playgroud)
我该如何正确处理数据[0]列表?我可以相信,当它是一个元组列表时,元组恰好有3个部分而第二部分是有效负载吗?
也许你知道imap4的更好的库?
我正在使用pythons imaplib连接到我的Gmail帐户.我想检索前15条消息(未读或读取,无关紧要)并仅显示主题和发件人姓名(或地址),但不知道如何显示收件箱的内容.
这是我到目前为止的代码(成功连接)
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('mygmail@gmail.com', 'somecrazypassword')
mail.list()
mail.select('inbox')
#need to add some stuff in here
mail.logout()
Run Code Online (Sandbox Code Playgroud)
我相信这应该很简单,我对imaplib库的命令还不够熟悉.任何帮助都必须得到赞赏......
更新 感谢Julian我可以遍历每条消息并检索整个内容:
typ, data = mail.search(None, 'ALL')
for num in data[0].split():
typ, data = mail.fetch(num, '(RFC822)')
print 'Message %s\n%s\n' % (num, data[0][1])
mail.close()
Run Code Online (Sandbox Code Playgroud)
但我只想要主题和发送者.是否有针对这些项目的imaplib命令,或者我是否必须解析文本的全部内容[0] [1]:主题和发件人?
更新 确定,让主题和发件人部分工作,但迭代(1,15)由desc命令完成,显然首先显示最旧的消息.我怎么能改变这个?我试过这样做:
for i in range( len(data[0])-15, len(data[0]) ):
print data
Run Code Online (Sandbox Code Playgroud)
但这只是给了我None所有15次迭代......任何想法?我也试过mail.sort('REVERSE DATE', 'UTF-8', 'ALL')但是gmail不支持.sort()函数
更新 找出一种方法:
#....^other code is the same as above except need to import email module …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Python imaplib来处理电子邮件文本.
我使用fetch命令从GMail服务器获取原始数据电子邮件.但是,我发现有一件事很棘手 - 等号'='.它不是正常的等号,而是一个特殊的符号.
例如:
'='有时用作文本行末尾的连字符标记:
Depending upon your module selections, course lecturers may also contact yo=
u with preparatory work over the next few weeks. It would be wise to start =
reviewing the preparatory reading lists provided on the module syllabi now =
Run Code Online (Sandbox Code Playgroud)有时,它充当类似'%'的转义标记,例如:
a=20b实际上实际上a<SPACE>b
=46rom here是From here
我对这种奇怪的符号感到困惑.我认为必须有一个指导来处理这个,因为GMail可以在他们的应用程序中正确处理这样的事情.
我发现这与HTML编码有关,就像'%'将被编码一样.但问题是,我从IMAP响应得到的只是一个包含这个'='符号的字符串.我该怎么处理?使用正则表达式?
这是较大项目的一小部分.我只需要获取未读电子邮件并解析其标题.如何修改以下脚本以仅获取未读电子邮件?
conn = imaplib.IMAP4_SSL(imap_server)
conn.login(imap_user, imap_password)
status, messages = conn.select('INBOX')
if status != "OK":
print "Incorrect mail box"
exit()
print messages
Run Code Online (Sandbox Code Playgroud) 我目前正在使用imaplib从服务器获取电子邮件并处理内容和附件.
我想回复带有状态/错误消息的消息,并链接到我的网站上生成的内容,如果可以处理的话.这应该包括原始邮件,但应删除任何附件(这将是大的),并最好用他们的文件名/大小替换它们.
由于我已经走过MIME消息部分,我假设我需要做的是构建一个包含原始消息副本的新MIME消息树并删除/替换附件节点.
在我开始走这条道路之前,我希望有人可以给我一些提示.有没有任何类型的库函数可以做到这一点?我应该坚持的任何标准行为?
我目前知道的/我使用的imaplib,smtplib和email模块和,但可能错过了一些东西在里面明显.这也在Django中运行,因此可以使用任何内容,django.core.email如果这样可以更容易.
更新:我的代码在python 2.6.5下工作但不是python 3(我使用的是3.4.1).
我无法在"所有邮件"或"已发邮件"文件夹中搜索邮件 - 我得到一个例外:
imaplib.error: SELECT command error: BAD [b'Could not parse command']
Run Code Online (Sandbox Code Playgroud)
我的代码:
import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("myemail@gmail.com","mypassword")
m.select("[Gmail]/All Mail")
Run Code Online (Sandbox Code Playgroud)
使用m.select("[Gmail]/Sent Mail")也不起作用.
但是从收件箱中读取有效:
import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("myemail@gmail.com","mypassword")
m.select("inbox")
...
Run Code Online (Sandbox Code Playgroud)
我使用mail.list()命令来验证文件夹名称是否正确:
b'(\\HasNoChildren) "/" "INBOX"',
b'(\\Noselect \\HasChildren) "/" "[Gmail]"',
b'(\\HasNoChildren \\All) "/" "[Gmail]/All Mail"',
b'(\\HasNoChildren \\Drafts) "/" "[Gmail]/Drafts"',
b'(\\HasNoChildren \\Important) "/" "[Gmail]/Important"',
b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Sent Mail"',
b'(\\HasNoChildren \\Junk) "/" "[Gmail]/Spam"',
b'(\\HasNoChildren \\Flagged) "/" "[Gmail]/Starred"',
b'(\\HasNoChildren \\Trash) "/" "[Gmail]/Trash"'
Run Code Online (Sandbox Code Playgroud)
我正在关注这些问题的解决方案,但它们对我不起作用:
imaplib …
我正在尝试使用imaplib连接到我的gmail帐户:
import imaplib
mail = imaplib.IMAP4_SSH('imap.gmail.com')
mail.login('myemail@gmail.com', 'mypassword')
mail.select("inbox")
# returns ('OK', [b'12009'])
Run Code Online (Sandbox Code Playgroud)
然而,这一切似乎都很好用:
mail.search(None, "ALL")
# returns error: command: SEARCH => got more than 10000 bytes
mail.logout()
# returns ('NO',
# ["<class 'imaplib.IMAP4.error'>: command: LOGOUT => got more than 10000 bytes"])
Run Code Online (Sandbox Code Playgroud)
我正在尝试访问的帐户在收件箱中有大约9,000封电子邮件.我尝试了上面的另一个帐户,其中少于1,000,代码工作正常.
第一个电子邮件帐户的问题是否与其中的邮件数量相关?是否有一些默认设置实现了一些大小限制?
如何绕过错误并阅读我的电子邮件?
imaplib ×10
python ×10
gmail ×5
email ×2
imap ×2
python-3.x ×2
django ×1
gmail-imap ×1
html ×1
mime ×1