您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

使用Python发送带有附件的电子邮件

时间:2019-11-12 11:27:58  来源:  作者:

作为数据分析师,我通常会收到诸如“您可以每周向我发送此报告吗?”或“您是否可以每月通过电子邮件向我发送此数据?”这样的请求。发送报告很容易,但是如果您每周必须做同样的事情,那将很烦人。这就是为什么您应该学习如何使用Python发送电子邮件/报告以及在服务器上安排脚本的原因。

在本文上,我将向您展示如何从google BigQuery提取数据并将其作为报告发送。如果您只想知道如何使用Python发送电子邮件,则可以跳到“ 电子邮件”部分。

导入库

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.Application import MIMEApplication

from datetime import datetime
from os import path, remove
import configparser
import pandas as pd
import shutil

email-with-python1.py

和往常一样,我们必须先导入库,然后再进入编码部分。我们将使用SMTP协议客户端发送电子邮件。ConfigParser用于读取存储SQL查询的配置文件。我将在下一部分中详细解释。

从BigQuery提取数据

首先,您必须创建一个配置文件来存储所有SQL查询。用SQL查询分隔python脚本是一个好习惯,特别是当您的SQL查询很长(超过20行)时。这样,长时间的SQL查询不会使您的主脚本混乱。

配置文件示例

[report1]
filename : Report1
dialect : standard
query : SELECT * FROM table1

[report2]
filename : Report2
dialect : standard
query : SELECT * FROM table2

[report3]
filename : Report3
dialect : standard
query : SELECT * FROM table3

email-with-python.conf

[ report1 ]是您的sub-confiq。filename,dialect并且query是子配置的属性。

您可以使用以下代码读取配置文件。

FOLDER = path.dirname(path.realpath(__file__))
CONFIG_FILE = path.join(FOLDER, "query_detail.conf")
config = configparser.RawConfigParser()
config.read(CONFIG_FILE)

email-with-python2.py

编写函数以读取子配置的属性

def bigquery_to_csv(sub_conf):
 """
 Output a csv file by reading query in config file
 Arguments:
 sub_conf {String} -- [Sub Confiq name in the confiq file]
 """
 query = config.get(sub_conf, 'query')
 filename = config.get(sub_conf, 'filename')
 dialect = config.get(sub_conf, 'dialect')

 table = pd.read_gbq(query, project_id="yourProjectID", dialect=dialect, private_key="credential.json")

 filename = filename + current_date.strftime("%Y%m%d") + ".csv"
 filelist.append(filename)
 table.to_csv(filename)

email-with-python3.py

此自定义功能将读取您传入的子配置文件的属性,并输出CSV文件。

yourProjectID将是您的BigQuery项目ID,而credential.json将是您的BigQuery凭据JSON文件。如果您希望使用Web Auth登录,可以将其删除。

current_date = datetime.now()
filelist = []

# Read all the sub confiq and output csv files
sub_conf_list = config.sections()
for sub_conf in sub_conf_list:
 bigquery_to_csv(sub_conf)

print("Reports are extracted successfully!")

现在,您只需要循环就可以提取您在配置文件中定义的所有文件。config.sections()将在您的配置文件中返回一个子配置文件列表。

通过电子邮件发送报告和附件

定义您的电子邮件内容

msg = MIMEMultipart()
fromaddr = 'yourEmail@outlook.com'
msg['From'] = fromaddr
msg["To"] = "sender1@outlook.com,sender2@outlook.com"
msg["Cc"] = "yourEmail@outlook.com"
msg['Subject'] = "Report"

htmlEmail = """
<p> Dear Sir/Madam, <br/><br/>
 Please find the attached Report below.<br/><br/>
<br/></p>
<p> Please contact XXX directly if you have any questions. <br/>
 Thank you! <br/><br/>
 Best Regards, <br/>
 XXX </p>
<br/><br/>
<font color="red">Please do not reply to this email as it is auto-generated. </font>
"""

for f in filelist:
 f = path.join(FOLDER, f)
 with open(f, "rb") as attached_file:
 part = MIMEApplication(
 attached_file.read(),
 Name=path.basename(f)
 )
 # After the file is closed
 part['Content-Disposition'] = 'attachment; filename="%s"' % path.basename(f)
 msg.attach(part)

上面是您定义电子邮件属性的方式,例如发件人,收件人,抄送和主题。该htmlEmail会是你的电子邮件正文。您可以使用纯文本或html作为电子邮件正文。我更喜欢使用html,因为我可以进行更多的格式设置,如粗体,斜体和更改字体颜色。

同样,我们将使用循环附加所有文件。

发送邮件

msg.attach(MIMEText(htmlEmail, 'html'))
server = smtplib.SMTP('smtp.office365.com', 587)
server.starttls()
server.login(fromaddr, "yourpassword")
text = msg.as_string()
server.sendmail(fromaddr, ['sender1@outlook.com','sender2@outlook.com'], text)
server.quit()

print("Email are sent successfully!")

出于演示目的,密码在脚本内进行了硬编码。这不是一个好习惯。您应该将密码保存在其他文件中,以提高安全性。

现在,您已经了解了如何使用Python发送带有附件的电子邮件。

您可以在我的[Github]中(https://github.com/chingjunetao/google-service-with-python/tree/master/email-with-python)查看完整的脚本。

翻译自:https://towardsdatascience.com/how-to-send-email-with-attachments-by-using-python-41a9d1a3860b



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  Tags: Python  点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  Tags: Python  点击:(4)  评论:(0)  加入收藏
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: Python  点击:(6)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  Tags: Python  点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  Tags: Python  点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  Tags: Python  点击:(5)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条