基于Python+smtplib實現(xiàn)郵件自動發(fā)送功能
引言
工作中總有各種郵件需要定期發(fā)送,手動操作不僅繁瑣還容易忘記。Python的smtplib庫完美解決這個痛點,幾行代碼就能搞定郵件自動發(fā)送,還能加上附件、HTML格式美化、定時任務等花樣玩法。我用這招把每天半小時的郵件工作縮減到幾分鐘,工作效率直接起飛。
smtplib是啥玩意兒
smtplib是Python自帶的一個庫,專門用來發(fā)送郵件的。SMTP(Simple Mail Transfer Protocol)就是簡單郵件傳輸協(xié)議,是互聯(lián)網(wǎng)上用來發(fā)送郵件的標準。這個庫把復雜的協(xié)議細節(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ā)送這幾步。
溫馨提示 :這個代碼敲完不一定能直接跑,因為現(xiàn)在各大郵箱為了安全都開啟了授權碼登錄,你得到郵箱設置里去申請一個授權碼,用這個碼來替代密碼登錄。
連接郵箱服務器,這事有點講究
連郵箱服務器有兩種方式:普通連接和SSL加密連接?,F(xiàn)在基本都用第二種,安全嘛。
普通連接:
smtp_obj = smtplib.SMTP('smtp.example.com', 25) # 25是SMTP協(xié)議的默認端口
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è)郵箱:一般管理員會分配
不同郵箱叫法可能不同,像什么"安全碼"、“應用專用密碼”、“授權碼”,反正不是你平時登錄的那個密碼就對了。
也有人問為啥現(xiàn)在郵箱這么麻煩,整這種授權碼。別抱怨,這是為了安全。想想看,你平時登錄密碼要是泄露了,一切都完蛋。但授權碼只能用于郵件收發(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 第一個參數(shù)是郵件內容,第二個參數(shù)指定內容類型(plain表示純文本),第三個參數(shù)指定編碼。
溫馨提示 :收件人可以是一個列表,一次發(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 的第二個參數(shù)從 ‘plain’ 改成 ‘html’ 就行了,內容寫HTML代碼。這個技能真是救命,以前我每周都要手動排版項目周報,用了自動發(fā)送后,模板一套,數(shù)據(jù)一填,一鍵發(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>查看我們的最新產(chǎn)品:</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 這種特殊語法實現(xiàn)的。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('數(shù)據(jù)分析小組', 'utf-8')
message['To'] = Header('產(chǎn)品經(jīng)理', 'utf-8')
message['Subject'] = Header('用戶數(shù)據(jù)分析報告', 'utf-8')
# 添加郵件正文
message.attach(MIMEText('附件是本月用戶增長數(shù)據(jù),請查收。', '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))附件大小也要注意,大多數(shù)郵箱對附件有大小限制:
- Gmail: 25MB
- QQ郵箱: 50MB
- 企業(yè)郵箱: 取決于管理員設置,通常是10MB-50MB
超出限制郵件發(fā)不出去,要么壓縮附件,要么用云盤分享鏈接。
批量發(fā)送個性化郵件,成為郵件屆的"網(wǎng)紅"
有時候需要給不同人發(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']}:
感謝您購買我們的產(chǎn)品。您的訂單號 {row['order_id']} 已發(fā)貨,
預計{row['estimated_delivery']}送達。
如有問題,請聯(lián)系我們的客服電話: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ā)的周報總結,現(xiàn)在全自動化了,而且還能根據(jù)不同部門定制不同內容,同事們都夸我效率高。
溫馨提示 :批量發(fā)送時要控制發(fā)送頻率,太快會被郵件服務器當成垃圾郵件行為,可能導致賬號被封。最好每封郵件間隔1-5秒。
有個前同事因為這事吃了大虧,他一下發(fā)了5000封郵件,結果公司郵箱被服務商封了,整個公司幾百人兩天收不到外部郵件,差點被老板炒魷魚。服務器有發(fā)信額度,通常是每小時幾百封,具體看你的郵箱服務協(xié)議。
定時自動發(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 中,這樣就不會被上傳到代碼倉庫了。
如果是生產(chǎn)環(huán)境,建議用專門的密鑰管理服務,比如阿里云KMS、AWS Secrets Manager等。在工作時,我們都用RAM角色授權+KMS管理密鑰,安全性高很多。
處理郵件發(fā)送失敗,加上錯誤重試機制
網(wǎng)絡不穩(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ā)送郵件失敗,已達到最大重試次數(shù)")
return False # 發(fā)送失敗這個函數(shù)會嘗試發(fā)送郵件,如果失敗會最多重試3次,每次間隔5秒。實際生產(chǎn)環(huán)境中,我設置了重試+告警機制,發(fā)不出去會自動打電話給我。
各種異常情況都需要考慮:
smtplib.SMTPAuthenticationError:賬號密碼錯誤smtplib.SMTPRecipientsRefused:收件人被拒絕smtplib.SMTPSenderRefused:發(fā)件人被拒絕smtplib.SMTPDataError:郵件數(shù)據(jù)錯誤smtplib.SMTPServerDisconnected:與服務器連接中斷socket.gaierror:DNS解析錯誤ConnectionRefusedError:連接被拒絕
不同錯誤要有不同處理策略。比如認證錯誤多半是賬號密碼問題,重試也沒用;但連接中斷可能是網(wǎng)絡波動,重試就有可能成功。
記錄郵件發(fā)送日志,做個有據(jù)可查的人
日志是查問題的關鍵,要養(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ā)送的結果都會記錄到日志文件中,以后查問題超方便。
溫馨提示 :生產(chǎn)環(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)例子:每日銷售數(shù)據(jù)自動郵件系統(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:
# 假設這里連接數(shù)據(jù)庫,提取數(shù)據(jù)并生成報告
# 實際項目中,這里會有數(shù)據(jù)庫查詢、數(shù)據(jù)處理、生成圖表等邏輯
# 示例:創(chuàng)建一個簡單的銷售數(shù)據(jù)Excel
df = pd.DataFrame({
'產(chǎn)品': ['產(chǎn)品A', '產(chǎn)品B', '產(chǎn)品C', '產(chǎn)品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('銷售數(shù)據(jù)分析系統(tǒng)', 'utf-8')
message['To'] = Header('銷售團隊', 'utf-8')
message['Subject'] = Header(f'{yesterday} 銷售數(shù)據(jù)報告', 'utf-8')
# HTML郵件內容
html_content = f"""
<html>
<body>
<h2 style="color:#003366;">銷售數(shù)據(jù)日報 - {yesterday}</h2>
<p>各位銷售經(jīng)理:</p>
<p>附件是 <strong>{yesterday}</strong> 的銷售數(shù)據(jù)報表,主要數(shù)據(jù)如下:</p>
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse">
<tr style="background-color:#f2f2f2">
<th>指標</th>
<th>數(shù)值</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>訂單數(shù)</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>詳細數(shù)據(jù)請查看附件,如有問題請及時聯(lián)系數(shù)據(jù)組。</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ā)送銷售報告郵件失敗,已達到最大重試次數(shù)")
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ā)數(shù)據(jù)報表的同學看到這個得笑出聲,太多痛點一次性解決了。
這種自動化郵件系統(tǒng)可以應用在很多場景:
- 定期發(fā)送各種業(yè)務數(shù)據(jù)報表
- 系統(tǒng)監(jiān)控告警通知
- 客戶關懷自動郵件
- 訂單狀態(tài)通知
- 運營數(shù)據(jù)定時播報
根據(jù)實際需求稍作修改就能派上用場。對許多初級程序員來說,Python自動發(fā)郵件可能是接觸自動化的第一步,掌握了這個技能,你就會開始思考:“還有什么工作是可以用程序自動完成的?”
這個思路才是最值錢的。
從這個小小的郵件自動化開始,漸漸把團隊里各種重復性工作都自動化了:數(shù)據(jù)采集、報表生成、監(jiān)控告警、異常檢測。最后整個團隊的效率提升了3倍多,我也因此拿到了晉升機會。寫代碼最大的樂趣之一,就是用技術解決實際問題,讓自己和同事的工作更輕松。
以上就是基于Python+smtplib實現(xiàn)郵件自動發(fā)送功能的詳細內容,更多關于Python smtplib郵件自動發(fā)送的資料請關注腳本之家其它相關文章!
相關文章
手把手教你快速安裝gpu版本的pytorch(詳細圖文教程)
在Windows?10上安裝PyTorch時,通常默認安裝的是CPU版本,且下載速度較慢,本文提供了一個詳細的安裝指南,包括如何檢查CUDA版本、選擇合適的PyTorch、torchvision和torchaudio版本,并通過pip而非conda進行安裝,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-09-09

