最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python+smtplib實現郵件自動發(fā)送功能

 更新時間:2025年09月11日 08:54:39   作者:憶愿  
工作中總有各種郵件需要定期發(fā)送,手動操作不僅繁瑣還容易忘記,Python的smtplib庫完美解決這個痛點,幾行代碼就能搞定郵件自動發(fā)送,還能加上附件、HTML格式美化、定時任務等花樣玩法,所以本文介紹了基于Python+smtplib實現郵件自動發(fā)送功能,需要的朋友可以參考下

引言

工作中總有各種郵件需要定期發(fā)送,手動操作不僅繁瑣還容易忘記。Python的smtplib庫完美解決這個痛點,幾行代碼就能搞定郵件自動發(fā)送,還能加上附件、HTML格式美化、定時任務等花樣玩法。我用這招把每天半小時的郵件工作縮減到幾分鐘,工作效率直接起飛。

smtplib是啥玩意兒

smtplib是Python自帶的一個庫,專門用來發(fā)送郵件的。SMTP(Simple Mail Transfer Protocol)就是簡單郵件傳輸協議,是互聯網上用來發(fā)送郵件的標準。這個庫把復雜的協議細節(jié)都封裝好了,咱們只需要調用幾個簡單的方法就能發(fā)郵件,不用關心底層的通信細節(jié)。

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 基本用法示例
    sender = 'your_email@example.com'
    receivers = ['receiver@example.com']
    
    # 創(chuàng)建一個簡單的郵件
    message = MIMEText('這是測試郵件,別當真~', 'plain', 'utf-8')
    message['From'] = Header("Python自動發(fā)送", 'utf-8')
    message['To'] = Header("測試接收人", 'utf-8')
    message['Subject'] = Header('Python郵件測試', 'utf-8')
    
    try:
        smtp_obj = smtplib.SMTP('smtp.example.com')  # 郵件服務器地址
        smtp_obj.login('username', 'password')       # 登錄郵箱
        smtp_obj.sendmail(sender, receivers, message.as_string())
        print("郵件發(fā)送成功")
    except smtplib.SMTPException:
        print("Error: 無法發(fā)送郵件")

看著挺多,實際就是創(chuàng)建連接、寫點內容、登錄、發(fā)送這幾步。

溫馨提示 :這個代碼敲完不一定能直接跑,因為現在各大郵箱為了安全都開啟了授權碼登錄,你得到郵箱設置里去申請一個授權碼,用這個碼來替代密碼登錄。

連接郵箱服務器,這事有點講究

連郵箱服務器有兩種方式:普通連接和SSL加密連接?,F在基本都用第二種,安全嘛。

普通連接:

    smtp_obj = smtplib.SMTP('smtp.example.com', 25)  # 25是SMTP協議的默認端口

SSL加密連接:

    smtp_obj = smtplib.SMTP_SSL('smtp.example.com', 465)  # 465是SMTP over SSL的默認端口

幾個常見郵箱的SMTP服務器地址:

  • Gmail: smtp.gmail.com
  • QQ郵箱: smtp.qq.com
  • 163郵箱: smtp.163.com
  • 阿里企業(yè)郵箱: smtp.qiye.aliyun.com

我在上班的時候,天天用企業(yè)郵箱自動化處理各種通知,賊方便。

登錄郵箱也很簡單:

    smtp_obj.login('your_email@example.com', '你的授權碼')

這里有個大坑,不是用你平時登錄的密碼,是要到郵箱設置里申請的專門用于第三方登錄的授權碼。每個郵箱申請方式不太一樣:

  • QQ郵箱:設置 -> 賬戶 -> POP3/SMTP服務
  • 163郵箱:設置 -> POP3/SMTP/IMAP -> 開啟服務
  • 企業(yè)郵箱:一般管理員會分配

不同郵箱叫法可能不同,像什么"安全碼"、“應用專用密碼”、“授權碼”,反正不是你平時登錄的那個密碼就對了。

也有人問為啥現在郵箱這么麻煩,整這種授權碼。別抱怨,這是為了安全。想想看,你平時登錄密碼要是泄露了,一切都完蛋。但授權碼只能用于郵件收發(fā),黑客就算拿到了也不能改你密碼、不能刪你郵件,安全多了。

