python imaplib获取gmail收件箱主题标题和发件人姓名
我正在使用 pythons imaplib 连接到我的 Gmail 帐户。我想检索前 15 条邮件(未读或已读,没关系)并仅显示主题和发件人姓名(或地址),但不知道如何显示收件箱的内容。
这是到目前为止我的代码(成功连接)
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected]', 'somecrazypassword')
mail.list()
mail.select('inbox')
#need to add some stuff in here
mail.logout()
我相信这应该足够简单,我只是对 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()
但我只想要主题和发件人。是否有针对这些项目的 imaplib 命令,或者我必须解析 data[0][1] 的全部内容以获取文本:主题和发件人?
更新 好的,主题和发件人部分正常工作,但迭代 (1, 15) 是按 desc 顺序完成的,显然首先向我显示最旧的消息。我怎样才能改变这个?我尝试这样做:
for i in range( len(data[0])-15, len(data[0]) ):
print data
但这只是给了我所有 15 次迭代的 None
...有什么想法吗?我也尝试过 mail.sort('REVERSE DATE', 'UTF-8', 'ALL')
但 gmail 不支持 .sort() 函数
UPDATE 找到了一种方法:
#....^other code is the same as above except need to import email module
mail.select('inbox')
typ, data = mail.search(None, 'ALL')
ids = data[0]
id_list = ids.split()
#get the most recent email id
latest_email_id = int( id_list[-1] )
#iterate through 15 messages in decending order starting with latest_email_id
#the '-1' dictates reverse looping order
for i in range( latest_email_id, latest_email_id-15, -1 ):
typ, data = mail.fetch( i, '(RFC822)' )
for response_part in data:
if isinstance(response_part, tuple):
msg = email.message_from_string(response_part[1])
varSubject = msg['subject']
varFrom = msg['from']
#remove the brackets around the sender email address
varFrom = varFrom.replace('<', '')
varFrom = varFrom.replace('>', '')
#add ellipsis (...) if subject length is greater than 35 characters
if len( varSubject ) > 35:
varSubject = varSubject[0:32] + '...'
print '[' + varFrom.split()[-1] + '] ' + varSubject
这给了我最新的 15 条消息主题和发件人地址,按要求的降序排列!感谢所有提供帮助的人!
I'm using pythons imaplib to connect to my gmail account. I want to retrieve the top 15 messages (unread or read, it doesn't matter) and display just the subjects and sender name (or address) but don't know how to display the contents of the inbox.
Here is my code so far (successful connection)
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected]', 'somecrazypassword')
mail.list()
mail.select('inbox')
#need to add some stuff in here
mail.logout()
I believe this should be simple enough, I'm just not familiar enough with the commands for the imaplib library. Any help would be must appreciated...
UPDATE
thanks to Julian I can iterate through each message and retrieve the entire contents with:
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()
but I'm wanting just the subject and the sender. Is there a imaplib command for these items or will I have to parse the entire contents of data[0][1] for the text: Subject, and Sender?
UPDATE
OK, got the subject and sender part working but the iteration (1, 15) is done by desc order apparently showing me the oldest messages first. How can I change this? I tried doing this:
for i in range( len(data[0])-15, len(data[0]) ):
print data
but that just gives me None
for all 15 iterations... any ideas? I've also tried mail.sort('REVERSE DATE', 'UTF-8', 'ALL')
but gmail doesnt support the .sort() function
UPDATE
Figured out a way to do it:
#....^other code is the same as above except need to import email module
mail.select('inbox')
typ, data = mail.search(None, 'ALL')
ids = data[0]
id_list = ids.split()
#get the most recent email id
latest_email_id = int( id_list[-1] )
#iterate through 15 messages in decending order starting with latest_email_id
#the '-1' dictates reverse looping order
for i in range( latest_email_id, latest_email_id-15, -1 ):
typ, data = mail.fetch( i, '(RFC822)' )
for response_part in data:
if isinstance(response_part, tuple):
msg = email.message_from_string(response_part[1])
varSubject = msg['subject']
varFrom = msg['from']
#remove the brackets around the sender email address
varFrom = varFrom.replace('<', '')
varFrom = varFrom.replace('>', '')
#add ellipsis (...) if subject length is greater than 35 characters
if len( varSubject ) > 35:
varSubject = varSubject[0:32] + '...'
print '[' + varFrom.split()[-1] + '] ' + varSubject
this gives me the most recent 15 message subject and sender address in decending order as requested! Thanks to all who helped!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这应该会让您了解如何检索主题以及从哪里检索主题?
This should give you an idea on how to retrieve the subject and from?
这是我从电子邮件中获取有用信息的解决方案:
This was my solution to get the useful bits of information from emails:
对于那些寻找如何检查邮件和解析标头的人,这就是我使用的:
For those looking for how to check mail and parse the headers, this is what I used:
我正在寻找一个现成的简单脚本来通过 IMAP 列出最后一个收件箱,而无需对所有邮件进行排序。这里的信息很有用,尽管 DIY 并遗漏了一些方面。首先,
IMAP4.select
返回消息计数。其次,主题标头解码并不简单。I was looking for a ready made simple script to list last inbox via IMAP without sorting through all messages. The information here is useful, though DIY and misses some aspects. First,
IMAP4.select
returns message count. Second, subject header decoding isn't straightforward.BODY
获取几乎所有内容并将消息标记为已读。BODY[]
仅获取这些部分。BODY.PEEK[]
获取相同的部件,但不标记消息已读。
可以是HEADER
或TEXT
或HEADER.FIELDS(<字段列表>)
或HEADER.FIELDS.NOT (<字段列表>)
这就是我使用的:
typ, data = connection.fetch(message_num_s, b'(BODY.PEEK[HEADER.FIELDS ( SUBJECT FROM)])')
`
您将其放入代码示例中:通过将对 'mail.fetch()' 的调用替换为
fetch_fields(mail, i, 'SUBJECT FROM')
或fetch_fields(mail, i, ('SUBJECT' 'FROM'))
BODY
gets almost everything and marks the message as read.BODY[<parts>]
gets just those parts.BODY.PEEK[<parts>]
gets the same parts, but doesn't mark the message read.<parts>
can beHEADER
orTEXT
orHEADER.FIELDS (<list of fields>)
orHEADER.FIELDS.NOT (<list of fields>)
This is what I use:
typ, data = connection.fetch(message_num_s, b'(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])')
`
You drop it into your code example: by replacing the call to 'mail.fetch()' with
fetch_fields(mail, i, 'SUBJECT FROM')
orfetch_fields(mail, i, ('SUBJECT' 'FROM'))
添加到上述所有答案。
这将为您提供电子邮件的发件人和主题名称。
Adding to all the above answers.
This will give you the email's from and subject name.