odemailer: 在 node.js 環(huán)境下輕松實(shí)現(xiàn)郵件發(fā)送功能.
ejs: 高效的嵌入式 javascript 模板引擎,讓你利用 javascript 生成HTML頁面
npm install --save nodemailer ejs
npm install --save-dev @types/nodemailer
const transporter: Mail=createTransport({
service: "qq", // 使用的是qq郵箱
port: 465, // smtp端口
auth: {
user: `your_qq_email@qq.com`, // 用戶名
pass: `clcqtcdwmelbecde`, // 密碼(此處使用的是: qq授權(quán)碼)
},
});
await transporter.sendMail({
from: `your_qq_email@qq.com`, // 發(fā)件人
to: `xxx@163.com, xxx2@163.com`, // 收件人,多個(gè)郵箱使用 , 間隔
cc: `xxx@163.com`, // 抄送
bcc: `xxx@163.com`, // 密送
subject: `node.js yyds!`, // 郵件主旨
text: `hello world!`, // 發(fā)送文本信息
});
const transporter: Mail=createTransport({
service: "qq", // 使用的是qq郵箱
port: 465, // smtp端口
auth: {
user: `your_qq_email@qq.com`, // 用戶名
pass: `clcqtcdwmelbecde`, // 密碼(此處使用的是: qq授權(quán)碼)
},
});
await transporter.sendMail({
from: `your_qq_email@qq.com`, // 發(fā)件人
to: `xxx@163.com, xxx2@163.com`, // 收件人,多個(gè)郵箱使用 , 間隔
cc: `xxx@163.com`, // 抄送
bcc: `xxx@163.com`, // 密送
subject: `node.js yyds!`, // 郵件主旨
html: `<h1 bgColor="red">hello world!</h1>`, // 發(fā)送html
});
const transporter: Mail=createTransport({
service: "qq", // 使用的是qq郵箱
port: 465, // smtp端口
auth: {
user: `your_qq_email@qq.com`, // 用戶名
pass: `clcqtcdwmelbecde`, // 密碼(此處使用的是: qq授權(quán)碼)
},
});
await transporter.sendMail({
from: `your_qq_email@qq.com`, // 發(fā)件人
to: `xxx@163.com, xxx2@163.com`, // 收件人,多個(gè)郵箱使用 , 間隔
cc: `xxx@163.com`, // 抄送
bcc: `xxx@163.com`, // 密送
subject: `node.js yyds!`, // 郵件主旨
html: `<h1 bgColor="red">hello world!</h1>`, // 發(fā)送html
// 發(fā)送附件
attachments: [
{
filename: `abc.jpeg`, // 附件名稱
path: `${process.cwd()}/src/assets/girl.jpeg`, // 附件地址
},
],
});
子郵件在日常工作中有很大用途,凡項(xiàng)目或任務(wù),有郵件來往可避免扯皮背鍋。而在一些自動(dòng)化的應(yīng)用場(chǎng)合,也使用得廣泛,特別是系統(tǒng)監(jiān)控方面,如果在資源使用達(dá)到警戒線之前自動(dòng)發(fā)郵件通知運(yùn)維人員,能消除隱患于前期,而不至于臨時(shí)臨急去做善后方案。
?
源 | 數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)之美
這是一個(gè)很好的Python自動(dòng)化的案例。對(duì)于小公司,采用手動(dòng)方式一個(gè)個(gè)發(fā)送郵件還是可以的。如果一個(gè)上百號(hào),上千號(hào),或者更大規(guī)模的公司,我們?cè)僖粋€(gè)個(gè)發(fā)送工資條郵件,就太浪費(fèi)時(shí)間了。鑒于此,我寫了一個(gè)這樣的程序,實(shí)現(xiàn)Python自動(dòng)化群發(fā)工資條的功能。
原始數(shù)據(jù)源如下:
最終效果如下:
看到這里,你肯定也覺得很好玩兒吧?那么這樣一個(gè)自動(dòng)化程序,應(yīng)該怎么做呢?接著往下看。
其實(shí)這樣一個(gè)代碼,總結(jié)下來,就只有如下5步:
① 導(dǎo)入相關(guān)模塊;
② 讀取Excel表格;
③ 登錄郵箱;
④ 準(zhǔn)備要發(fā)送的郵件正文;
⑤ 發(fā)送郵件;
from openpyxl import load_workbook # 用于操作Excel的模塊
import yagmail # 用于存儲(chǔ)郵箱地址和密碼的模塊
import keyring # 用于記錄你郵箱地址和密碼的模塊
from datetime import * # 用于獲取當(dāng)前系統(tǒng)時(shí)間的模塊
# 加載Excel文件
wb=load_workbook("群發(fā)工資條.xlsx",data_only=True)
sheet=wb.active
print(sheet)
-------------------------------------------------------
for row in sheet:
row_text=""
for cell in row:
if cell.column=="B":
continue
row_text +=f"{cell.value},"
print(row_text)
------------------------------------------------------
print("年:", date.today.year)
print("月:", date.today.month)
print(f"{date.today.year}-{date.today.month}月")
結(jié)果如下:
yagmail.register("1127421544@qq.com","flmyucvntuvbjbcb")
pwd=keyring.get_password("yagmail","1127421544@qq.com")
yag=yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com",password=pwd)
需要注意的是:第一行代碼是用于存儲(chǔ)你的郵件地址和密碼。第二行代碼使用keyring是為了記錄你的郵件地址和密碼。第三行代碼直接登錄郵箱。
關(guān)于Python怎么發(fā)送郵件,我之前寫了一篇文章,進(jìn)行了詳細(xì)的介紹,下方是這篇文章的鏈接,大家可以參考。
Python發(fā)郵件:http://suo.im/60ylZ1
4)準(zhǔn)備要發(fā)送的正文
由于發(fā)送的正文里面,需要我們發(fā)送一個(gè)帶表格的郵件,這就有必要我們了解一點(diǎn)前端知識(shí)。因此,我在最后面花一個(gè)章節(jié)為大家講解。
yag.send(f"{email}",f"數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)之美有限公司{date.today.year}-{date.today.month}月工資情況",contents)
上述代碼共有3個(gè)參數(shù):第一個(gè)參數(shù)是收件人的郵箱;第二個(gè)參數(shù)是郵件的標(biāo)題;第三個(gè)參數(shù)是發(fā)送的內(nèi)容。
會(huì)用Python發(fā)送郵件的人都知道,郵件正文內(nèi)容可以寫html代碼。你可能覺得自己啥也不會(huì),但是不用擔(dān)心,我們不需要學(xué)習(xí)太高深的前端代碼,做過爬蟲的人耳濡目染,都能夠看懂一些。
我們可以直接用Pycharm創(chuàng)建一個(gè)新的html文件,里面會(huì)顯示初始的前端代碼,我們進(jìn)行簡單的添加,就可以獲得一個(gè)表格啦!
最終在瀏覽器中顯示效果如下:
從上圖中根本看不出這是一個(gè)表格,那是因?yàn)槲覀儧]有為它設(shè)置一個(gè)樣式,下面要做的就是為表格設(shè)置樣式。
最終在瀏覽器中顯示效果如下:
從上圖可以看出,整個(gè)前端代碼就是用一些列的標(biāo)簽組成,同時(shí)標(biāo)簽都是成對(duì)出現(xiàn)的。因此,在Python中寫前端代碼時(shí),只需要在對(duì)應(yīng)位置添加對(duì)應(yīng)的標(biāo)簽即可。
for row in sheet:
row_text="<tr>"
for cell in row:
if cell.column=="B":
continue
row_text +=f"<td>{cell.value}</td>"
row_text +="</tr>"
print("\n")
print(row_text)
結(jié)果如下:
為了文章的完整性,我在文章最后放上我的代碼。但是限于文章篇幅,最后我只粘貼一張圖片,詳細(xì)代碼,大家可以去文末獲取。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。