Python发送邮件接收邮件完整攻略
一、发送邮件
1. 导入模块
首先,在代码中导入所需的模块:smtplib
、email.mime.multipart
、email.mime.text
、email.mime.image
。其中,smtplib
模块提供SMTP邮件发送功能,email.mime.multipart
、email.mime.text
及email.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. 导入模块
首先,在代码中导入所需的模块:imaplib
、email
。其中,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技术站