标签: imaplib

Python imaplib 选择文件夹

我正在使用 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

9
推荐指数
1
解决办法
1万
查看次数

Imaplib:如何从Gmail中删除电子邮件?

我正在尝试做一些简单的事情,比如使用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 email imaplib

8
推荐指数
1
解决办法
2695
查看次数

为什么回复我的SMTP发送的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 gmail imap imaplib

8
推荐指数
1
解决办法
1352
查看次数

使用Python中的imaplib在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 imaplib gmail-imap

8
推荐指数
1
解决办法
3950
查看次数

Imaplib中的EOF错误

我正在编写一个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所以我们的服务台登录并非全部公开. …

python eof imaplib

8
推荐指数
2
解决办法
1万
查看次数

使用 IMAP 读取 gmail 失败

我正在运行一个 cron 作业,它执行 python 脚本以读取 gmail(2 分钟间隔)。我使用 imaplib 来阅读新邮件。直到昨天,这一切都很好。突然它抛出低于错误

imaplib.error: [AUTHENTICATIONFAILED] 凭据无效(失败)

有时我收到以下错误

raise self.abort(bye[-1]) imaplib.abort: [UNAVAILABLE] 临时系统错误

当我在不同的机器上运行相同的脚本时。它的工作正常。我假设主机已被列入黑名单或类似的东西。

我有哪些选择?

我无法生成凭据(Gmail API),因为这是在公司域帐户下。

python authentication imaplib gmail-api

8
推荐指数
3
解决办法
2万
查看次数

Python/imaplib - 如何获取邮件标签?

我正在为我的项目使用imaplib,因为我需要访问gmails帐户.事实:使用gmail的标签,每条消息可能位于任意数量的文件夹/盒子/标签上.

问题是我想从每条消息中获取每个标签.

我想到的第一个解决方案是使用"All Mail"文件夹来获取所有消息,然后,对于每条消息,检查该消息是否在每个可用文件夹中.

但是,我发现这个解决方案很重,我想知道是否有更好的方法来做到这一点.

谢谢!

python gmail imaplib

7
推荐指数
1
解决办法
4389
查看次数

Python imaplib 搜索包含日期和时间的电子邮件

我正在尝试阅读特定日期和时间的所有电子邮件。

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)

无需时间即可正常工作。是否也可以用时间来搜索?

python imaplib python-2.7 python-3.x

7
推荐指数
2
解决办法
1万
查看次数

Python Message'对象没有属性'get_body

我正在尝试搜索电子邮件正文但面临一些问题:

 #!/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)

python imaplib

7
推荐指数
2
解决办法
7703
查看次数

实时收听传入的电子邮件

大多数IMAP电子邮件客户端都具有实时自动接收电子邮件的功能,而无需定期刷新。这是因为电子邮件客户端使与服务器的连接保持打开状态,并且如果没有交换任何电子邮件数据来保持连接有效,则电子邮件客户端将以NOOP固定的间隔发送数据包(就像其他TCP协议有自己的一样) keepalive数据包)。在Thunderbird中,此行为可以通过“在收到新邮件时允许立即服务器通知”选项来控制。

我正在编写一个Python程序,该程序需要立即知道何时收到电子邮件。接收电子邮件的标准过程是(在连接和登录后)select('inbox')search(None, 'ALL')(或某些特定的搜索词)和fetch()。我不知道如何实时收听新电子邮件。我读过的每本指南都建议循环运行search()and fetch()函数。我曾尝试read()在发送电子邮件时运行该功能,但从未见过read()输出任何数据。也许服务器需要知道将电子邮件推送到客户端?我无法证实或驳斥这一理论。

如何使用imaplib或类似的Python库立即接收新电子邮件?

虽然最初发布这个问题时我还不知道,但我正在寻找实现RFC2177中定义的IMAP IDLE命令的解决方案。

python imaplib

7
推荐指数
1
解决办法
301
查看次数