發(fā)送純文本郵件,小菜一碟

最基礎的就是發(fā)純文本郵件,真的超簡單:

    from email.mime.text import MIMEText
    from email.header import Header
    
    # 創(chuàng)建純文本郵件
    msg = MIMEText('這是郵件內容,想寫啥寫啥', 'plain', 'utf-8')
    msg['From'] = Header('Python自動發(fā)送', 'utf-8')
    msg['To'] = Header('老板', 'utf-8')
    msg['Subject'] = Header('每日工作匯報', 'utf-8')
    
    # 發(fā)送郵件
    smtp_obj.sendmail(sender, receivers, msg.as_string())

MIMEText 第一個參數是郵件內容,第二個參數指定內容類型(plain表示純文本),第三個參數指定編碼。

溫馨提示 :收件人可以是一個列表,一次發(fā)給多個人:

    receivers = ['boss@example.com', 'colleague@example.com']

順帶提一句,如果你要給很多人發(fā)郵件,但又不想讓他們看到彼此的郵箱地址(避免泄露信息),可以用密送(BCC):

    msg['Cc'] = Header('同事A,同事B', 'utf-8')  # 抄送
    msg['Bcc'] = Header('同事C,同事D', 'utf-8')  # 密送

密送的人會收到郵件,但其他收件人不會知道有人被密送。職場暗斗必備技能,老板想悄悄讓你的同事也看看你的工作匯報,哈哈。

發(fā)HTML格式郵件,逼 格瞬間提升

純文本太單調了,HTML格式可以做出花哨的樣式,還能放圖片、表格啥的:

    html_content = """
    <html>
    <body>
        <h1 style="color:red">項目進度報告</h1>
        <p>各位好:</p>
        <p>本周項目進展如下:</p>
        <ul>
            <li>需求分析:<span style="color:green">已完成</span></li>
            <li>系統(tǒng)設計:<span style="color:green">已完成</span></li>
            <li>編碼:<span style="color:orange">進行中 (75%)</span></li>
            <li>測試:<span style="color:red">未開始</span></li>
        </ul>
        <p>詳情請見<a  rel="external nofollow" >完整報告</a></p>
    </body>
    </html>
    """
    
    # 創(chuàng)建HTML郵件
    message = MIMEText(html_content, 'html', 'utf-8')
    message['From'] = Header('項目負責人', 'utf-8')
    message['To'] = Header('項目組', 'utf-8')
    message['Subject'] = Header('每周項目進度', 'utf-8')

就是把 MIMEText 的第二個參數從 ‘plain’ 改成 ‘html’ 就行了,內容寫HTML代碼。這個技能真是救命,以前我每周都要手動排版項目周報,用了自動發(fā)送后,模板一套,數據一填,一鍵發(fā)送,省了大把時間。

需要注意的是,不是所有郵件客戶端都支持所有HTML特性,尤其是那些新潮的CSS3屬性。我有個同事用了漸變背景和彈性布局,結果老板的古董Outlook全亂了。建議保守點用HTML 4和基礎CSS,兼容性最好。

要是想放圖片,直接插入外部圖片鏈接即可:

    <img src="https://example.com/logo.png" alt="公司Logo" />

但這要求收件人能訪問這個圖片鏈接,而且會暴露IP。更專業(yè)的做法是用 內嵌圖片 ,下面我專門講講。

內嵌圖片,讓郵件更專業(yè)

郵件里直接嵌入圖片,不依賴外部鏈接,看起來更專業(yè),也不會被攔截:

    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    
    # 創(chuàng)建復合郵件
    message = MIMEMultipart('related')
    message['From'] = Header('營銷部門', 'utf-8')
    message['To'] = Header('客戶', 'utf-8')
    message['Subject'] = Header('本月促銷活動', 'utf-8')
    
    # HTML內容,引用內嵌圖片
    html = """
    <html>
    <body>
        <h1>五月促銷活動</h1>
        <p>尊敬的客戶:</p>
        <p>查看我們的最新產品:</p>
        <img src="cid:image1" width="500">
        <p>限時八折優(yōu)惠,歡迎選購!</p>
    </body>
    </html>
    """
    message.attach(MIMEText(html, 'html', 'utf-8'))
    
    # 添加圖片
    with open('product.jpg', 'rb') as f:
        img = MIMEImage(f.read())
        img.add_header('Content-ID', '<image1>')  # 與HTML中的cid對應
        message.attach(img)

注意看,圖片引用是通過 cid:image1 這種特殊語法實現的。Content-ID 標簽必須用尖括號包住,而HTML中引用時不用尖括號,這個細節(jié)很容易出錯。

添加附件,才是郵件發(fā)送的完全體

工作中發(fā)郵件哪能只發(fā)文字啊,各種文檔、Excel表格、圖片啥的都得帶上。添加附件也不復雜,就是多寫幾行代碼:

    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.application import MIMEApplication
    import os
    
    # 創(chuàng)建帶附件的郵件
    message = MIMEMultipart()
    message['From'] = Header('數據分析小組', 'utf-8')
    message['To'] = Header('產品經理', 'utf-8')
    message['Subject'] = Header('用戶數據分析報告', 'utf-8')
    
    # 添加郵件正文
    message.attach(MIMEText('附件是本月用戶增長數據,請查收。', 'plain', 'utf-8'))
    
    # 添加Excel附件
    excel_path = 'monthly_report.xlsx'
    with open(excel_path, 'rb') as f:
        excel_attachment = MIMEApplication(f.read())
        excel_attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(excel_path))
        message.attach(excel_attachment)
    
    # 添加PDF附件
    pdf_path = 'analysis_report.pdf'
    with open(pdf_path, 'rb') as f:
        pdf_attachment = MIMEApplication(f.read())
        pdf_attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(pdf_path))
        message.attach(pdf_attachment)

關鍵區(qū)別在于用了 MIMEMultipart 類,它允許組合多個部分成一個完整郵件。PDF、Excel、Word、圖片都能添加,我的周報每次自動帶上三個Excel和一份PPT,完全不用手動操作。

溫馨提示 :如果附件名含中文,可能會亂碼,需要特殊處理:

    from email.header import Header
    
    filename = 'sales_report_中文名.xlsx'
    excel_attachment.add_header('Content-Disposition', 'attachment', 
                               filename=('utf-8', '', filename))

附件大小也要注意,大多數郵箱對附件有大小限制:

  • Gmail: 25MB
  • QQ郵箱: 50MB
  • 企業(yè)郵箱: 取決于管理員設置,通常是10MB-50MB

超出限制郵件發(fā)不出去,要么壓縮附件,要么用云盤分享鏈接。

批量發(fā)送個性化郵件,成為郵件屆的"網紅"

有時候需要給不同人發(fā)不同內容的郵件,比如給客戶發(fā)通知,每個客戶的稱呼、訂單信息都不同。這時就需要批量發(fā)送個性化郵件:

    import pandas as pd
    
    # 假設有個客戶信息表格
    df = pd.read_excel('customers.xlsx')
    
    for index, row in df.iterrows():
        # 創(chuàng)建郵件
        msg = MIMEText(f"""尊敬的{row['name']}:
        
    感謝您購買我們的產品。您的訂單號 {row['order_id']} 已發(fā)貨,
    預計{row['estimated_delivery']}送達。
    如有問題,請聯系我們的客服電話:400-123-4567。
    
    祝好,
    銷售團隊
        """, 'plain', 'utf-8')
        
        msg['From'] = Header('客戶服務部', 'utf-8')
        msg['To'] = Header(row['name'], 'utf-8')
        msg['Subject'] = Header('您的訂單已發(fā)貨', 'utf-8')
        
        # 發(fā)送郵件
        smtp_obj.sendmail('service@example.com', row['email'], msg.as_string())
        print(f"已向 {row['name']} 發(fā)送郵件")
        
        # 適當延時,避免郵件服務器認為是垃圾郵件
        import time
        time.sleep(1)

這段代碼會讀取Excel表格中的客戶信息,然后給每個客戶發(fā)送包含其個人信息的郵件。我以前每天手動發(fā)的周報總結,現在全自動化了,而且還能根據不同部門定制不同內容,同事們都夸我效率高。

溫馨提示 :批量發(fā)送時要控制發(fā)送頻率,太快會被郵件服務器當成垃圾郵件行為,可能導致賬號被封。最好每封郵件間隔1-5秒。

