首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何收听python 3中收到的电子邮件?

如何收听python 3中收到的电子邮件?
EN

Stack Overflow用户
提问于 2019-12-28 09:06:56
回答 2查看 9.6K关注 0票数 5

有了一个在python 3中运行并在特定gmail帐户上读取收到的电子邮件的应用程序的目标,人们将如何监听这些电子邮件的接收?

它应该做的是等到收件箱收到新邮件,从电子邮件中读取主题和正文,并从正文中获取文本(没有格式)。

到目前为止,我得到的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import imaplib
import email
import datetime
import time

mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
mail.login(user, password)
mail.list()
mail.select('inbox')

status, data = mail.search(None, 'ALL')
for num in data[0].split():
    status, data = mail.fetch(num, '(RFC822)')
    email_msg = data[0][1]
    email_msg = email.message_from_bytes(email_msg)
    maintype = email_msg.get_content_maintype()
    if maintype == 'multipart':
        for part in email_msg.get_payload():
            if part.get_content_maintype() == 'text':
                print(part.get_payload())
    elif maintype == 'text':
        print(email_msg.get_payload())

但是这有几个问题:当消息是多部分时,每个部分都被打印出来,有时最后一部分基本上是整个消息,但以html格式。

此外,这打印所有的邮件从收件箱,如何才能收听新的电子邮件与imaplib?或者其他图书馆。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-30 15:51:12

您是否查看过由git用户昵称发布的3_emailcheck.py脚本( 这里 )?这是一个python 2脚本,在Python3中,您需要首先使用电子邮件内容来解码字节。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
from itertools import chain
import email
import imaplib

imap_ssl_host = 'imap.gmail.com'  # imap.mail.yahoo.com
imap_ssl_port = 993
username = 'USERNAME or EMAIL ADDRESS'
password = 'PASSWORD'

# Restrict mail search. Be very specific.
# Machine should be very selective to receive messages.
criteria = {
    'FROM':    'PRIVILEGED EMAIL ADDRESS',
    'SUBJECT': 'SPECIAL SUBJECT LINE',
    'BODY':    'SECRET SIGNATURE',
}
uid_max = 0


def search_string(uid_max, criteria):
    c = list(map(lambda t: (t[0], '"'+str(t[1])+'"'), criteria.items())) + [('UID', '%d:*' % (uid_max+1))]
    return '(%s)' % ' '.join(chain(*c))
    # Produce search string in IMAP format:
    #   e.g. (FROM "me@gmail.com" SUBJECT "abcde" BODY "123456789" UID 9999:*)


def get_first_text_block(msg):
    type = msg.get_content_maintype()

    if type == 'multipart':
        for part in msg.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
    elif type == 'text':
        return msg.get_payload()


server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port)
server.login(username, password)
server.select('INBOX')

result, data = server.uid('search', None, search_string(uid_max, criteria))

uids = [int(s) for s in data[0].split()]
if uids:
    uid_max = max(uids)
    # Initialize `uid_max`. Any UID less than or equal to `uid_max` will be ignored subsequently.

server.logout()


# Keep checking messages ...
# I don't like using IDLE because Yahoo does not support it.
while 1:
    # Have to login/logout each time because that's the only way to get fresh results.

    server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port)
    server.login(username, password)
    server.select('INBOX')

    result, data = server.uid('search', None, search_string(uid_max, criteria))

    uids = [int(s) for s in data[0].split()]
    for uid in uids:
        # Have to check again because Gmail sometimes does not obey UID criterion.
        if uid > uid_max:
            result, data = server.uid('fetch', uid, '(RFC822)')  # fetch entire message
            msg = email.message_from_string(data[0][1])

            uid_max = uid

            text = get_first_text_block(msg)
            print 'New message :::::::::::::::::::::'
            print text

    server.logout()
time.sleep(1)
票数 4
EN

Stack Overflow用户

发布于 2019-12-30 18:08:06

我不确定同步的方式,但如果你不介意有一个异步循环和定义未读邮件作为你的目标,那么它可以工作。

(我没有实现IMAP轮询循环,只实现了电子邮件获取循环)

我的变化

  1. 将IMAP搜索筛选器从“所有”替换为“(未见)”,以获取未读邮件。
  2. 序列化策略从默认policy.Compat32更改为policy.SMTP。
  3. 使用email.message.walk()方法(新API)运行和过滤消息部分。
  4. 将旧的电子邮件API调用替换为医生们中描述的新调用, 并在这些例子上演示。

结果代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import imaplib, email, getpass
from email import policy

imap_host = 'imap.gmail.com'
imap_user = 'example@gmail.com'

# init imap connection
mail = imaplib.IMAP4_SSL(imap_host, 993)
rc, resp = mail.login(imap_user, getpass.getpass())

# select only unread messages from inbox
mail.select('Inbox')
status, data = mail.search(None, '(UNSEEN)')

# for each e-mail messages, print text content
for num in data[0].split():
    # get a single message and parse it by policy.SMTP (RFC compliant)
    status, data = mail.fetch(num, '(RFC822)')
    email_msg = data[0][1]
    email_msg = email.message_from_bytes(email_msg, policy=policy.SMTP)

    print("\n----- MESSAGE START -----\n")

    print("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\n" % ( \
        str(email_msg['From']), \
        str(email_msg['To']), \
        str(email_msg['Date']), \
        str(email_msg['Subject'] )))

    # print only message parts that contain text data
    for part in email_msg.walk():
        if part.get_content_type() == "text/plain":
            for line in part.get_content().splitlines():
                print(line)

    print("\n----- MESSAGE END -----\n")
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59513062

复制
相关文章
处理收到的电子邮件
本节介绍如何处理通过%Net.POP3检索到的电子邮件(%Net.MailMessage)。
用户7741497
2022/07/04
1.8K0
flutter - 如何在 dart/flutter 中收听流值
如果流不是广播流,则您只能收听一次。 请参阅此 Medium post 以了解有关 Streams 的更多信息。 收听 stream 时,您需要在 _assetsAudioPlayer.currentPosition 函数中添加您的代码。
徐建国
2021/08/30
1.1K0
如何用Python实现电子邮件的自动化
用Python自动化日常任务很容易。通过api和库的结合,您可以轻松地设置系统来抓取网站、发送电子邮件、管理数据和分析。
HuangWeiAI
2020/07/27
1.5K0
如何用Python实现电子邮件的自动化
如何使用 Python 验证电子邮件地址
在本文中,我将向大家展示如何使用名为 verify-email 的 Python 库构建你自己的电子邮件验证工具。
海拥
2023/02/27
2.7K0
如何使用 Python 验证电子邮件地址
如何通过邮件收到自己的RSS私人简报?如何通过邮件收到自己的RSS私人简报?
从 github.com/zhaoolee/garss.git 仓库, fork一份程序到自己的仓库
zhaoolee
2021/09/07
7600
python监听端口收到的信息(TCP)
转自:https://blog.csdn.net/huliang82/article/details/18322033/
py3study
2020/01/06
4K0
简单的电子邮件爬虫Python代码
import requests import re try: from urllib.parse import urljoin except ImportError: from url
代码伴一生
2021/11/01
5350
用 Python 发电子邮件
这两个库都是Python自带的,所以不需要额外的下载安装,此外,这次使用的Python版本为2.7。
Alan Lee
2019/05/26
1.6K0
简单的电子邮件爬虫Python代码
import requests import re try: from urllib.parse import urljoin except ImportError: from url
艳艳代码杂货店
2021/11/01
5610
python核心编程(电子邮件)
1、发送邮件模型: from smtplib import SMTP n = SMTP('smtp.yourdomain.com') ... n. quit() 2、SMTP类方法:
用户5760343
2022/05/14
1.3K0
python核心编程(电子邮件)
Python进阶-生成电子邮件
Python 的 email 包处理并管理整个电子邮件消息的 MIME 部分,使用 email 包和 smtplib 包。email 包有多个组件,分别用来解析和生成电子邮件。
小团子
2019/07/18
1.5K0
Python进阶-生成电子邮件
用Python发电子邮件
本文讲述如何使用Python的smtplib和email库发送电子邮件。首先介绍了SMTP协议,然后通过实例演示了如何创建并发送带有附件的邮件。最后总结了发送成功和失败的例子以及出现的问题。
Alan Lee
2018/01/02
1.7K0
用Python发电子邮件
收到告警后如何快速定位问题
上面两个错误是突然出现的,如果只看第一个错误,就可能以为是redisson的bug(https://github.com/redisson/redisson/issues/3273)。实际上是因为命令ZRANGEBYSCORE在大key上执行,耗时太长,引发其他请求也超时
十毛
2021/11/24
1.6K0
使用Python实现电子邮件群发功能
在某些应用中,可能会需要由管理员给所有用法群发电子邮件,或者类似的应用。本文代码使用Python详细模拟了这个过程。 import email from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.base import MIMEBase import smtplib sender =
Python小屋屋主
2018/04/16
2.2K0
python 使用zmail收发电子邮件
1、发送邮件: import zmail server = zmail.server('yourmail@example.com’, 'yourpassword')
用户5760343
2022/05/14
1.5K0
python 使用zmail收发电子邮件
python自动化之电子邮件
将电子邮件发送给适当的个人,首先要转换为PDF,然后再将此PD附加到电子邮件中,然后将所有电子邮件由python自动化发送。
用户2966292
2021/05/08
1.3K0
利用Python自动发送电子邮件
收发邮件几乎是每个人每天都需要做的一件事情,对于一些固定每天需要发送的邮件或者是同时需要发送好几十好几百份的时候,我们可以考虑借助Python来自动发送邮件。
张俊红
2019/03/06
1.4K0
利用Python自动发送电子邮件
python3 发送电子邮件
使用python3发送电子邮件,我之前在网上找了好几篇文章不论是都不行,最后在网上找到这篇文章了!
py3study
2020/01/03
8740
Python: 通过QQ邮箱发送电子邮件
文章背景:自学Python编程快速上手中关于发送电子邮件的章节。本文讲述如何通过Python,使用QQ邮箱发送电子邮件。
Exploring
2022/09/20
3.2K0
Python: 通过QQ邮箱发送电子邮件
点击加载更多

相似问题

如何使用NativeScript收听收到的短信?

20

如何收听电子邮件

10

Android穿戴:收听收到的通知

27

收听收到的分片短消息

12

如何收听黑莓的电子邮件活动

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文