溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python群發(fā)郵件案例分析

發(fā)布時(shí)間:2022-02-19 13:40:59 來(lái)源:億速云 閱讀:130 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Python群發(fā)郵件案例分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

背景

想象一下,現(xiàn)在你有一份Word邀請(qǐng)函模板,然后你有一份客戶列表,上面有客戶的姓名、聯(lián)系方式、郵箱等基本信息,然后你的老板現(xiàn)在需要替換邀請(qǐng)函模板中的姓名,然后將Word邀請(qǐng)函模板生成Pdf格式,之后編輯統(tǒng)一的邀請(qǐng)?jiān)捫g(shù)(郵件正文),再依次發(fā)送邀請(qǐng)函附件到客戶郵箱,你會(huì)怎么做?

Python群發(fā)郵件案例分析

正常情況下,我們肯定是復(fù)制粘貼Excel表格中的客戶姓名,之后挨個(gè)Word文檔進(jìn)行替換,之后將Word轉(zhuǎn)Pdf格式,然后復(fù)制Excel表格中的郵箱進(jìn)行發(fā)送編輯好的郵件正常,之后附上邀請(qǐng)函附件,點(diǎn)擊發(fā)送,大概算一下,激情高昂的狀態(tài)下,這個(gè)流程快的話,大概需要1分鐘甚至更多。如果客戶只有幾十個(gè)就還好,一個(gè)小時(shí)就可以搞定,如果客戶有幾百個(gè),上千個(gè),甚至上萬(wàn)個(gè)呢?那估計(jì)要哭暈在辦公室了。

Python群發(fā)郵件案例分析

不過(guò)別慌,Python自動(dòng)化辦公,一套組合拳,使用Python自動(dòng)化辦公——Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送一條龍服務(wù)安排,下面一起來(lái)看看吧!

實(shí)現(xiàn)過(guò)程

1)替換Word模板生成對(duì)應(yīng)邀請(qǐng)函

這里以上面的Word模板做案例,編寫一個(gè)函數(shù)以客戶姓名進(jìn)行替換模板中的,一步到位。

def get_invitation(name):  
    doc = docx.Document("template.docx")  
    for para in doc.paragraphs:  
        if '<name>' in para.text:  
            for run in para.runs:  
                if '<name>' in run.text:  
                    runrun.text = run.text.replace('<name>', name)  
        doc.save(f'./邀請(qǐng)函/{name}.docx')

上面這個(gè)代碼需要理解Word文檔的結(jié)構(gòu),一個(gè)文檔有多個(gè)段落,用doc.paragraphs獲??;段落中的文字用para.text獲??;一個(gè)段落中可能有多個(gè)不同樣式的文本,這些不同的樣式被稱為run,一個(gè)段落中包含多個(gè)run,用para.runs獲取,一個(gè)run中的具體文本用run.text獲取。了解了這些,再看上述代碼,是不是清晰很多呢?

2)將Word邀請(qǐng)函轉(zhuǎn)化為Pdf格式

這個(gè)就簡(jiǎn)單很多了,Python自動(dòng)化辦公中,一行代碼就可以實(shí)現(xiàn),而且速度還十分快。

from docx2pdf import convert  
convert(f"./邀請(qǐng)函/{name}.docx")

使用convert()函數(shù)可以把docx格式的文件轉(zhuǎn)換成同名的Pdf文檔。

3)讀取Excel表格中的姓名和郵箱

這里需要用到openpyxl庫(kù)了,當(dāng)然關(guān)于Excel的庫(kù)還是很多的,這里以這個(gè)庫(kù)作為示例,代碼如下:

def get_username_email():  
    workbook = openpyxl.load_workbook("names.xlsx")  
    worksheet = workbook.active  
    for index, row in enumerate(worksheet.rows):  
        if index > 0:  
            name = row[0].value  # 獲取表格第一列的姓名  
            email = row[3].value  # 獲取表格第四列的郵箱  
            # print(name, email) 
            # print(f"{name}邀請(qǐng)函正在生成...")  
            # get_invitation(name)  
            send_email(name, email)

