用yagmail将不同的附件发送到不同的地区
开发需求和思路
因个人工作需求,需要将不同的excel表格和相同的pdf或者word发送到不同的地区。10个地区以内的往往是登录网页版邮箱发送,但超过100个市县再分开发送过于繁琐。在这里我用了yagmail模块实现邮件的发送。
模块代码
1 Mail.py
Mail.py主要放置了Mail类,主要储存发件人邮箱账户的主要配置
import yagmail
import os
import configparser
class Mail:
def __init__(self):
# 邮箱基础设置
self.config = configparser.ConfigParser()
# 这里我在同目录下新建了MailConfig.ini用于储存相关配置以便更改
self.config.read('MailConfig.ini')
user = self.config['DEFAULT']['user']
password = self.config['DEFAULT']['password']
host = self.config['DEFAULT']['host']
self.mail = yagmail.SMTP(user, password, host)
def creatconfig(self):
# 初始化邮箱配置
self.config['DEFAULT'] = {
'user': 'user',
'password': 'password',
'host': 'host'
}
with open('MailConfig.ini', 'w+') as configfile:
self.config.write(configfile)
def openconfig(self):
# 打开配置文件的方法
os.startfile('MailConfig.ini')
2 SendMail.py
该文件是发送邮件的主程序,主要继承了Mail的类和方法,同时为了后期加入GUI界面便于修改,因此独立了出来。
import pandas as pd
import os, yagmail
from Mail import Mail
class SendMail(Mail):
def __init__(self):
# 继承Mail类的属性
super().__init__()
print("""
共有2种发送模式:
1.只发送给省辖市
2.发送给省辖市和直管县
""")
def userchoose(self):
# 发送模式选择的方法
num = input("请选择:\n\t")
try:
num = int(num)
return num
except:
print("输入有误,请重试")
self.userchoose()
def getmailsubject(self):
# 获取邮件主题
sub = input("请输入发送邮件的主题(必须输入,不然为空):\n\t")
return sub
def getemaildict(self, num):
# 根据选择的模式获取邮箱字典
if num == 1:
data = pd.read_excel('省辖市邮箱.xlsx', index_col = 'name')
elif num == 2:
data1 = pd.read_excel('省辖市邮箱.xlsx', index_col = 'name')
data2 = pd.read_excel('直管县邮箱.xlsx', index_col = 'name')
data = data1.append(data2)
email = data.to_dict()['email']
return email
def getF(self, path, ftype):
# 遍历指定目录文件的方法
Files = []
for item in os.listdir(path):
if os.path.isfile(os.path.join(path,item)):
if item.split('.')[-1] in ftype:
Files.append(os.path.join(path,item))
return Files
def getFiles_x(self):
# 获取发送的表格附件,表格都存放在“表格”文件夹里面
path = os.path.join(os.getcwd(), '表格')
ftype = ('xls', 'xlsx')
Files = self.getF(path, ftype)
if Files:
return Files
else:
print('没有检测到表格附件')
def getFiles_dp(self):
# 获取发送的pdf和word附件,都存放在“WORD和PDF”文件夹里
path = os.path.join(os.getcwd(), 'WORD和PDF')
ftype = ('pdf', 'doc', 'docx')
Files = self.getF(path, ftype)
if Files:
return Files
else:
print('没有检测到WORD和PDF附件')
def senddict(self):
# 将附件、地址整合成发送字典
num = self.userchoose()
Files_p = self.getFiles_dp()
Files_x = self.getFiles_x()
email = self.getemaildict(num)
total = {}
for name in email.keys():
files = []
for file in Files_x:
# 以表格文件名区分发送地区
if name in os.path.split(file)[-1]:
files.append(file)
total[name] = {'mail': email[name], 'files': files}
if Files_p:
for value_d in total.values():
value_d['files'].extend(Files_p)
return total
def sendmail(self):
# 发送邮件主方法
t_email = self.senddict()
subject = self.getmailsubject()
i = 1
for key, value in t_email.items():
self.mail.send(to = value['mail'], subject = subject, attachments= value['files'])
print('正在发送第{}封邮件'.format(i))
i += 1
print_f = [os.path.split(i)[-1] for i in value['files']]
print('''地区:{}; 附件:{}'''.format(key, print_f))
print('全部发送完成')
# 统计共发送了多少封
print('共发送邮件{}封'.format(i-1))
if __name__ == '__main__':
S = SendMail()
S.sendmail()
input('PRESS ENTER...')
3 相关文件配置
邮箱文件