我通过IMAP从Gmail中的电子邮件中获取messageid.
这段代码:
messageid = m.fetch(num, '(BODY[HEADER.FIELDS (MESSAGE-ID)])')
print messageid
Run Code Online (Sandbox Code Playgroud)
返回:
[('1 (BODY[HEADER.FIELDS (MESSAGE-ID)] {78}', 'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n'), ')']
Run Code Online (Sandbox Code Playgroud)
我将如何解析实际的消息ID?
我正在使用imaplib进行python,我遇到了一个奇怪的行为.我真的不知道这是一个imap ou imaplib问题/功能,所以我希望有人能给我一些灯光.
在我的项目中,我在我的Gmail邮箱上进行了几次搜索.想象一下,我使用以下标准进行imap搜索:
((自"日期A"起)(在"日期B"之前))
现在,如果我从"日期A"开始收到电子邮件,则imap(lib)会执行预期的操作:返回"日期A"之后和"数据B"之前的电子邮件.可爱.但是,如果我从"日期A"开始没有电子邮件,imap(lib)就会忽略它并在"日期B"之前返回所有电子邮件,即使它们不是"数据A"!
这是imap的预期行为吗?我真的不这么认为,根本没有意义.
我真的需要能够搜索任何给定的时间段,而且我在每次搜索之前都不必将盒子集中在一起以了解最后一封电子邮件的日期.
任何的想法?我在这里错过了什么吗?
我正在开发一个项目,需要识别真人发送的电子邮件,而不是批量邮件、通知和时事通讯。有什么明确的方法可以做到这一点吗?电子邮件标题中是否有任何可以提供帮助的信息。我正在 Gmail IMAP 上工作,因此我已经有非垃圾邮件。
感谢这方面的任何帮助。谢谢!
我正在使用外部库IMAPClient.登录失败时,我看到此错误:imaplib.error: [AUTHENTICATIONFAILED] Authentication failed.
当我尝试except imaplib.error:我得到:AttributeError: 'module' object has no attribute 'error'
imaplib的文档说异常应该是IMAP4.error那么为什么IMAPClient会提升imaplib.error,我该如何捕获呢?
目标是使用imaplib删除大量电子邮件.电子邮件文件夹每月收到大约300,000条新邮件.只应删除超过1个月的邮件.如果执行此脚本,它将删除旧消息,但删除需要花费大量时间,而且迭代操作简单无效.这需要几个小时.通过尝试通过多处理来提高速度会产生错误.
你有什么建议可以提高删除大量邮件的速度?
import sys
import datetime
from imaplib import IMAP4
# get the date a month from the current
monthbefore = (datetime.date.today() - datetime.timedelta(365/12)).strftime("%d-%b-%Y")
m = IMAP4('mail.domain.com')
m.login('user@domain.com', 'password')
# shows how many messages in selected folder
print m.select('Folder')
typ, data = m.select('Folder')
# find old messages
typ, data = m.search(None, '(BEFORE %s)' % (monthbefore))
# delete them
print "Will be removed:\t", data[0].split()[-1],"messages"
for num in data[0].split():
m.store(num, '+FLAGS', '\\Deleted')
sys.stderr.write('\rRemoving message:\t %s' % num)
# now expunge marked for …Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我一直在编写一个脚本来解析自动生成的帮助台票证并将其内容存储到数据库中。在测试时,我遇到了几封电子邮件,这些电子邮件似乎已被编码并导致脚本失败。下面是其中一个 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已接收:由 …
我正在将消息从 IMAP 下载imaplib到 mbox(带mailbox模块)中:
import imaplib, mailbox
svr = imaplib.IMAP4_SSL('imap.gmail.com')
svr.login('myname@gmail.com', 'mypaswword')
resp, [countstr] = svr.select("[Gmail]/All Mail", True)
mbox = mailbox.mbox('mails.mbox')
for n in range(...):
resp, lst1 = svr.fetch(n, 'UID') # the UID of the message
resp, lst2 = svr.fetch(n, '(RFC822)') # the message itself
mbox.add(lst2[0][1]) # add the downloaded message to the mbox
#
# how to store the UID of this current mail inside mbox?
#
Run Code Online (Sandbox Code Playgroud)
让我们下载 UID = 的邮件1 .. 1000。下次,我想从第 …
在获取所有“未读”消息,然后遍历它们并获取它们之后,我试图在一条消息上操纵IMAP标志以将其标记为未读。
我不太确定如何在单个消息的基础上将消息标记为未读/看不见。我得到的只是消息编号,而且我不确定如何正确存储UID以仅影响单个消息。
相似问题中的答案似乎无效,因为它将错误消息设置为“未读”。如何设置再次被提取为“未读” 的单个邮件?
我被要求提供更多信息。在这里删除“秘密”的细节时,这是我尝试实现的现有运行时,因此它将尝试根据代码规则处理消息,并存储消息号等,并尝试将消息的ID和主题存储在pickle文件中后,将每条消息设置为“未读”,因为在运行过程中“看到”的所有内容都会在服务器上自动标记为“已读”,而不会设置为“未读”状态:
def main():
conn = imaplib.IMAP4('SERVER')
conn.login('username', 'passphrase')
conn.select('inbox')
(status, nums) = conn.search(None, '(UNSEEN)')
msgnums = map(int, nums[0].split())
for i in msgnums:
try:
raw_msg = conn.fetch(i, '(RFC822)')
raw_msg = conn.fetch(i, '(RFC822)')
msg = email.message_from_string(raw_msg[1][0][1])
body = "Date: %s\r\nSender: %s\r\nSubject: %s\r\n\r\n" % (msg['Date'], msg['From'], msg['Subject'])
msg_date = re.sub('/', '-', msg['Date']).replace(":", ".")
fdate = re.sub('\s+', '_', msg_date).replace(",", "")
print "Checking message: %s" % msg['Subject']
if not msg['Subject']:
continue # fname = …Run Code Online (Sandbox Code Playgroud) 这是我的程序的相关部分:
import imaplib
...
try:
M.expunge()
M.close()
M.logout()
except imaplib.abort as e:
print("IMAP abort")
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
Traceback (most recent call last):
File "/home/xxx/anaconda3/lib/python3.6/imaplib.py", line 1014, in _command_complete
typ, data = self._get_tagged_response(tag)
File "/home/xxx/anaconda3/lib/python3.6/imaplib.py", line 1126, in _get_tagged_response
self._check_bye()
File "/home/xxx/anaconda3/lib/python3.6/imaplib.py", line 929, in _check_bye
raise self.abort(bye[-1].decode(self._encoding, 'replace'))
imaplib.abort: IMAP session state is inconsistent, please relogin.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mailstats/autoresponder.py", line 224, in <module>
M.close()
File "/home/xxx/anaconda3/lib/python3.6/imaplib.py", line 456, in …Run Code Online (Sandbox Code Playgroud) 我有这段代码可以检查最新的电子邮件,然后执行某些操作。是否可以编写一些内容来不断检查收件箱文件夹中是否有新邮件?尽管我希望它继续检查最新的新电子邮件。如果我尝试存储它已经通过了一次,它会变得太复杂吗?因此,它不会针对同一封电子邮件两次发出有关同一封电子邮件的警报。
代码:
import imaplib
import email
import Tkinter as tk
word = ["href=", "href", "<a href="] #list of strings to search for in email body
#connection to the email server
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('xxxx', 'xxxx')
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("Inbox", readonly=True) # connect to inbox.
result, data = mail.uid('search', None, "ALL") # search and return uids instead
ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated …Run Code Online (Sandbox Code Playgroud) imaplib ×10
python ×9
email ×3
imap ×3
email-spam ×1
exception ×1
gmail ×1
iteration ×1
mbox ×1
python-2.7 ×1