有個前同事因為這事吃了大虧,他一下發(fā)了5000封郵件,結果公司郵箱被服務商封了,整個公司幾百人兩天收不到外部郵件,差點被老板炒魷魚。服務器有發(fā)信額度,通常是每小時幾百封,具體看你的郵箱服務協議。

定時自動發(fā)送,解放你的雙手

手動運行腳本太low了,設置定時任務才是真正的自動化。Python有個schedule庫,專門用來設置定時任務:

    import schedule
    import time
    
    def send_daily_report():
        # 這里放發(fā)送郵件的代碼
        print("發(fā)送每日報告")
    
    def send_weekly_report():
        # 這里放發(fā)送周報的代碼
        print("發(fā)送周報")
    
    # 每天上午9點發(fā)送日報
    schedule.every().day.at("09:00").do(send_daily_report)
    
    # 每周一下午5點發(fā)送周報
    schedule.every().monday.at("17:00").do(send_weekly_report)
    
    # 每月1號發(fā)送月報
    schedule.every().month_start.at("10:00").do(lambda: print("發(fā)送月報"))
    
    # 每隔2小時發(fā)送一次監(jiān)控報告
    schedule.every(2).hours.do(lambda: print("發(fā)送監(jiān)控報告"))
    
    while True:
        schedule.run_pending()
        time.sleep(60)  # 每分鐘檢查一次是否有任務需要執(zhí)行

不過這種方法需要保持程序一直運行,更專業(yè)的做法是用操作系統(tǒng)的定時任務:

  • Windows: 任務計劃程序
  • Linux/Mac: cron jobs

Linux上設置定時任務超簡單,編輯crontab文件:

    crontab -e

加入以下內容設置定時任務:

    # 每天早上9點執(zhí)行
    0 9 * * * python /path/to/send_daily_email.py
    
    # 每周一下午5點執(zhí)行
    0 17 * * 1 python /path/to/send_weekly_email.py

我搞過一個項目監(jiān)控系統(tǒng),服務器出問題就自動發(fā)郵件通知我,大半夜收到郵件爬起來處理問題,救過好幾次火。

Linux的cron表達式有點難記,尤其是星期幾那部分(0和7都表示周日,1-6表示周一到周六)。一個小技巧是用在線cron生成工具,比如crontab.guru,可視化編輯cron表達式,直觀很多。

使用環(huán)境變量保存敏感信息,別把密碼寫在代碼里

直接把郵箱密碼寫在代碼里太危險了,萬一代碼上傳到GitHub,密碼就泄露了。更安全的做法是使用環(huán)境變量:

    import os
    from dotenv import load_dotenv
    
    # 加載環(huán)境變量
    load_dotenv()
    
    # 從環(huán)境變量獲取敏感信息
    email_user = os.getenv('EMAIL_USER')
    email_password = os.getenv('EMAIL_PASSWORD')
    smtp_server = os.getenv('SMTP_SERVER')
    
    # 使用這些變量連接郵箱
    smtp_obj = smtplib.SMTP_SSL(smtp_server, 465)
    smtp_obj.login(email_user, email_password)

創(chuàng)建一個 .env 文件存儲敏感信息:

    EMAIL_USER=your_email@example.com
    EMAIL_PASSWORD=your_password
    SMTP_SERVER=smtp.example.com

記得把 .env 文件添加到 .gitignore 中,這樣就不會被上傳到代碼倉庫了。

如果是生產環(huán)境,建議用專門的密鑰管理服務,比如阿里云KMS、AWS Secrets Manager等。在工作時,我們都用RAM角色授權+KMS管理密鑰,安全性高很多。

處理郵件發(fā)送失敗,加上錯誤重試機制

網絡不穩(wěn)定、郵件服務器偶爾抽風是常態(tài),必須處理異常并重試:

    def send_email_with_retry(sender, receivers, message, max_retries=3):
        retry_count = 0
        while retry_count < max_retries:
            try:
                smtp_obj = smtplib.SMTP_SSL('smtp.example.com', 465)
                smtp_obj.login('username', 'password')
                smtp_obj.sendmail(sender, receivers, message.as_string())
                smtp_obj.quit()
                print("郵件發(fā)送成功")
                return True  # 發(fā)送成功
            except Exception as e:
                retry_count += 1
                print(f"發(fā)送失敗 (嘗試 {retry_count}/{max_retries}): {str(e)}")
                time.sleep(5)  # 等待5秒后重試
        
        print("發(fā)送郵件失敗,已達到最大重試次數")
        return False  # 發(fā)送失敗

