在营销、通知等场景中,我们经常需要发送格式丰富的 HTML 邮件。本文介绍如何用 Python + boto3,从 S3 读取 HTML 模板并通过 SES 发送邮件。

架构

S3 (HTML模板) → Python脚本 → SES → 收件人

前置条件

  1. AWS 账号已开通 SES 服务,且发件地址已验证
  2. S3 Bucket 中已上传 HTML 模板文件
  3. 本地已配置 AWS 凭证(aws configure 或 IAM Role)
  4. 安装依赖:pip install boto3

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python3
"""从 S3 读取 HTML 模板并通过 SES 发送邮件"""
import boto3

REGION = '<region>'
BUCKET = '<your-bucket-name>'
TEMPLATE_KEY = '<your-template-key>.html'

s3 = boto3.client('s3', region_name=REGION)
ses = boto3.client('ses', region_name=REGION)


def get_html_from_s3(bucket: str, key: str) -> str:
"""从 S3 读取 HTML 内容"""
response = s3.get_object(Bucket=bucket, Key=key)
return response['Body'].read().decode('utf-8')


def send_html_email(to: str, subject: str, html_content: str):
"""发送 HTML 邮件"""
ses.send_email(
Source='<sender-email>',
Destination={'ToAddresses': [to]},
Message={
'Subject': {'Data': subject, 'Charset': 'UTF-8'},
'Body': {'Html': {'Data': html_content, 'Charset': 'UTF-8'}}
}
)
print(f'邮件已发送至 {to}')


if __name__ == '__main__':
html = get_html_from_s3(BUCKET, TEMPLATE_KEY)
send_html_email('<recipient-email>', '测试邮件', html)

关键点说明

  • get_html_from_s3:通过 s3.get_object 拉取 HTML 文件内容,注意 decode(‘utf-8’) 确保中文正常显示
  • send_html_email:调用 ses.send_email,将 HTML 作为邮件 Body 发送,指定 Charset: UTF-8 避免乱码
  • Source 地址必须是 SES 中已验证的邮箱或域名

月度TODO

  • 极限科技 4篇文章
  • 懒猫微服 4篇文章
  • 生活感悟1篇
  • 纯技术文章 2篇
  • 英语

懒猫微服实战入门(三十六):懒猫微服QEMU虚拟机快速上手

对于 NAS 玩家来说,虚拟机绝对是标配。今天我们要介绍的主角是 QEMU。你可能会觉得它太过底层、全命令行操作太硬核,但别担心,看过这篇文章之后,你就能轻松在懒猫微服上操作它。

在传统 Linux 下装 QEMU,你可能要折腾一堆 kvm-ok 检测、各种动态库依赖。但在懒猫微服上,直接从商店下载即可。这就是全容器化的好处:环境全封闭,不会把宿主机的依赖搞坏,不用再和底层依赖打交道,这就是懒猫微服全容器化的好处,彻底解决了让人头疼的环境问题。

image-20260226215103173

阅读更多

Easysearch 数据映射之 Deep Dive:我踩过的 Volume 坑

最近在用 Docker 部署 Easysearch,本以为是个简单的事情,结果在数据持久化上栽了跟头,每次停止再启动容器之后都会503,在后面成了我百思不得其解的问题,后来一直在某次的meetup中,请教了原厂的罗老师,一句话点醒梦中人,Easysearch用的具名卷,防止宿主机的数据覆盖容器里的数据。

阅读更多

超效率手册

  1. 周/日 计划

  2. 限制时间做事(30-90min) 紧迫感、

  3. 任务分解

  4. 短跑。起床坚持10分钟,其他事再坚持20分钟休息。 短跑30天习惯

  5. 日程校对,相信自己要做的事情。完全日程,避免过度工作和拖延。

  6. 自律。停下来之前再坚持10分钟。下次做事再坚持10-20%,专注一件事

  7. 语录刺激生产效率(便利贴

阅读更多

给Macbook Pro安装Fedora Asahi Remix

16G的Macbook 经常出问题,应该是内存太小吧,所以安装一个Linux做双系统吧,Asahi搞定UEFI这层,本质上还是Fedora。

655cadefb7a4b564f74c0f5e98948e51

起码目前阶段对我的M2 Macbook 兼容还不错,打算尝尝鲜。

阅读更多

安卓ADB提取APK安装包

之前的文章写了如何使用无线调试ADB,那么我们就可以用adb提取安装包了。

1
adb shell pm list packages

这里会列出很多app的包名,如果你知道叫啥名字页可以grep过滤一下。

然后,可以用这个命令看包名的地址。会给一个地址

1
adb shell pm path <包名>

然后使用adb pull这个地址,就可以在当前路径得到apk。

1
adb pull <地址>

记一次硬盘满了导致 Coco Server 无法启动的排查

这次排查非常典型:容器日志看起来像“卡在某一行”,Easysearch 甚至已经启动,但 Coco Server 的进程并没有真正跑起来。

最后发现根因是:磁盘剩余空间不足(< 5GB)触发 coco 自检阈值,直接 panic 退出,造成了“日志一直卡住、服务一直起不来”的假象,差不多排查了半个多小时。

背景:目标与现象

目标是在 RK3566 / Armbian 上把 cocoai-arm:test 跑起来,并通过宿主机端口访问服务:

  • 宿主机映射:-p 9000:9000

  • 容器挂载 volume:

    • coco_data_vol:/app/easysearch/data
    • coco_config_vol:/app/easysearch/config
    • coco_logs_vol:/app/easysearch/logs
阅读更多

RK3566嵌入式开发板运行Coco AI Sever

之前在泰山派上运行了Easysearch,这次也想着是不是可以在泰山派开发板RK3566上运行Coco server,毕竟这板子功耗小,适合常开。

我的RK3566上是Armbian,但是没有配置网络环境,访问Dockerhub有问题,所以从Macbook 上下载玩,然后通过离线方式导成tar文件。我的镜像改了tag叫做cocoai-arm:test,你也可以不改。

1
docker save -o cocoai-arm_test.tar cocoai-arm:test

然后通过SCP上传到RK3566的开发板

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×