Python自動化辦公之群發郵件案例詳解

背景

想象一下,現在你有一份Word邀請函模板,然後你有一份客戶列表,上面有客戶的姓名、聯系方式、郵箱等基本信息,然後你的老板現在需要替換邀請函模板中的姓名,然後將Word邀請函模板生成Pdf格式,之後編輯統一的邀請話術(郵件正文),再依次發送邀請函附件到客戶郵箱,你會怎麼做?

正常情況下,我們肯定是復制粘貼Excel表格中的客戶姓名,之後挨個Word文檔進行替換,之後將Word轉Pdf格式,然後復制Excel表格中的郵箱進行發送編輯好的郵件正常,之後附上邀請函附件,點擊發送,大概算一下,激情高昂的狀態下,這個流程快的話,大概需要1分鐘甚至更多。如果客戶隻有幾十個就還好,一個小時就可以搞定,如果客戶有幾百個,上千個,甚至上萬個呢?那估計要哭暈在辦公室瞭。

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

實現過程

1)替換Word模板生成對應邀請函

這裡以上面的Word模板做案例,編寫一個函數以客戶姓名進行替換模板中的,一步到位。

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'./邀請函/{name}.docx') 

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

2)將Word邀請函轉化為Pdf格式

這個就簡單很多瞭,Python自動化辦公中,一行代碼就可以實現,而且速度還十分快。

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

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

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

這裡需要用到openpyxl庫瞭,當然關於Excel的庫還是很多的,這裡以這個庫作為示例,代碼如下:

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}邀請函正在生成...")  
            # get_invitation(name)  
            send_email(name, email) 

上面的代碼,理解起來應該並不難,讀取Excel中的姓名和郵箱,之後傳到get_invitation()生成邀請函,之後傳給send_email()函數中自動發送郵件。實際上,這兩部是分開進行的,這裡是先執行get_invitation()函數,先生成邀請函,之後再將該函數註釋掉,再執行發送郵件函數,

4)自動發送郵件

關於自動發送郵件,歷史文章中也曾經發佈過好幾篇瞭,這裡繼續用上瞭,一開始我也覺得挺難的,後來發現也沒有想的那麼復雜,代碼如下:

smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
# smtp.login(郵箱, 授權碼)  
smtp.login('[email protected]', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀請函!"  
    msg["from"] = "[email protected]"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}<br>  
                    <b>歡迎加入Python進階者學習交流群,請在附件中查收您的門票~</b><br>  
                    點擊這裡瞭解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱會主頁</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀請函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到郵件中  
        msg.attach(doc_part)  
        # 發送前面準備好的郵件  
        smtp.send_message(msg)  
        # 如果放到外邊登錄,這裡就不用退出服務器連接,所以註釋掉瞭  
        # smtp.quit() 

這裡需要註意三點,其一是郵箱登錄放在瞭函數外邊,防止函數多次調用,短時間多次請求登錄郵箱被封禁;其二郵箱登錄裡邊用的是授權碼,而不是你的郵箱登錄密碼,這裡使用的是qq郵箱做示例,其他郵箱需要更改smtp服務;其三這個代碼裡邊除瞭正文中引用瞭html寫法,還攜帶瞭Pdf格式的邀請函附件,稍顯復雜。

5)完整代碼

以上四個步驟進行拆分瞭,依次完成瞭Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發送任務,這裡附上完整的代碼。

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  
# 生成對應的邀請函,並轉存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'./邀請函/{name}.docx')  
    convert(f"./邀請函/{name}.docx")  
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
smtp.login('[email protected]', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀請函!"  
    msg["from"] = "[email protected]"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}
  
                    <b>歡迎加入Python進階者學習交流群,請在附件中查收您的門票~</b>
  
                    點擊這裡瞭解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱會主頁</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀請函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到郵件中  
        msg.attach(doc_part)  
        # 發送前面準備好的郵件  
        smtp.send_message(msg)  
        # 如果放到外邊登錄,這裡就不用退出服務器連接,所以註釋掉瞭  
        # 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}邀請函正在生成...")  
            # get_invitation(name)  
            send_email(name, email)  
if __name__ == '__main__':  
    get_username_email()  
    # get_invitation('Python進階者') 

總結

這篇文章基於Python自動化辦公,主要介紹瞭使用Python相關庫,依次完成Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發送任務。程序運行之後,邀請函會自動生成,然後郵件會自動發送,速度也非常快,給幾百個、上千個客戶發送邀請函就不害怕瞭,如果有上萬個客戶,可能需要借助第三方平臺輔助瞭,畢竟一般的普通郵箱,每日發送郵箱數是有限制的。

到此這篇關於Python自動化辦公之群發郵件案例詳解的文章就介紹到這瞭,更多相關Python群發郵件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: