网络编程
位置:首页>> 网络编程>> Python编程>> Python实现发送带有pdf附件的电子邮件

Python实现发送带有pdf附件的电子邮件

作者:IT里的交易员  发布时间:2022-02-01 14:08:05 

标签:Python,发送,邮件

前言

使用Python发邮件,是个简单的话题,可是如何可以优雅的轻松的群发邮件,并附加PDF附件,是很多小伙伴的日常工作,却也是很多小白需要费力才能解决的问题。为了方便理解和使用,本文对邮件发送进行了类的包装。将连接服务器、生成邮件、发送邮件分开执行。可以解决工作中遇到的绝大部分问题。

话不多说,上代码。

提示:以下是本篇文章正文内容,邮箱配置参数需要自行修改方可使用

一、如何使用Python发送电子邮件

使用Python发送电子邮件我们可以借用smtplib模块,smtplib是一个 Python 库,用于使用简单邮件传输协议(SMTP)发送电子邮件。 smtplib是内置模块; 我们不需要安装它。 它抽象了 SMTP 的所有复杂性。发送邮件只要设置好参数即可。

二、使用步骤

1. 配置邮箱参数

下面以常用的QQ邮箱举例,需要自行修改相应参数配置。同样也适用于其它邮箱。

请先确保SMTP服务已开启,如下图。

Python实现发送带有pdf附件的电子邮件

QQ邮箱的发送服务器为:smtp.qq.com,邮件发送服务器端口普通为25,使用SSL,端口为465或587。

Python实现发送带有pdf附件的电子邮件

# 1、设置邮件服务器配置信息及登录邮箱账号
   config = {
       'stmpServer' : 'smtp.qq.com',# 邮件发送服务器地址
       'stmpPort' : 25,# 邮件发送服务器端口:普通为25,QQ邮箱SMTP服务器(端口465或587)
       'fromEmailAddr' : 'send@qq.com', # 邮件发送方邮箱地址
       'password' : 'password', # 邮箱密码
   }

2.发送带有pdf附件邮件完整源码(含演示代码)

# -*- coding: utf-8 -*-

import smtplib
# 发送字符串的邮件
from email.mime.text import MIMEText
# 引入MIMEMultipart MIMEApplication类
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

class SendMail:
   def __init__(self,config):
       self.server = self.connect_mailServer(config)

def connect_mailServer(self,config):    
       # 登录并发送邮件
       print('try login')
       try:
           server = smtplib.SMTP(config['stmpServer'], config['stmpPort'])
           server.login(config['fromEmailAddr'], config['password'])
       except smtplib.SMTPException as e:
           print("smtplib 连接服务器报错:", e)
       else:
           print('login success')
           return server

def generate_email(self, subject, text, file, fromEmailAddr, toEmailAddr):
       # 生成email主题、正文、附件信息
       # ---------------------------发送带附件邮件-----------------------------
       # 邮件内容设置
       message = MIMEMultipart()
       # 邮件主题
       message['Subject'] = subject
       # 发送方信息
       message['From'] = fromEmailAddr
       # 接受方信息
       message['To'] = toEmailAddr
       # 邮件正文内容
       message.attach(MIMEText(text, 'plain', 'utf-8'))
       # 添加PDF附件
       with open(file, "rb") as f:
           attach = MIMEApplication(f.read(),_subtype="pdf")
           attach.add_header('Content-Disposition','attachment',filename=str(file.split('\\')[-1]))
           message.attach(attach)
       return message

if __name__ == '__main__':
# from mailto import SendMail #将此文件保存为mailto.py 放在调用文件同目录即可使用此语句调用,下面是调用所需代码。

# 1、设置邮件服务器配置信息及登录邮箱账号
   config = {
       'stmpServer' : 'smtp.qq.com',# 邮件发送服务器地址
       'stmpPort' : 25,# 邮件发送服务器端口:普通为25,QQ邮箱SMTP服务器(端口465或587)
       'fromEmailAddr' : 'send@qq.com', # 邮件发送方邮箱地址
       'password' : 'password', # 邮箱密码
   }

# 2、构造邮件基本内容
   subject = '这是一封测试邮件'
   text = '测试邮件,附件是pdf'
   # 构造附件,假设存在以下目录,注意附件路径为\\,因为在提取文件名时会用到。
   file = 'D:\\测试PDF.pdf'

# 3、开始发送邮件
   # 3.1 发送单封邮件:
   if 1:
       #生成email主题、正文、附件信息
       fromEmailAddr = config['fromEmailAddr']
       toEmailAddr = 'fisrt@qq.com'
       mail = SendMail(config)
       message = mail.generate_email(subject, text, file, fromEmailAddr, toEmailAddr)
       mail.server.sendmail(fromEmailAddr, toEmailAddr, message.as_string())
       print('sendmail to '+toEmailAddr+' success')
       mail.server.quit()

# 3.2 发送多封邮件,对方邮箱存为list
   if 1:
       fromEmailAddr = config['fromEmailAddr']
       toEmailAddr_list = ['fisrt@qq.com','second@qq.com']
       mail = SendMail(config)
       same = True #这里表示邮件内容一致
       message = None
       if isinstance(toEmailAddr_list,list):
           # 如果列表就是多地址,使用群发
           for toEmailAddr in toEmailAddr_list:
               if not same or message is None:
                   # 第一次需要生成新邮件。如果每次标题不一样,请在循环内自行修改subject, text, file参数
                   message = mail.generate_email(subject, text, file, fromEmailAddr, toEmailAddr)
               try:
                   mail.server.sendmail(fromEmailAddr, toEmailAddr, message.as_string())
               except smtplib.SMTPException as e:
                   print("smtplib 发送邮件报错:", e)
               else:
                   print('sendmail to '+toEmailAddr+' success')
       print('sendmail finished')
       mail.server.quit()

来源:https://blog.csdn.net/popboy29/article/details/126396549

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com