這個函數會嘗試發(fā)送郵件,如果失敗會最多重試3次,每次間隔5秒。實際生產環(huán)境中,我設置了重試+告警機制,發(fā)不出去會自動打電話給我。

各種異常情況都需要考慮:

  • smtplib.SMTPAuthenticationError:賬號密碼錯誤
  • smtplib.SMTPRecipientsRefused:收件人被拒絕
  • smtplib.SMTPSenderRefused:發(fā)件人被拒絕
  • smtplib.SMTPDataError:郵件數據錯誤
  • smtplib.SMTPServerDisconnected:與服務器連接中斷
  • socket.gaierror:DNS解析錯誤
  • ConnectionRefusedError:連接被拒絕

不同錯誤要有不同處理策略。比如認證錯誤多半是賬號密碼問題,重試也沒用;但連接中斷可能是網絡波動,重試就有可能成功。

記錄郵件發(fā)送日志,做個有據可查的人

日志是查問題的關鍵,要養(yǎng)成記錄日志的好習慣:

    import logging
    
    # 配置日志
    logging.basicConfig(
        filename='email_sender.log',
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s'
    )
    
    try:
        # 發(fā)送郵件的代碼
        smtp_obj.sendmail(sender, receivers, message.as_string())
        logging.info(f"郵件已成功發(fā)送給 {receivers}")
    except Exception as e:
        logging.error(f"發(fā)送郵件失敗: {str(e)}")

這樣每次發(fā)送的結果都會記錄到日志文件中,以后查問題超方便。

溫馨提示 :生產環(huán)境中建議使用更完善的日志方案,比如按日期切割日志文件、設置日志輪轉等。

    import logging
    from logging.handlers import RotatingFileHandler
    
    # 配置按大小輪轉的日志
    handler = RotatingFileHandler(
        'email_sender.log', 
        maxBytes=10485760,  # 10MB
        backupCount=5
    )
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    logger.addHandler(handler)

這樣日志文件達到10MB時會自動創(chuàng)建新文件,最多保留5個備份文件,不會吃光磁盤空間。

完整實戰(zhàn)例子:每日銷售數據自動郵件系統(tǒng)