上面的代碼,理解起來(lái)應(yīng)該并不難,讀取Excel中的姓名和郵箱,之后傳到get_invitation()生成邀請(qǐng)函,之后傳給send_email()函數(shù)中自動(dòng)發(fā)送郵件。實(shí)際上,這兩部是分開進(jìn)行的,這里是先執(zhí)行g(shù)et_invitation()函數(shù),先生成邀請(qǐng)函,之后再將該函數(shù)注釋掉,再執(zhí)行發(fā)送郵件函數(shù),

4)自動(dòng)發(fā)送郵件

關(guān)于自動(dòng)發(fā)送郵件,歷史文章中也曾經(jīng)發(fā)布過(guò)好幾篇了,這里繼續(xù)用上了,一開始我也覺(jué)得挺難的,后來(lái)發(fā)現(xiàn)也沒(méi)有想的那么復(fù)雜,代碼如下:

smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
# smtp.login(郵箱, 授權(quán)碼)  
smtp.login('235977@qq.com', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀請(qǐng)函!"  
    msg["from"] = "2352180977@qq.com"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}<br>  
                    <b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請(qǐng)?jiān)诟郊胁槭漳拈T票~</b><br>  
                    點(diǎn)擊這里了解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱會(huì)主頁(yè)</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀請(qǐng)函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到郵件中  
        msg.attach(doc_part)  
        # 發(fā)送前面準(zhǔn)備好的郵件  
        smtp.send_message(msg)  
        # 如果放到外邊登錄,這里就不用退出服務(wù)器連接,所以注釋掉了  
        # smtp.quit()

這里需要注意三點(diǎn),其一是郵箱登錄放在了函數(shù)外邊,防止函數(shù)多次調(diào)用,短時(shí)間多次請(qǐng)求登錄郵箱被封禁;其二郵箱登錄里邊用的是授權(quán)碼,而不是你的郵箱登錄密碼,這里使用的是qq郵箱做示例,其他郵箱需要更改smtp服務(wù);其三這個(gè)代碼里邊除了正文中引用了html寫法,還攜帶了Pdf格式的邀請(qǐng)函附件,稍顯復(fù)雜。

5)完整代碼

以上四個(gè)步驟進(jìn)行拆分了,依次完成了Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送任務(wù),這里附上完整的代碼。

import docx  
from docx2pdf import convert  
import openpyxl  
import smtplib  
from email.mime.text import MIMEText  
from email.mime.multipart import MIMEMultipart  
from email.mime.application import MIMEApplication  
# 生成對(duì)應(yīng)的邀請(qǐng)函,并轉(zhuǎn)存pdf格式  
def get_invitation(name):  
    doc = docx.Document("template.docx")  
    for para in doc.paragraphs:  
        if '<name>' in para.text:  
            for run in para.runs:  
                if '<name>' in run.text: 
                    runrun.text = run.text.replace('<name>', name)  
        doc.save(f'./邀請(qǐng)函/{name}.docx')  
    convert(f"./邀請(qǐng)函/{name}.docx")  
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
smtp.login('235977@qq.com', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀請(qǐng)函!"  
    msg["from"] = "2352180977@qq.com"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}
  
                    <b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請(qǐng)?jiān)诟郊胁槭漳拈T票~</b>
  
                    點(diǎn)擊這里了解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱會(huì)主頁(yè)</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀請(qǐng)函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到郵件中  
        msg.attach(doc_part)  
        # 發(fā)送前面準(zhǔn)備好的郵件  
        smtp.send_message(msg)  
        # 如果放到外邊登錄,這里就不用退出服務(wù)器連接,所以注釋掉了  
        # smtp.quit()  
def get_username_email():  
    workbook = openpyxl.load_workbook("names.xlsx")  
    worksheet = workbook.active 
    for index, row in enumerate(worksheet.rows):  
        if index > 0:  
            name = row[0].value  
            email = row[3].value  
            # print(name, email)  
            # print(f"{name}邀請(qǐng)函正在生成...")  
            # get_invitation(name)  
            send_email(name, email)  
if __name__ == '__main__':  
    get_username_email()  
    # get_invitation('Python進(jìn)階者')

以上就是“Python群發(fā)郵件案例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI