python发送邮件接收邮件示例分享

yizhihongxing

Python发送邮件接收邮件完整攻略

一、发送邮件

1. 导入模块

首先,在代码中导入所需的模块:smtplibemail.mime.multipartemail.mime.textemail.mime.image。其中,smtplib模块提供SMTP邮件发送功能,email.mime.multipartemail.mime.textemail.mime.image模块则用于生成邮件内容。代码如下:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

2. 创建邮件

创建MIMEMultipart对象,用于表示邮件开头和邮件正文。代码如下:

msg = MIMEMultipart()

3. 添加邮件头

通过MIMEMultipart对象的['To']['From']['Subject']属性,分别添加邮件中的收件人、发件人和主题。代码如下:

# 邮件中的收件人
to_addr = 'recipient@example.com'
msg['To'] = to_addr

# 邮件中的发件人
from_addr = 'sender@example.com'
msg['From'] = from_addr

# 邮件主题
subject = 'This is a test'
msg['Subject'] = subject

4. 添加邮件正文

邮件正文可以是纯文本或HTML格式。使用MIMEText对象创建邮件正文,通过set_payload方法设置邮件正文的内容,同时指定邮件正文的字符集编码方式。如果要设置HTML格式的邮件正文,只需在字符集编码方式后添加html即可。代码如下:

# 邮件正文
body = 'This is a test email.'
msg.attach(MIMEText(body, 'plain', 'utf-8'))  # 纯文本格式

# html格式邮件正文
html_body = '''
<html>
  <head></head>
  <body>
    <p>This is a test email.</p>
    <p>Here is an image:</p>
    <img src="cid:image1">
  </body>
</html>
'''
msg.attach(MIMEText(html_body, 'html', 'utf-8'))  # HTML格式

5. 添加图片附件

如果要在邮件中添加图片附件,可通过MIMEImage对象创建图片附件,并将其添加到邮件中。这时,需要为图片附件指定一个Content-ID,以便在HTML格式的邮件正文中引用。代码如下:

# 添加图片附件到邮件中
with open('example.png', 'rb') as f:
    img = MIMEImage(f.read())
img.add_header('Content-ID', '<image1>')
msg.attach(img)

6. 添加文件附件

如果要在邮件中添加文件附件,可通过MIMEText对象的set_payload()方法设置文件附件的内容,并指定文件名称。代码如下:

# 添加文件附件到邮件中
with open('example.txt', 'r') as f:
    attachment = MIMEText(f.read())
    attachment.add_header('Content-Disposition', 'attachment', filename='example.txt')
    msg.attach(attachment)

7. 发送邮件

最后,使用smtplib模块中的SMTP类,创建SMTP连接,并调用sendmail方法发送邮件。发送邮件时需要指定SMTP服务器的地址和端口、发件人的登录用户名和密码。代码如下:

# 发件人登录邮箱和密码
username = 'sender@example.com'
password = '******'

# 创建SMTP连接
smtp_server = 'smtp.example.com'
smtp_port = 587
smtp_conn = smtplib.SMTP(smtp_server, smtp_port)

# 发送邮件
smtp_conn.starttls()  # 开启SSL加密
smtp_conn.login(username, password)  # 登录邮箱
smtp_conn.sendmail(from_addr, to_addr, msg.as_string())  # 发送邮件
smtp_conn.quit()  # 断开SMTP连接

二、接收邮件

1. 导入模块

首先,在代码中导入所需的模块:imaplibemail。其中,imaplib模块提供IMAP协议接收邮件功能,email模块则用于解析邮件内容。代码如下:

import imaplib
import email

2. 登录邮箱

使用imaplib模块中的IMAP4_SSL类,创建SSL加密的IMAP连接,并调用login方法登录收件人的邮箱。代码如下:

# 收件人登录邮箱和密码
username = 'recipient@example.com'
password = '******'

# 创建IMAP连接
imap_server = 'imap.example.com'
imap_port = 993
imap_conn = imaplib.IMAP4_SSL(imap_server, imap_port)

# 登录邮箱
imap_conn.login(username, password)

3. 选择邮箱

IMAP协议接收邮件时,需要先选择邮箱。使用imap_conn.select()方法选择收件箱。代码如下:

# 选择收件箱
imap_conn.select('INBOX')

4. 搜索邮件

使用imap_conn.search()方法搜索邮件。邮件搜索时可以根据多种条件进行筛选,例如:发件人、主题、关键字等等。下面的代码搜索所有未读邮件。代码如下:

# 搜索所有未读邮件
status, msgs = imap_conn.search(None, 'UNSEEN')

5. 解析邮件

使用email模块中的函数,解析邮件内容并获取所需信息。下面的代码解析第一封未读邮件的主题、发件人、收件人、日期、正文等信息。代码如下:

# 解析邮件
msg_ids = msgs[0].split()
for msg_id in msg_ids:
    status, msg_data = imap_conn.fetch(msg_id, '(RFC822)')
    email_msg = email.message_from_bytes(msg_data[0][1])

    subject = email_msg['Subject']
    from_addr = email_msg['From']
    to_addr = email_msg['To']
    date = email.utils.parsedate_to_datetime(email_msg['Date'])

    if email_msg.is_multipart():
        # 如果是多部分邮件,则获取正文和附件
        for part in email_msg.walk():
            content_type = part.get_content_type()
            content_disposition = str(part.get('Content-Disposition'))

            if content_type == 'text/plain' and 'attachment' not in content_disposition.lower():
                # 纯文本邮件
                body = part.get_payload(decode=True).decode('utf-8')
            elif content_type == 'text/html' and 'attachment' not in content_disposition.lower():
                # html格式邮件
                html_body = part.get_payload(decode=True).decode('utf-8')
            elif content_disposition.lower().startswith('attachment'):
                # 附件
                filename = part.get_filename()
                if filename:
                    with open(filename, 'wb') as f:
                        f.write(part.get_payload(decode=True))
    else:
        # 如果是单一部分邮件,直接解码
        body = email_msg.get_payload(decode=True).decode('utf-8')

6. 标记已读

成功获取邮件内容后,需要将该邮件标记为已读,避免重复解析。使用imap_conn.store()方法将邮件标记为已读。代码如下:

# 将邮件标记为已读
imap_conn.store(msg_id, '+FLAGS', '\SEEN')

7. 关闭连接

最后,使用imap_conn.logout()方法关闭IMAP连接。代码如下:

# 关闭IMAP连接
imap_conn.logout()

示例一:发送一封纯文本邮件

下面的代码演示如何创建并发送一封纯文本格式的邮件。代码如下:

import smtplib
from email.mime.text import MIMEText

# 创建邮件
msg = MIMEText('This is a test email.')

# 添加邮件头
msg['To'] = 'recipient@example.com'
msg['From'] = 'sender@example.com'
msg['Subject'] = 'This is a test'

# 发送邮件
smtp_server = 'smtp.example.com'
smtp_port = 587
smtp_conn = smtplib.SMTP(smtp_server, smtp_port)
smtp_conn.starttls()
smtp_conn.login('sender@example.com', '******')
smtp_conn.sendmail('sender@example.com', 'recipient@example.com', msg.as_string())
smtp_conn.quit()

示例二:接收最新一封邮件的主题和正文

下面的代码演示如何接收最新一封邮件的主题和正文。代码如下:

import imaplib
import email

# 登录邮箱
username = 'recipient@example.com'
password = '******'
imap_server = 'imap.example.com'
imap_port = 993
imap_conn = imaplib.IMAP4_SSL(imap_server, imap_port)
imap_conn.login(username, password)

# 选择收件箱
imap_conn.select('INBOX')

# 搜索未读邮件
status, msgs = imap_conn.search(None, 'UNSEEN')
msg_ids = msgs[0].split()
msg_id = msg_ids[-1]

# 解析邮件
status, msg_data = imap_conn.fetch(msg_id, '(RFC822)')
email_msg = email.message_from_bytes(msg_data[0][1])
subject = email_msg['Subject']
if email_msg.is_multipart():
    for part in email_msg.walk():
        content_type = part.get_content_type()
        content_disposition = str(part.get('Content-Disposition'))
        if content_type == 'text/plain' and 'attachment' not in content_disposition.lower():
            body = part.get_payload(decode=True).decode('utf-8')
        elif content_type == 'text/html' and 'attachment' not in content_disposition.lower():
            html_body = part.get_payload(decode=True).decode('utf-8')
