AI生成郵件發送腳本(帶附件/HTML排版)與定時爬取網站→郵件通知(價格監控原型)

想象一下:每天早晨咖啡還沒喝完,你的郵箱就自動收到了心儀商品的最新價格;重要報告準時帶著專業排版的附件發送到客戶手中——這一切不需要你手動操作。本文將用不到100行代碼帶你實現這兩個自動化神器!

一、為什么我們需要自動化郵件系統?

在數字化時代,自動郵件通知已成為效率利器:

  • 電商價格監控(立省30%購物預算)
  • 系統異常實時報警(運維必備)
  • 日報/周報自動發送(告別重復勞動)
  • 注冊驗證碼發送(用戶觸達核心)

傳統痛點:手動發郵件耗時、易遺漏;郵件排版混亂;附件添加繁瑣

我們的解決方案

Python腳本
郵件發送引擎
網頁爬蟲
價格數據
收件箱

二、環境準備:3分鐘快速搭建

# 安裝核心庫
pip install schedule requests beautifulsoup4 yagmail
  • schedule:輕量級定時任務調度
  • yagmail:史上最簡單的Python發郵件庫
  • beautifulsoup4:HTML解析神器

三、AI生成郵件發送腳本(帶附件/HTML排版)

3.1 基礎文本郵件發送

import yagmail# 配置郵箱 (以QQ郵箱為例)
yag = yagmail.SMTP(user='your_email@qq.com',password='xxxxxxxxxx',  # 授權碼非登錄密碼!host='smtp.qq.com',port=465
)# 發送簡單郵件
yag.send(to='recipient@example.com',subject='AI自動郵件測試',contents='你好,這是一封由Python自動發送的郵件!'
)

重要提示:各大郵箱獲取授權碼方式:

  • QQ郵箱:設置 → 賬戶 → POP3/IMAP服務 → 生成授權碼
  • 163郵箱:設置 → POP3/SMTP/IMAP → 開啟服務

3.2 發送HTML格式專業郵件

html_content = """
<!DOCTYPE html>
<html>
<head><style>.card {border: 1px solid #e0e0e0;border-radius: 8px;padding: 20px;font-family: Arial, sans-serif;}.header {color: #2c3e50;border-bottom: 2px solid #3498db;padding-bottom: 10px;}.highlight {background-color: #f9f9f9;padding: 15px;border-left: 4px solid #3498db;}</style>
</head>
<body><div class="card"><h1 class="header">每日數據報告</h1><p>尊敬的客戶,以下是您關注的最新數據:</p><div class="highlight"><h3>核心指標</h3><ul><li>網站訪問量:<strong>12,458</strong></li><li>轉化率:<strong>8.7%</strong></li><li>異常事件:<span style="color:green">0</span></li></ul></div><p>本郵件由AI系統自動生成,請勿直接回復</p></div>
</body>
</html>
"""yag.send(to='recipient@example.com',subject='帶HTML排版的專業郵件',contents=[html_content]
)

效果對比

文本郵件HTML郵件
單調的純文本企業級卡片式設計
無樣式無色彩支持CSS自定義樣式
無法嵌入圖表可集成動態數據可視化

3.3 添加附件的進階技巧

# 單個附件
yag.send(to='recipient@example.com',subject='重要文件請查收',contents='請查看附件中的季度報告',attachments='/path/to/report.pdf'
)# 多個附件 + HTML內容
attachments = ['/data/report.pdf','/data/sales.xlsx','/images/chart.png'
]yag.send(to=['person1@domain.com', 'person2@domain.com'],  # 支持群發cc='manager@company.com',  # 抄送功能subject='多附件郵件演示',contents=[html_content, '\n\n附件包含詳細數據'],attachments=attachments
)

3.4 常見問題排雷指南

  1. SSL連接錯誤

    # 增加SSL上下文配置
    import ssl
    context = ssl.create_default_context()yag = yagmail.SMTP(user='your_email@qq.com',password='xxxxxxxxxx',host='smtp.qq.com',port=465,smtp_ssl=True,smtp_ssl_context=context
    )
    
  2. 大附件發送失敗

    • Gmail限制25MB,QQ郵箱限制50MB
    • 解決方案:使用云存儲鏈接代替附件
    contents = f"下載鏈接:https://cloud.com/report.pdf"
    

四、定時爬取網站→郵件通知(價格監控原型)

4.1 網頁爬蟲核心實現

import requests
from bs4 import BeautifulSoupdef monitor_price(url, css_selector):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 檢查HTTP錯誤soup = BeautifulSoup(response.text, 'html.parser')price_element = soup.select_one(css_selector)if not price_element:return None, "價格元素未找到"# 清洗價格數據price_text = price_element.text.strip()price = float(price_text.replace('¥', '').replace(',', ''))return price, "成功獲取價格"except Exception as e:return None, f"爬取失敗: {str(e)}"# 示例:監控京東MacBook價格
macbook_url = "https://item.jd.com/100043477122.html"
selector = ".price .plus-price span"  # 通過瀏覽器檢查元素獲取

