python批量发送邮件--包括批量不同附件

python批量发送邮件--包括批量不同附件,第1张

小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。

一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。

所以,设计要点就是一个字——

恩,就酱。

经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:

(1) 邮件内容(content)不变,为固定的txt文本

(2) 附件(attch)为每个工长的结算账单(excel文件.xlsx),此文件命名为总账单中自动分割出来的名字(暂时不懂怎么分割出来的=.=),格式为:

(3) 邮件主题(Subject)为附件名(不带后缀名)

(4) 邮件接收对象(工长)的名单及其邮箱地址基本不变,偶尔变动

(5)

(1) 将工长及其邮箱地址存为CSV文件的两列,python中将其读取为字典形式,存储以供后续查询邮箱地址。

(2) 遍历文件夹中的附件(.xlsx类型文件),对其进行两种 *** 作,一方面将其名字(不带路径和后缀)提取出来,作为邮件主题(Subject),并对Subject进一步划分,得到其中的人名(工长);另一方面,将其传入MIMEbase模块中转为邮件附件对象。

(3) 由上述得到的人名(name),在字典形式的通讯录中,查找相应的地址(value),即为收件人名称和地址

(4) 利用python中的email模块和smtp模块,登录自己的邮箱账号,再对每个附件,得到的收件人名和地址,添加附件,发送邮件。done

在设计过程中有几点需要注意

(1) 有时一个邮件地址对应两个人名,此时应该在CSV文件中分为两行存储,而不是将两个人名存为同一个键;

(2)有账单.xlsx文件,通讯录里却没存储此人记录,程序应该打印提示没有通讯记录的人名,且不能直接退出,要保证员工看到此提示,此第一版程序还有解决此问题;

(3)此程序发送的邮件内容为纯文本,若要求邮件内容有不同格式(如部分加粗,部分红色),还有小部分需要每次更改的地方(如邮件内容包含当前月份),如何解决?(这就是第二种邮件内容,“预算款”);

(4)重名的,暂时还没碰到,程序中也没给出解决方案。

第一版到此,20180830,待更新

第二版更新,20180904

第三版更新,20180909

转战CSDN博客,更多博客见传送门《 xiaozhou的博客主页 》

    在工作中可能会遇到将生成的文件以邮件的方式发送给他人。通过SMTP(Simple Mail Transfer Protocol)简单邮件传输协议来发送邮件。这里主要用到Python中两个库:

    以QQ邮箱为例,首先需要开启SMTP服务,并获取授权码( 程序中需要用到 )。步骤是: 设置-账户-开启服务-生成授权码

    标准邮件一般需要三个头部信息: From、To和Subject。先创建一个带附件的实例,然后分别设置各个信息。

    通过实例化smtplib模块的SMTP对象来连接到SMTP访问,并使用sendmail方法来发送信息。

可以通过以下代码实现:

import smtplib

from email.mime.text import MIMEText  

import email.mime.multipart

from email.MIMEMultipart import MIMEMultipart

from email.MIMEBase import MIMEBase

from email import Encoders

  

def send_mail():  

    mailto_list = ['xxxx','xxx']#收件人

    mail_host = "xxxxx"  # 设置服务器

    mail_user = "xxxx"  # 用户名

    mail_pass = "xxxxxx"  # 口令 

    mail_postfix = "xxxx.xxx"  # 发件箱的后缀

    me = "hello" + "<" + mail_user + "@" + mail_postfix + ">"  # 这里的hello可以任意设置,收到信后,将按照设置显示

    content = 'This is test mail!'#邮件正文

    msg = MIMEMultipart()

    body = MIMEText(content, _subtype='html', _charset='gb2312')  # 创建一个实例,这里设置为html格式邮件

    msg.attach(body)

    msg['Subject'] = "Subject Test"  # 设置主题

    msg['From'] = me  

    msg['To'] = "".join(mailto_list)  

    #附件内容,若有多个附件,就添加多个part, 如part1,part2,part3

    part = MIMEBase('application', 'octet-stream')

    # 读入文件内容并格式化,此处文件为当前目录下,也可指定目录 例如:open(r'/tmp/123.txt','rb')

    part.set_payload(open('test.txt','rb').read())

    Encoders.encode_base64(part)

    ## 设置附件头

    part.add_header('Content-Disposition', 'attachment filename="test.txt"')

    msg.attach(part)

      

    try:  

        s = smtplib.SMTP()  

        s.connect(mail_host)  # 连接smtp服务器

        s.login(mail_user, mail_pass)  # 登陆服务器

        s.sendmail(me, mailto_list, msg.as_string())  # 发送邮件

        s.close()  

        print 'send mail sucess'

        return True  

    except Exception, e:  

        print str(e)  

        return False


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11897409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存