else:
    body = email_msg.get_payload(decode=True).decode('utf-8')

# 将邮件标记为已读
imap_conn.store(msg_id, '+FLAGS', '\SEEN')

# 关闭连接
imap_conn.logout()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python发送邮件接收邮件示例分享 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 最新Pygame zero最全集合

    最新Pygame zero最全集合攻略 Pygame Zero是一款基于Python编程语言的2D游戏引擎,为开发者提供了一个简单易用的方式来创建小型的游戏项目。本文将介绍最新的Pygame zero集合,帮助您快速入门。 安装 Pygame Zero需要在Python环境下运行,因此请确保您已经安装了Python。使用pip命令来安装Pygame Zero…

    python 2023年5月14日
    00
  • Python群发邮件实例代码

    当我们需要向多个人发送相同内容的邮件时,手动逐一发送邮件显然是一件非常繁琐的事情。Python的smtplib和email库提供了一种便捷的方式来群发邮件,需要我们完成以下步骤: 1.准备收件人邮箱信息和邮件正文信息。 2.使用smtplib库连接邮件服务器,认证登录账号。 3.创建EmailMessage对象,设置邮件标题、发送者、正文等信息。 4.发送邮…

    python 2023年6月3日
    00
  • Python 高级库15 个让新手爱不释手(推荐)

    Python高级库15个让新手爱不释手(推荐) Python是一种功能强大的编程语言,拥有许多高级库,可以帮助我们快速开发各种应用程序。本文将介绍15个Python高级库,这些库可以让新手爱不释手。 1. NumPy NumPy是Python中的一个科学计算库,用于处理大型多维数组和矩阵。它提供了许多数学函数和操作,可以用于数据分析、机器学习和科学计算等领域…

    python 2023年5月15日
    00
  • PyTorch加载模型model.load_state_dict()问题及解决

    PyTorch是深度学习的一种常用框架,用于构建、训练和部署神经网络模型。在使用PyTorch时,我们有时需要加载已经训练好的模型。PyTorch提供了model.load_state_dict()方法来加载模型权重参数,但在实际使用中,可能会遇到一些问题,下面就进行详细讲解。 问题描述 在PyTorch中,我们通常使用model.state_dict()方…

    python 2023年6月3日
    00
  • Python内置数据类型详解

    下面是详细的Python内置数据类型攻略: Python内置数据类型详解 Python是一种动态的、面向对象的高级编程语言,具有简洁、易读性强等特点。在Python中,内置了许多数据类型,包括数字类型、字符串类型、列表类型、元组类型、集合类型、字典类型等。在这里,我们将对这些数据类型进行详细的讲解。 数字类型 Python中的数字类型包括整数类型和浮点数类型…

    python 2023年6月5日
    00
  • 如何从 Redis 中获取所有的 key 和 value?

    在 Redis 中,我们可以使用 keys() 方法获取所有的键,使用 get() 方法获取指定键的值。下面是如何从 Redis 中获取所有的键和值的完整使用攻略。 连接 Redis 数据库 在使用 Redis 库操作 Redis 数据库前,我们需要先连接 Redis 数据库。可以使用 Redis 库的 Redis() 方法来连接 Redis 数据库。下面是…

    python 2023年5月12日
    00
  • python字典如何获取最大和最小value对应的key

    首先,我们可以使用内置函数max()和min()来获取字典的最大值和最小值。但是,max()和min()在操作字典时只会比较字典中的key而不会比较对应的value。因此,我们需要利用Python的一些其他特性来找到最大或最小的value对应的key。 解决这个问题的一种典型方法是:将字典中的key和value反转,将原来的value作为新字典的key,原来…

    python 2023年5月13日
    00
  • 在python中以相同顺序shuffle两个list的方法

    在Python中,可以使用zip()函数和random.shuffle()函数来以相同顺序shuffle两个list。下面将详细讲解这两种方法,并给出两个示例说明。 方法一:使用zip()和random.shuffle()函数 步骤 使用zip()函数将两个list打包成一个元组列表。 使用random.shuffle()函数对打包后的元组列表进行随机排序。…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部