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

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日

相关文章

  • 在Python中利用pickle保存变量的实例

    保存变量在Python中非常简单,可以使用Pickle模块,它可以将任何Python对象序列化为字符串(字节流),也可以将其反序列化回原始对象。在这里,我们将讨论如何使用Pickle保存变量的实例。 要使用Pickle,您需要首先导入它。示例如下: import pickle 保存变量的实例 我们可以使用Pickle保存Python对象。通过使用Pickle…

    python 2023年6月2日
    00
  • python 用 xlwings 库 生成图表的操作方法

    下面就详细讲解一下如何使用Python的xlwings库生成图表的操作方法。 1. 简介 xlwings是一个用于在Excel中操作Python的插件库,它提供了一个便捷的方式来使用Python处理数据,并在Excel中进行可视化展示。在xlwings中生成图表需要使用Excel的图表对象,并操作Excel图表对象的属性来进行设定。 2. 安装 首先需要安装…

    python 2023年5月14日
    00
  • python追加元素到列表的方法

    在Python中,列表是一种非常常见的数据类型。在实际编程中,经常需要向列表中添加元素。本文将详细讲解Python中追加元素的方法。 使用append方法 可以使用append()方法向列表末尾添加一个元素。下面是一个示例: # 示例1:append()方法向列表中添加元素 lst = [1, 2, 3] lst.append(4) print(lst) #…

    python 2023年5月13日
    00
  • python中的闭包函数

    Python中的闭包函数 闭包函数是指在一个函数内部定义了另外一个函数,并且这个内部函数可以访问外部函数的变量和参数,即使外部函数已经返回。在Python中,闭包函数可以使用非常方便的lambda表达式来实现。 闭包函数的基本使用 下面是一个简单的闭包函数例子: def outer_func(x): def inner_func(y): return x +…

    python 2023年5月14日
    00
  • 详解Python中深浅拷贝的使用及注意事项

    详解Python中深浅拷贝的使用及注意事项 什么是深浅拷贝? 在Python中,拷贝是指将一个变量赋值给另一变量,以便于两个变量在内存中是不同的,但是它们的值相同。 深拷贝是指拷贝一个对象的副本,不管这个对象有多少个嵌套的对象(例如,一个 list 中还包含另一个 list),所有嵌套的对象都会被拷贝到新的对象中。 浅拷贝是指拷贝一个对象的引用,如果这个对象…

    python 2023年5月13日
    00
  • Python 3.x踩坑实战汇总

    下面是详细的攻略: Python 3.x踩坑实战汇总 Python 3.x是Python语言的最新版本,与Python 2.x相比,有很多新特和改进。但是,在实际开发中,我们也会遇到一些坑,本文将对Python 3.x踩坑实战进行汇总提供两个示例说明。 1. print函数 在Python 2.x中,print是一个语句,而在Python 3.x中,prin…

    python 2023年5月14日
    00
  • python的正则表达式和re模块详解

    Python的正则表达式和re模块详解 正则表达式是一种强大的文本处理工具,可以用于各种文本处理,如数据清洗、文本分析、信息提取等。在Python中,我们使用模块提供的函数来操作正则表达式。本攻略将详细讲解Python中正则表达式的使用,包括正则表式的基本语法、常用函数和应用技巧。 正则表达式的基本语法 正则表达式由普通字符和元字符组成,用于匹配文本中的模式…

    python 2023年5月14日
    00
  • 你知道怎么从Python角度学习Java基础

    从Python角度学习Java基础 Java和Python是两种不同的编程语言,它们在语法和编程范式上有很大的差异。如果您已经掌握了Python的基础知识,么从Python角度学习Java基础将会更加容易。本文将为您提供一个完整攻略,包括Java的基本语法、面对象编程和异常处理机制,并提供两个示例说明。 1 了解Java的基本语法 Java和Python在语…

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