作為數(shù)據(jù)分析師牌里,我通常會收到諸如“您可以每周向我發(fā)送此報告嗎郎楼?”或“您是否可以每月通過電子郵件向我發(fā)送此數(shù)據(jù)辆雾?”這樣的請求肪笋。發(fā)送報告很容易,但是如果您每周必須做同樣的事情度迂,那將很煩人藤乙。這就是為什么您應(yīng)該學(xué)習(xí)如何使用python發(fā)送電子郵件/報告以及在服務(wù)器上安排腳本的原因。
在本文上惭墓,我將向您展示如何從Google BigQuery提取數(shù)據(jù)并將其作為報告發(fā)送湾盒。如果您只想知道如何使用Python發(fā)送電子郵件,則可以跳到“ 電子郵件”部分诅妹。
導(dǎo)入庫
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
和往常一樣罚勾,我們必須先導(dǎo)入庫毅人,然后再進入編碼部分。我們將使用SMTP協(xié)議客戶端發(fā)送電子郵件尖殃。ConfigParser用于讀取存儲SQL查詢的配置文件丈莺。我將在下一部分中詳細解釋。
從BigQuery提取數(shù)據(jù)
首先送丰,您必須創(chuàng)建一個配置文件來存儲所有SQL查詢缔俄。用SQL查詢分隔python腳本是一個好習(xí)慣,特別是當(dāng)您的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
[ 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)
編寫函數(shù)以讀取子配置的屬性
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)
此自定義功能將讀取您傳入的子配置文件的屬性状婶,并輸出CSV文件。
yourProjectID
將是您的BigQuery項目ID馅巷,而credential.json
將是您的BigQuery憑據(jù)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!")
現(xiàn)在稍刀,您只需要循環(huán)就可以提取您在配置文件中定義的所有文件。config.sections()
將在您的配置文件中返回一個子配置文件列表敞曹。
通過電子郵件發(fā)送報告和附件
定義您的電子郵件內(nèi)容
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)
上面是您定義電子郵件屬性的方式掉丽,例如發(fā)件人,收件人异雁,抄送和主題捶障。該htmlEmail
會是你的電子郵件正文。您可以使用純文本或html作為電子郵件正文纲刀。我更喜歡使用html项炼,因為我可以進行更多的格式設(shè)置,如粗體示绊,斜體和更改字體顏色锭部。
同樣,我們將使用循環(huán)附加所有文件面褐。
發(fā)送郵件
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!")
出于演示目的拌禾,密碼在腳本內(nèi)進行了硬編碼。這不是一個好習(xí)慣展哭。您應(yīng)該將密碼保存在其他文件中湃窍,以提高安全性闻蛀。
現(xiàn)在,您已經(jīng)了解了如何使用Python發(fā)送帶有附件的電子郵件您市。
您可以在我的[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