最后來個完整實例,整合前面說的所有技巧:

    import smtplib
    import os
    import pandas as pd
    import schedule
    import time
    import logging
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.application import MIMEApplication
    from email.header import Header
    from dotenv import load_dotenv
    from datetime import datetime
    
    # 配置日志
    logging.basicConfig(
        filename='sales_report_sender.log',
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s'
    )
    
    # 加載環(huán)境變量
    load_dotenv()
    EMAIL_USER = os.getenv('EMAIL_USER')
    EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD')
    SMTP_SERVER = os.getenv('SMTP_SERVER')
    
    def generate_sales_report():
        """生成銷售報告,返回報告文件路徑"""
        try:
            # 假設這里連接數據庫,提取數據并生成報告
            # 實際項目中,這里會有數據庫查詢、數據處理、生成圖表等邏輯
            
            # 示例:創(chuàng)建一個簡單的銷售數據Excel
            df = pd.DataFrame({
                '產品': ['產品A', '產品B', '產品C', '產品D'],
                '銷量': [123, 456, 789, 321],
                '收入': [12300, 45600, 78900, 32100]
            })
            
            today = datetime.now().strftime('%Y%m%d')
            report_path = f'sales_report_{today}.xlsx'
            df.to_excel(report_path, index=False)
            
            return report_path
        except Exception as e:
            logging.error(f"生成報告失敗: {str(e)}")
            return None
    
    def send_sales_report(max_retries=3):
        """發(fā)送銷售報告郵件,帶附件和HTML格式內容"""
        logging.info("開始準備發(fā)送銷售報告")
        
        # 生成報告
        report_path = generate_sales_report()
        if not report_path:
            logging.error("無法生成報告,取消發(fā)送郵件")
            return False
        
        # 獲取今天的日期
        today = datetime.now().strftime('%Y-%m-%d')
        yesterday = (datetime.now() - pd.Timedelta(days=1)).strftime('%Y-%m-%d')
        
        # 創(chuàng)建郵件
        message = MIMEMultipart()
        message['From'] = Header('銷售數據分析系統(tǒng)', 'utf-8')
        message['To'] = Header('銷售團隊', 'utf-8')
        message['Subject'] = Header(f'{yesterday} 銷售數據報告', 'utf-8')
        
        # HTML郵件內容
        html_content = f"""
        <html>
        <body>
            <h2 style="color:#003366;">銷售數據日報 - {yesterday}</h2>
            <p>各位銷售經理:</p>
            <p>附件是 <strong>{yesterday}</strong> 的銷售數據報表,主要數據如下:</p>
            <table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse">
                <tr style="background-color:#f2f2f2">
                    <th>指標</th>
                    <th>數值</th>
                    <th>與上周同比</th>
                </tr>
                <tr>
                    <td>總銷售額</td>
                    <td style="text-align:right">¥169,900</td>
                    <td style="color:green">↑ 12.3%</td>
                </tr>
                <tr>
                    <td>訂單數</td>
                    <td style="text-align:right">1,689</td>
                    <td style="color:green">↑ 8.7%</td>
                </tr>
                <tr>
                    <td>平均客單價</td>
                    <td style="text-align:right">¥100.59</td>
                    <td style="color:green">↑ 3.3%</td>
                </tr>
            </table>
            <p>詳細數據請查看附件,如有問題請及時聯系數據組。</p>
            <p style="color:#888888">此郵件由系統(tǒng)自動發(fā)送,請勿回復。</p>
        </body>
        </html>
        """
        
        # 添加HTML內容
        message.attach(MIMEText(html_content, 'html', 'utf-8'))
        
        # 添加Excel附件
        with open(report_path, 'rb') as f:
            attachment = MIMEApplication(f.read())
            attachment_name = os.path.basename(report_path)
            attachment.add_header('Content-Disposition', 'attachment', filename=attachment_name)
            message.attach(attachment)
        
        # 發(fā)送郵件,帶重試機制
        receivers = ['sales_manager@example.com', 'director@example.com', 'ceo@example.com']
        
        retry_count = 0
        while retry_count < max_retries:
            try:
                smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, 465)
                smtp_obj.login(EMAIL_USER, EMAIL_PASSWORD)
                smtp_obj.sendmail(EMAIL_USER, receivers, message.as_string())
                smtp_obj.quit()
                
                logging.info(f"銷售報告郵件成功發(fā)送給 {', '.join(receivers)}")
                
                # 刪除臨時生成的報表文件
                os.remove(report_path)
                return True
                
            except Exception as e:
                retry_count += 1
                logging.warning(f"發(fā)送失敗 (嘗試 {retry_count}/{max_retries}): {str(e)}")
                time.sleep(5)  # 等待5秒后重試
        
        logging.error(f"發(fā)送銷售報告郵件失敗,已達到最大重試次數")
        return False
    
    # 設置定時任務:每天早上8:30發(fā)送報告
    def scheduled_job():
        logging.info("執(zhí)行定時任務:發(fā)送每日銷售報告")
        send_sales_report()
    
    # 如果直接運行腳本,執(zhí)行測試發(fā)送
    if __name__ == "__main__":
        # 設置定時任務
        schedule.every().day.at("08:30").do(scheduled_job)
        
        print("郵件發(fā)送系統(tǒng)已啟動,將在每天 08:30 發(fā)送銷售報告")
        print("按 Ctrl+C 停止程序")
        
        try:
            # 立即發(fā)送一次作為測試
            print("正在發(fā)送測試郵件...")
            result = send_sales_report()
            print("測試郵件發(fā)送結果:", "成功" if result else "失敗")
            
            # 持續(xù)運行,等待定時任務
            while True:
                schedule.run_pending()
                time.sleep(60)
        except KeyboardInterrupt:
            print("程序已停止")

這個完整示例包含了自動生成報表、格式化HTML郵件內容、添加附件、錯誤重試、日志記錄等功能,可以直接部署到服務器上定時運行。我相信每天手動發(fā)數據報表的同學看到這個得笑出聲,太多痛點一次性解決了。

這種自動化郵件系統(tǒng)可以應用在很多場景:

  • 定期發(fā)送各種業(yè)務數據報表
  • 系統(tǒng)監(jiān)控告警通知
  • 客戶關懷自動郵件
  • 訂單狀態(tài)通知
  • 運營數據定時播報

根據實際需求稍作修改就能派上用場。對許多初級程序員來說,Python自動發(fā)郵件可能是接觸自動化的第一步,掌握了這個技能,你就會開始思考:“還有什么工作是可以用程序自動完成的?”

這個思路才是最值錢的。

從這個小小的郵件自動化開始,漸漸把團隊里各種重復性工作都自動化了:數據采集、報表生成、監(jiān)控告警、異常檢測。最后整個團隊的效率提升了3倍多,我也因此拿到了晉升機會。寫代碼最大的樂趣之一,就是用技術解決實際問題,讓自己和同事的工作更輕松。

以上就是基于Python+smtplib實現郵件自動發(fā)送功能的詳細內容,更多關于Python smtplib郵件自動發(fā)送的資料請關注腳本之家其它相關文章!

相關文章

  • 如何讓Python在HTML中運行

    如何讓Python在HTML中運行

    這個名為PyScript的框架,其核心目標是為開發(fā)者提供在標準HTML中嵌入Python代碼的能力,使用?Python調用JavaScript函數庫,并以此實現利用Python創(chuàng)建Web應用的功能,本文給大家介紹Python?HTML運行的案例解析,感興趣的朋友一起看看吧
    2022-05-05
  • 用Python復現二戰(zhàn)德軍enigma密碼機

    用Python復現二戰(zhàn)德軍enigma密碼機

    大家好,本篇文章主要講的是用Python復現二戰(zhàn)德軍enigma密碼機,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • python進程池和線程池的區(qū)別

    python進程池和線程池的區(qū)別

    本文主要介紹了python進程池和線程池的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • Python中canmatrix解析dbc文件應用常見示例

    Python中canmatrix解析dbc文件應用常見示例

    DBC是一種用于描述CAN網絡協議的文件格式,Python作為一種流行的編程語言,也提供了解析DBC文件的相關類庫,這篇文章主要給大家介紹了關于Python中canmatrix解析dbc文件的相關資料,需要的朋友可以參考下
    2024-08-08
  • Django 外鍵的使用方法詳解

    Django 外鍵的使用方法詳解

    這篇文章主要介紹了Django 外鍵的使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • pandas.DataFrame Series排序的使用(sort_values,sort_index)

    pandas.DataFrame Series排序的使用(sort_values,sort_index)

    本文主要介紹了pandas.DataFrame Series排序的使用(sort_values,sort_index),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python入門教程(二十六)Python的模塊

    Python入門教程(二十六)Python的模塊

    這篇文章主要介紹了Python入門教程(二十六)Python的模塊,Python是一門非常強大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • Python?切片為什么不會索引越界?

    Python?切片為什么不會索引越界?

    這篇文章主要介紹了Python?切片為什么不會索引越界?切片(slice)是?Python?中一種很有特色的特性,在正式開始之前,我們先來從關于切片的相關知識開始介紹,感興趣的小伙伴一起參考參考呀</P><P>
    2021-12-12
  • python中字符串類型json操作的注意事項

    python中字符串類型json操作的注意事項

    這篇文章主要給大家介紹了python中字符串類型json操作的一些注意事項,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • python中wheel的用法整理

    python中wheel的用法整理

    在本篇文章里小編給大家整理的是關于python中wheel的用法整理內容,需要的朋友們可以跟著學習下。
    2020-06-06

最新評論

德令哈市| 徐闻县| 如皋市| 通榆县| 乾安县| 方正县| 五家渠市| 沙田区| 黑龙江省| 漳平市| 博爱县| 扶余县| 渭南市| 苍溪县| 恩施市| 鄂伦春自治旗| 濉溪县| 天长市| 扶风县| 安陆市| 澄城县| 杭州市| 安阳县| 灯塔市| 凭祥市| 沧州市| 察雅县| 辽阳市| 诸暨市| 龙州县| 阿图什市| 铜山县| 巢湖市| 大田县| 万盛区| 榆中县| 玛纳斯县| 克什克腾旗| 金阳县| 连平县| 沁阳市|