使用Python發(fā)送帶有附件的電子郵件

作為數(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

email-with-python1.py

和往常一樣罚勾,我們必須先導(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

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

編寫函數(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)

email-with-python3.py

此自定義功能將讀取您傳入的子配置文件的屬性状婶,并輸出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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茵休,隨后出現(xiàn)的幾起案子薪棒,更是在濱河造成了極大的恐慌,老刑警劉巖榕莺,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俐芯,死亡現(xiàn)場離奇詭異,居然都是意外死亡钉鸯,警方通過查閱死者的電腦和手機吧史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亏拉,“玉大人扣蜻,你說我怎么就攤上這事逆巍〖疤粒” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵锐极,是天一觀的道長笙僚。 經(jīng)常有香客問我,道長灵再,這世上最難降的妖魔是什么肋层? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翎迁,結(jié)果婚禮上栋猖,老公的妹妹穿的比我還像新娘。我一直安慰自己汪榔,他們只是感情好蒲拉,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痴腌,像睡著了一般雌团。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上士聪,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天锦援,我揣著相機與錄音,去河邊找鬼剥悟。 笑死灵寺,一個胖子當(dāng)著我的面吹牛曼库,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播替久,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼凉泄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚯根?” 一聲冷哼從身側(cè)響起后众,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颅拦,沒想到半個月后蒂誉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡距帅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年右锨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碌秸。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡绍移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讥电,到底是詐尸還是另有隱情蹂窖,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布恩敌,位于F島的核電站瞬测,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纠炮。R本人自食惡果不足惜月趟,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恢口。 院中可真熱鬧孝宗,春花似錦、人聲如沸耕肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看疗。三九已至沙峻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間两芳,已是汗流浹背摔寨。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怖辆,地道東北人是复。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓删顶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淑廊。 傳聞我的和親對象是個殘疾皇子逗余,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Django 官方文檔 發(fā)送email 官網(wǎng)地址:[https://docs.djangoproject.com/...
    學(xué)以致用123閱讀 2,246評論 0 2
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,723評論 0 10
  • 過年啦季惩! 點擊圖片录粱,長按保存,設(shè)為壁紙画拾。 歡迎轉(zhuǎn)發(fā)鏈接給朋友啥繁,像素?zé)o損。 設(shè)置壁紙時青抛,可以手動調(diào)整一下圖片旗闽,以匹配...
    大鳥8wo閱讀 351評論 2 5
  • 今天我的固定工作時間只安排了三個小時,因為很多事情都是“功夫在詩外”蜜另。 線上平臺的搭建正在按照計劃進行适室,品牌的申請...
    羅洪綺閱讀 152評論 1 1
  • 把今天的時間留給我們 您并不一定感知 五月的的綠色還會再深些 我踩著樹木的蔭影 呼吸著丁香的芳香 心慢慢的徜徉 這...
    淡然li閱讀 458評論 9 14