想象一下:每天早晨咖啡还没喝完,你的邮箱就自动收到了心仪商品的最新价格;重要报告准时带着专业排版的附件发送到客户手中——这一切不需要你手动操作。本文将用不到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. 引言 在当今的互联网通信时代,实时语音通信已成为人们日常生活中不可或缺的一部分。然而,语音通信质量常…