4.2 CSS選擇器定位技巧

定位方式示例適用場景
類選擇器.product-price大多數電商網站
ID選擇器#priceblock_ourpriceAmazon特色
屬性選擇器[data-price]動態加載頁面
層級選擇器div.price span.current復雜嵌套結構

調試技巧:在Chrome開發者工具中使用$('css_selector')實時測試

4.3 價格監控邏輯實現

import time
import scheduleTARGET_PRICE = 8999.0  # 目標價格閾值
CHECK_INTERVAL = 60 * 4  # 每4小時檢查一次def price_check_job():current_price, status = monitor_price(macbook_url, selector)if current_price is None:print(f"[{time.ctime()}] 監控失敗: {status}")returnprint(f"[{time.ctime()}] 當前價格: ¥{current_price:.2f}")# 價格低于閾值時觸發郵件if current_price <= TARGET_PRICE:alert_msg = f"""<h2>價格警報!🚨</h2><p>MacBook Pro 14 價格已降至 <strong style="color:red">¥{current_price:.2f}</strong></p><p>立即購買:<a href="{macbook_url}">商品鏈接</a></p>"""yag.send(to='your_phone@139.com',  # 短信郵箱提醒subject='【降價提醒】MacBook Pro 14',contents=alert_msg)print("價格警報已發送!")# 設置定時任務
schedule.every(CHECK_INTERVAL).seconds.do(price_check_job)# 保持腳本運行
while True:schedule.run_pending()time.sleep(1)

4.4 反爬蟲策略應對方案

  1. IP被封禁

    • 使用代理IP池(推薦快代理、芝麻代理)
    proxies = {"http": "http://user:pass@10.10.1.10:3128"}
    response = requests.get(url, proxies=proxies)
    
  2. 驗證碼攔截

    • 降低請求頻率(間隔>30秒)
    • 使用Selenium模擬瀏覽器
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get(url)
    price = driver.find_element_by_css_selector(selector).text
    
  3. 動態加載數據

    • 使用Selenium等待元素加載
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, selector))
    )
    

五、項目升級:企業級解決方案

5.1 架構優化方案

商品
股票
低于閾值
異常波動
定時任務
監控目標
電商爬蟲
API接口
數據清洗
價格分析引擎
郵件通知
短信報警

5.2 添加數據庫存儲

import sqlite3
import datetimedef save_price_record(item_id, price):conn = sqlite3.connect('price_monitor.db')c = conn.cursor()# 創建表c.execute('''CREATE TABLE IF NOT EXISTS prices(id INTEGER PRIMARY KEY AUTOINCREMENT,item_id TEXT,price REAL,timestamp DATETIME)''')# 插入數據c.execute("INSERT INTO prices (item_id, price, timestamp) VALUES (?, ?, ?)",(item_id, price, datetime.datetime.now()))conn.commit()conn.close()# 在獲取價格后調用
save_price_record("jd_100043477122", current_price)

5.3 多商品監控配置

// config.json
[{"name": "MacBook Pro 14","url": "https://item.jd.com/100043477122.html","selector": ".price .plus-price span","target_price": 8999.0},{"name": "iPhone 15 Pro","url": "https://www.apple.com/cn/shop/buy-iphone/iphone-15-pro","selector": ".rc-prices-fullprice","target_price": 7999.0}
]

5.4 價格趨勢分析可視化

import matplotlib.pyplot as plt
import pandas as pd# 從數據庫讀取數據
conn = sqlite3.connect('price_monitor.db')
df = pd.read_sql_query("SELECT * FROM prices WHERE item_id='jd_100043477122'", conn)# 繪制價格曲線
plt.figure(figsize=(10, 6))
plt.plot(pd.to_datetime(df['timestamp']), df['price'], 'b-', marker='o')
plt.title('MacBook Pro 14 價格趨勢')
plt.xlabel('日期')
plt.ylabel('價格 (¥)')
plt.grid(True)# 保存為圖片并發送
chart_path = '/tmp/price_trend.png'
plt.savefig(chart_path)# 在郵件中包含趨勢圖
yag.send(to='your_email@example.com',subject='每周價格趨勢報告',contents='<h1>最新價格走勢分析</h1>',attachments=chart_path
)

六、部署到生產環境

6.1 Linux服務器后臺運行

# 安裝必要環境
sudo apt update
sudo apt install python3-pip chromium-chromedriver# 安裝Python依賴
pip install -r requirements.txt# 使用nohup后臺運行
nohup python monitor.py > monitor.log 2>&1 &# 查看日志
tail -f monitor.log

