python实现将不同的附件发邮件到不同的地区

用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 相关文件配置

Mailconfig.ini

邮箱文件
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值