博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】作为一名后端开发人员,常常会与邮箱发送方面的工作打交道,邮件发送是非常常用一个功能,本文记录了一个多收件人、多抄送、多附件的 python3 邮件发送完整代码,以供后续学习、工作的快速引用。
本文基于 smtplib 实现邮件发送,其中的要点包括:同一编码问题(附件名称为中文)、收发件人昵称的设置、添加多附件等重点问题。以下是完整可用代码,亲测 ok ,大家可以参考使用!(代码中并没有太多的注释,为了保持整洁一点,这样自己复制的时候就不用有太多的修改)
完整代码如下:
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import os
import smtplib
class myEmail():
def __init__(self,config:dict):
self.from_addr = config['from_addr']
self.to_addr = config['to_addr']
self.cc_addr = config['cc_addr']
self.mailhost = config['mailhost']
self.password = config['password']
self.msg_subject = config['msg_subject']
self.msg_text = config['msg_text']
self.file_path = config['file_path']
self.is_smtp_ssl = config['is_smtp_ssl']
self.msg_text_type = 'html'
if len(self.to_addr) <= 0:
return
def send_email(self):
msg = MIMEMultipart()
msg['From'] = self._format_addr(self.from_addr)
msg['To'] = self._format_addr(self.to_addr)
if self.cc_addr is not None:
msg['Cc'] = self._format_addr(self.cc_addr)
msg['Subject'] = Header(self.msg_subject, 'utf-8').encode()
msg.attach(MIMEText(self.msg_text, self.msg_text_type, 'utf-8'))
if self.file_path is not None and len(self.file_path) > 0:
msg = self.files(msg, self.file_path)
smtp_server = self.mailhost
if self.is_smtp_ssl:
# 使用 smtp 协议以及 ssl 加密方式【推荐使用此方法】
port = 465
server = smtplib.SMTP_SSL(smtp_server, int(port), timeout=10.0)
else:
port = 25
server = smtplib.SMTP(smtp_server,port,timeout = 10.0)
server.set_debuglevel(0) # 设置 debug 级别 1:打印 0: 不打印
server.connect(smtp_server) # 连接服务器
server.login(self.get_val(self.from_addr)[0], self.password) # 登录发件人账号
if self.cc_addr is not None:
server.sendmail(
self.get_val(self.from_addr)[0],
self.get_val(self.to_addr) + self.get_val(self.cc_addr),
msg.as_string()
)
else:
server.sendmail(
self.get_val(self.from_addr)[0],
self.get_val(self.to_addr),
msg.as_string()
)
server.quit()
def get_val(self,dic):
val = list(dic.values())
return val
def _format_addr(self,dic):
addr_list = []
for name, addr in dic.items():
addr_list.append(formataddr((Header(name, 'utf-8').encode(), addr)))
return ','.join(addr_list)
def files(self,msg, file_path):
for source_file,file_name in file_path.items():
if not os.path.exists(source_file):
print(source_file,'不存在!')
continue
with open(source_file, 'rb') as f:
mime = MIMEBase('application', 'octet-stream')
# file_name 转 gbk, 否则附件带有中文名会有乱码
mime.add_header(
'Content-Disposition',
'attachment',
filename = ('gbk', '', file_name)
)
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
mime.set_payload(f.read()) # 把附件的内容读进 mime
encoders.encode_base64(mime) # 用Base64编码
msg.attach(mime) # 添加到 MIMEMultipart 中
return msg
if __name__ == "__main__":
from_addr = {
'马富天':'mafutian@bangbangas.com',
}
to_addr = {
'马富天':'mafutian@bangbangas.com',
'马富天-126':'mafutian@126.com',
}
cc_addr = {
'马富天-qq':'335134463@qq.com',
}
mailhost = '******'
password = '******' # 密码或授权码
msg_subject = '邮件标题'
msg_text = '邮件正文内容'
# 附件源文件地址及对应的名称
file_path = {
}
config = {
'from_addr':from_addr,
'to_addr':to_addr,
'cc_addr':cc_addr,
'mailhost':mailhost,
'password':password,
'msg_subject':msg_subject,
'msg_text':msg_text,
'file_path':file_path,
'is_smtp_ssl':True,
}
my_email = myEmail(config = config)
my_email.send_email()
版权归 马富天个人博客 所有
本文标题:《python3 邮件发送(多收件人,多抄送人、多附件)》
本文链接地址:http://www.mafutian.com/441.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶2
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||