6.2 使用Systemd管理服務

# /etc/systemd/system/price-monitor.service
[Unit]
Description=Price Monitor Service
After=network.target[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/price-monitor
ExecStart=/usr/bin/python3 /home/ubuntu/price-monitor/monitor.py
Restart=always[Install]
WantedBy=multi-user.target
# 啟動服務
sudo systemctl start price-monitor# 設置開機自啟
sudo systemctl enable price-monitor# 查看狀態
sudo systemctl status price-monitor

七、最佳實踐與法律邊界

合法爬蟲的黃金法則

  1. 遵守robots.txt:檢查目標網站是否允許爬取
  2. 限制請求頻率:≥5秒/請求,避免造成服務器壓力
  3. 尊重版權數據:不爬取明確禁止的商業數據
  4. 用戶隱私保護:絕不收集用戶個人信息

推薦公共API優先:

  • 電商:Amazon Product API, 京東宙斯API
  • 金融:Alpha Vantage, Yahoo Finance
  • 社交媒體:Twitter API, Facebook Graph API

八、項目擴展方向

  1. 多協議通知集成

    • 企業微信機器人
    • Slack/Discord Webhook
    • 手機Push通知(Bark服務)
  2. 智能比價系統

    • 跨平臺比價(京東/天貓/拼多多)
    • 歷史價格查詢
    • 降價預測模型
  3. 云函數部署

    # 騰訊云函數示例
    def main_handler(event, context):price_check_job()return "Execution completed"
    
  4. 可視化監控面板

    • 使用Flask/Django開發Web界面
    • 實時展示監控狀態
    • 微信小程序集成

結語:開啟你的自動化之旅

通過本文,你已經掌握了:

  • ? 專業HTML郵件的自動發送
  • ? 郵件附件的靈活管理
  • ? 網頁數據的精準爬取
  • ? 價格監控的完整實現
  • ? 企業級部署方案

自動化不是取代人類,而是將我們從重復勞動中解放,去做更有創造性的工作。 想象一下,當你的腳本在深夜為你監控到心儀商品的折扣,那種“科技服務于人”的成就感,正是編程的魅力所在!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915279.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vLLM 學習】Encoder Decoder Multimodal

vLLM 是一款專為大語言模型推理加速而設計的框架&#xff0c;實現了 KV 緩存內存幾乎零浪費&#xff0c;解決了內存管理瓶頸問題。 更多 vLLM 中文文檔及教程可訪問 →https://vllm.hyper.ai/ *在線運行 vLLM 入門教程&#xff1a;零基礎分步指南 源碼 examples/offline_inf…

【MySQL筆記】視圖

目錄一、什么是視圖&#xff1f;二、使用視圖的優勢三、視圖的創建與使用四、不能更新視圖的場景五、刪除視圖六、總結一、什么是視圖&#xff1f; 視圖&#xff08;View&#xff09;是一種虛擬表&#xff0c;不存儲實際數據&#xff0c;而是通過執行預定義的查詢動態生成數據…

【RK3576】【Android14】分區劃分

獲取更多相關的【RK3576】【Android14】驅動開發&#xff0c;可收藏系列博文&#xff0c;持續更新中&#xff1a; 【RK3576】Android 14 驅動開發實戰指南

Datawhale 25年7月組隊學習coze-ai-assistant Task1學習筆記:動手實踐第一個AI Agent—英倫生活口語陪練精靈

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一條流水線&#xff0c;把復雜的任務拆分成多個簡單的步驟&#xff0c;每一步都有明確的目標和流程。1.2智能體和工作流的區別 智能體&#xff08;AI Agent&#xff09; **是什么 &#xff1a;**智能體是一個自動化的“助手”…

Webpack插件開發深度指南:從原理到實戰

Webpack插件是前端工程化的核心引擎&#xff0c;本文將帶你深入插件開發全流程&#xff0c;實現一個功能完整的資源清單插件&#xff0c;并揭示Tapable事件系統的核心原理。 一、Webpack插件機制解析 1.1 插件架構核心&#xff1a;Tapable事件系統 Webpack基于Tapable構建了…

2、Redis持久化詳解

Redis持久化詳解 文章目錄 Redis持久化詳解 前言 RDB和AOF的區別 RDB和AOF的優缺點 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(嘗試修復會刪除aof文件內容) 3、AOF 重寫功能 新增知識點: 新增知識點: 前言 Redis是一種高級 key-value 型的NoSQL數據庫。它跟mem…

curl 命令詳解

curl 命令的 -d/–data 和 --data-urlencode 的區別 curl 命令的 -d/–data 和 --data-urlencode 都用于發送 HTTP POST 請求的數據&#xff0c;但關鍵區別在于 是否自動對數據進行 URL 編碼。以下是詳細對比&#xff1a; curl 命令的 -d/--data 和 --data-urlencode 都用于發送…

ubuntu下好用的錄屏工具

以下是 vokoscreen 的安裝教程&#xff0c;適用于 Linux 系統。vokoscreen 是一款簡單易用的屏幕錄制工具&#xff0c;支持錄制屏幕、攝像頭和音頻。 安裝 vokoscreen vokoscreen 提供了多種安裝方式&#xff0c;包括通過包管理器、Deb 包或 AppImage 文件。 方法 1&#xf…

筆試大題20分值(用兩個棧實現隊列)

目錄前言一、原題二、解題思路三、代碼實現&#xff08;c/c&#xff09;C語言代碼C代碼實現結語前言 目前博主在處于秋招求職的關鍵時期&#xff0c;在暑假這段時間會頻繁更新博客&#xff0c;想在暑假期間把一些常考的面試和筆試題過一下&#xff0c;利用這兩個月沉淀一下技術…

【知識掃盲】tokenizer.json中的vocab和merges是什么?

在自然語言處理里&#xff0c;tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 庫生成的&#xff0c;它是分詞器配置的核心文件。這里面的 vocab 和 merges 是子詞分詞算法&#xff08;像 BPE 這種&#xff09;的重要構成要素。下面為你詳細解釋它們的作用和工作原理&…

【安卓筆記】RxJava的Hook機制,整體攔截器

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 使用場景 整個項目都是用了RxJava&#xff0c;需要對 整個/部分 項目…

NX二次開發常用函數——從一個坐標系到另一個坐標系的轉換(UF_MTX4_csys_to_csys )相同體坐標轉化

再做項目時相信大家都會用到坐標轉化,例如,我之前寫的案例分享中的博客都用到過,之前總是找借口進行if else判斷,雖然可以實現,但是比起坐標變換無論代碼復雜程度還是運行速度都比較差,之前參加過曹大師的教學訓練營,但是明顯感覺到大佬寫代碼的邏輯性以及模塊化能力都比…

數據庫防止數組字符串序列化

請求接到數組["aa","bb"]后,后端需要轉換成字符串Java 8 使用 String.join()String[] arr {"aa", "bb"}; String str String.join(",", arr); // "aa,bb"如果采用其他轉換,在字段存入數據庫后會["\"a…

若依框架文件上傳返回路徑端口錯誤 - Nginx代理環境下serverConfig.getUrl()獲取端口異常

目錄一 、問題描述二、問題現象三、問題根本原因3.1 代碼分析3.2 問題核心四、解決方案五、總結一 、問題描述 在使用若依框架進行項目開發時&#xff0c;遇到了一個令人困擾的問題&#xff1a;文件上傳功能在本地開發環境運行正常&#xff0c;但部署到服務器后&#xff0c;上…

使用PyInstaller打包 Python 工程

引言:大模型是個好工具,盡管好多內容都是拼湊的,但是整理學到的就是自己的。因工作需要隱藏python源代碼,方法有PyInstaller 、Cpython等多種方法,PyInstaller更為常用,PyInstaller打包 Python 工程步驟整理如下: 一、確保系統環境準備就緒 安裝 Python 和 pip 確認版本…

Python 程序設計講義(1):PyCharm 安裝教程

Python 程序設計講義&#xff08;1&#xff09;&#xff1a;PyCharm 安裝教程 一、安裝 Python 解釋器 1、下載 Python 安裝文件 點擊如下鏈接進入 Python 官網&#xff1a; https://www.python.org/ 在彈出的頁面中單擊【Downloads】&#xff0c;然后單擊下面的【Download Pyt…

uniapp云打包安卓

1、基礎云打包 2、修改logo3、怎么實現下拉菜單4、修改啟動頁啟動頁默認這樣 5、URL Scheme頁面跳轉

Python----NLP自然語言處理(英文分詞器--NLTK)

一、NLTK_介紹NLTK&#xff08;Natural Language Toolkit&#xff0c;自然語言處理工具包&#xff09;&#xff0c;一個主要用于清洗和處理英文文本的Python工具包。它有很多的功能&#xff0c;我們主要使用的是它的分詞功能&#xff0c;之前講過中文分詞是比較復雜的&#xff…

傳統瀏覽器過時了?Dia如何用AI重新定義上網體驗

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交給時間 &#x1f3e0; &#xff1a;小破站 傳統瀏覽器過時了&#xff1f;Dia如何用AI重新定義上網體驗它是什么核心功能搜索編程左右互動感謝…

基于DTLC-AEC與DTLN的輕量級實時語音增強系統設計與實現

基于DTLC-AEC與DTLN的輕量級實時語音增強系統設計與實現 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。 1. 引言 在當今的互聯網通信時代,實時語音通信已成為人們日常生活中不可或缺的一部分。然而,語音通信質量常…