我正在使用 Django 构建邮件客户端,并使用 imaplib 提取电子邮件。到目前为止,我可以在每个 imap 服务器中选择收件箱文件夹,因为它的名称是“收件箱”。但是在选择其他文件夹(如垃圾邮件、已发送和其他文件夹)时,我遇到了麻烦,因为它们的名称基于帐户语言。例如,我的帐户设置为俄语并列出如下邮件:
mail = imaplib.IMAP4_SSL(IMAP)
mail.login(USERNAME, PASSWORD)
for i in mail.list()[1]:
print(i)
Run Code Online (Sandbox Code Playgroud)
给我以下输出(utf-7):
b'(\\Inbox) "/" "INBOX"'
b'(\\Spam) "/" "&BCEEPwQwBDw-"'
b'(\\Sent) "/" "&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-"'
b'(\\Drafts) "/" "&BCcENQRABD0EPgQyBDgEOgQ4-"'
b'(\\Trash) "/" "&BBoEPgRABDcEOAQ9BDA-"'
Run Code Online (Sandbox Code Playgroud)
尽管帐户选择了语言,我如何选择文件夹?如果我使用:
mail.select("&BBoEPgRABDcEOAQ9BDA-")
Run Code Online (Sandbox Code Playgroud)
它有效,但我的邮件客户端像这样没用。
我正在尝试做一些简单的事情,比如使用python的imaplib将电子邮件从收件箱移动到垃圾箱.但是,我遇到了一些问题,我不知道如何解决它们.
连接并登录到服务器后,我选择INBOX邮箱,我这样得到ID列表:
typ, ids = imap_object.search(None, 'INBOX')
ids_list = ids[0].split()
Run Code Online (Sandbox Code Playgroud)
让我们假设我从那里拿一个Id,X,让我们假设那封电子邮件是对话的一部分.当我做
imap_object.fetch (X, '(RFC822)')[1]
Run Code Online (Sandbox Code Playgroud)
正如我所料,我可以看到这个消息,但是当我这么做的时候
imap.store(X, '+FLAGS', r'(\Deleted)')
Run Code Online (Sandbox Code Playgroud)
它删除了所有的对话,而不仅仅是消息!另外,我不想完全删除电子邮件,我想将其发送到垃圾箱,所以我尝试过:
imap.copy(X, '[Gmail]/Papelera')
imap.store(X, '+FLAGS', r'(\Deleted)')
imap.expunge()
Run Code Online (Sandbox Code Playgroud)
但它只是将邮件复制到垃圾箱,然后删除整个会话,所以我丢失了电子邮件!
问题:如何使用imaplib从Gmail中删除电子邮件,而不删除整个会话?
我使用以下Python片段通过SMTP发送大量类似的电子邮件:
def send(from_, to, body):
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.ehlo()
server.login('michael@gmail.com', password)
msg = '''\
From: %s
To: %s
Subject: %s
%s''' % (from_, to.encode('utf-8'), "Hello", body.encode('utf-8'))
server.sendmail(from_, to, msg)
server.quit()
Run Code Online (Sandbox Code Playgroud)
这些消息是对话中的第一条消息.Strangley,对这些消息的回复没有被线程化到原始消息的对话上.
回复在我的收件箱中作为单独的邮件返回,主题="Re:Hello",与原始邮件无关.(很偶然一个将被适当螺纹的,这甚至怪异.)
我已经验证这些(非线程)回复有一个References:字段,该字段引用已发送邮件的Message-ID字段,该字段由GMail自动生成.
知道我做错了什么吗?
我想编写一个python模块,将数据发送到G-mail帐户中的草稿消息.大约两周前我写了一个脚本,完全使用imaplib.我的模块的简化示例如下.(我已为任何人测试此脚本创建了一个测试电子邮件地址.)
import imaplib
import time
conn = imaplib.IMAP4_SSL('imap.gmail.com', port = 993)
conn.login('testpythoncreatedraft@gmail.com', '123456aaa')
conn.select('[Gmail]/Drafts')
conn.append("[Gmail]/Drafts", '', imaplib.Time2Internaldate(time.time()), "TEST")
Run Code Online (Sandbox Code Playgroud)
它使用了.append函数,但今天当我运行模块时它会产生以下错误:
Traceback (most recent call last):
File "C:/Windows/System32/email_append_test.py", line 6, in <module>
conn.append("[Gmail]/Drafts", '', imaplib.Time2Internaldate(time.time()), "TEST")
File "C:\Python26\lib\imaplib.py", line 317, in append
return self._simple_command(name, mailbox, flags, date_time)
File "C:\Python26\lib\imaplib.py", line 1060, in _simple_command
return self._command_complete(name, self._command(name, *args))
File "C:\Python26\lib\imaplib.py", line 895, in _command_complete
raise self.error('%s command error: %s %s' % (name, typ, data))
imaplib.error: APPEND command error: BAD ['Invalid Command']
Run Code Online (Sandbox Code Playgroud)
正如我之前所说,这个模块以前工作过.它成功地在其正文中创建了带有字符串"Test"的草稿消息.由于此脚本曾经起作用,因此它似乎更可能与Google对G-mail帐户IMAP功能所做的更改有关,但错误似乎表明APPEND命令中存在错误.我已经在两台不同的计算机上测试了python脚本,看看我的库文件是否已损坏,但仍然存在相同的错误.
另外,我使用的是Python …
我正在编写一个python applet来监视我工作场所的电子邮箱的未读数量,当我尝试在applet闲置大约10分钟后尝试使用任何imaplib方法时遇到了EOF错误.一切正常,直到applet活着超过10分钟.
这是imaplib对象的相关代码.
conn = imaplib.IMAP4_SSL("imap.gmail.com", 993)
def loginIMAP (imapObj):
# Login to Helpdesk Google Apps Email account using encryption
imapObj.login(base64.b64decode("usrEncryption"), base64.b64decode("pwdEncrytion"))
return(getUnread(imapObj))
def closeIMAP (imapObj):
imapObj.logout()
def getUnread (imapObj):
# Check connection status OK
try:
uc0 = int(re.search("UNSEEN (\d+)", imapObj.status("INBOX", "(UNSEEN)")[1][0]).group(1))
uc1 = int(re.search("UNSEEN (\d+)", imapObj.status("A box 1", "(UNSEEN)")[1][0]).group(1))
uc2 = int(re.search("UNSEEN (\d+)", imapObj.status("A box 2", "(UNSEEN)")[1][0]).group(1))
except:
print "Shit's all disconnected n stuff"
loginIMAP(conn)
unreadCount = [(uc0-(uc1+uc2)),uc1,uc2]
if unreadCount[0] < 0:
unreadCount[0]=0
return unreadCount
Run Code Online (Sandbox Code Playgroud)
usrEncryption并且pwdEncryption只是我屏蔽了u/p所以我们的服务台登录并非全部公开. …
我正在运行一个 cron 作业,它执行 python 脚本以读取 gmail(2 分钟间隔)。我使用 imaplib 来阅读新邮件。直到昨天,这一切都很好。突然它抛出低于错误
imaplib.error: [AUTHENTICATIONFAILED] 凭据无效(失败)
有时我收到以下错误
raise self.abort(bye[-1]) imaplib.abort: [UNAVAILABLE] 临时系统错误
当我在不同的机器上运行相同的脚本时。它的工作正常。我假设主机已被列入黑名单或类似的东西。
我有哪些选择?
我无法生成凭据(Gmail API),因为这是在公司域帐户下。
我正在为我的项目使用imaplib,因为我需要访问gmails帐户.事实:使用gmail的标签,每条消息可能位于任意数量的文件夹/盒子/标签上.
问题是我想从每条消息中获取每个标签.
我想到的第一个解决方案是使用"All Mail"文件夹来获取所有消息,然后,对于每条消息,检查该消息是否在每个可用文件夹中.
但是,我发现这个解决方案很重,我想知道是否有更好的方法来做到这一点.
谢谢!
我正在尝试阅读特定日期和时间的所有电子邮件。
mail = imaplib.IMAP4_SSL(self.url, self.port)
mail.login(user, password)
mail.select(self.folder)
since = datetime.strftime(since, '%d-%b-%Y %H:%M:%S')
result, data = mail.uid('search', '(SINCE "'+since+'")', 'UNSEEN')
Run Code Online (Sandbox Code Playgroud)
无需时间即可正常工作。是否也可以用时间来搜索?
我正在尝试搜索电子邮件正文但面临一些问题:
#!/usr/local/bin/python3
from email.message import EmailMessage
import email
import imaplib
import re
import sys
import logging
import base64
import os
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
###########log in to mailbox########################
user = 'email@company.com'
pwd = 'pwd'
conn = imaplib.IMAP4_SSL("outlook.office365.com")
conn.login(user,pwd)
conn.select("test")
count = conn.select("test")
resp, items = conn.uid("search" ,None, '(OR (FROM "some@email) (FROM "some@email"))')
items = items[0].split()
for emailid in items:
resp, data = conn.uid("fetch",emailid, "(RFC822)")
if resp == 'OK':
email_body = data[0][1]#.decode('utf-8')
mail = email.message_from_bytes(email_body)
#get all emails with words "PA1" or "PA2" …Run Code Online (Sandbox Code Playgroud) 大多数IMAP电子邮件客户端都具有实时自动接收电子邮件的功能,而无需定期刷新。这是因为电子邮件客户端使与服务器的连接保持打开状态,并且如果没有交换任何电子邮件数据来保持连接有效,则电子邮件客户端将以NOOP固定的间隔发送数据包(就像其他TCP协议有自己的一样) keepalive数据包)。在Thunderbird中,此行为可以通过“在收到新邮件时允许立即服务器通知”选项来控制。
我正在编写一个Python程序,该程序需要立即知道何时收到电子邮件。接收电子邮件的标准过程是(在连接和登录后)select('inbox'),search(None, 'ALL')(或某些特定的搜索词)和fetch()。我不知道如何实时收听新电子邮件。我读过的每本指南都建议循环运行search()and fetch()函数。我曾尝试read()在发送电子邮件时运行该功能,但从未见过read()输出任何数据。也许服务器需要知道将电子邮件推送到客户端?我无法证实或驳斥这一理论。
如何使用imaplib或类似的Python库立即接收新电子邮件?
虽然最初发布这个问题时我还不知道,但我正在寻找实现RFC2177中定义的IMAP IDLE命令的解决方案。
imaplib ×10
python ×10
gmail ×2
email ×1
eof ×1
gmail-api ×1
gmail-imap ×1
imap ×1
python-2.7 ×1
python-3.x ×1