所在位置:
首页 >
营销资讯 >
建站知识 > 免费托管域名邮箱:AWS SES + Lambda
免费托管域名邮箱:AWS SES + Lambda
时间:2023-02-10 06:12:01 | 来源:建站知识
时间:2023-02-10 06:12:01 来源:建站知识
本文源自于我的英文Medium:Forwarding Personal Domain Emails to Gmail with AWS Lambda and CloudFormation
QQ邮箱已经停止域名邮箱托管,常见的WorkMail provider简单调查发现可信的提供商,基本都有不同程度的月功能费(GSuite: $6~, AWS WorkMail: $4~, Microsoft 365: $5~),免费的午餐应该只能DIY了。
AWS的Simple Email Service(SES)提供了高可靠性的API,并且有永久免费的Free Tier,感觉是长期托管个人域名邮箱的选项;然而SES并没有内置的存储和web UI,因此还需要转发邮件到其他的个人邮箱,例如Gmail。利用CloudFormation等Infrastructure-as-code工具,本文分享了一个一键生成的Email solution。
先睹为快
代码源文件均保存在Github gist:
https://gist.github.com/willings/7f0310c971278cddada267616a39f091准备工作
- 一个可用的AWS免费 账号(申请)
- 在AWS控制台验证域名的所有权
- 验证收信邮箱(例如@gmail)的所有权
- 安装AWS Cli
配置信息
# Only needed if aws credentials are not set in ~/.aws/config, ensures your IAM user has permission to deploy CloudFormation stackexport AWS_ACCESS_KEY_ID=...export AWS_SECRET_ACCESS_KEY=...export AWS_DEFAULT_REGION=... e.g. us-west-2# Configure domain and destination email informationSTACK_NAME="EmailProxyStack"DOMAINS="mydomain1.com,mydomain2.com"MAIL_RECIPIENT="proxy_destination_email@gmail.com"
创建服务栈
# Get the CloudFormation template file (containing lambda code)curl https://gist.githubusercontent.com/willings/7f0310c971278cddada267616a39f091/raw/43ccabcbb5254375e47a006d7d5878a2afff6eaa/email-proxy-stack.yaml > email-proxy-stack.yaml# Create CloudFormation stack and deployaws cloudformation deploy / --capabilities CAPABILITY_IAM / --template-file email-proxy-stack.yaml / --stack-name ${STACK_NAME} / --parameter-overrides Domains="${DOMAINS}" MailRecipient="${MAIL_RECIPIENT}"
后续操作
- 激活邮件规则过滤(开始接收邮件)
- 向自己的域名邮箱发送测试邮件
- 在Gmail(或者其他的邮箱)上配置规则过滤器来分类收到的邮件
以下内容自动翻译自英文文章工作原理
- 将MX设置更新为SES记录后,域电子邮件将转发到AWS SES:10 inbound-smtp.regionInboundUrl.amazonaws.com,有关详细信息,请参阅SES文档。
- 在“电子邮件规则”过滤器中,我们添加了一个操作,将整个MIME电子邮件消息放入S3存储桶中,以实现并稍后使用。 存储桶中的文件名与电子邮件ID相同。
- 在电子邮件规则过滤器中,存储到S3之后,另一个操作将通过SES通知触发Lambda函数,然后lambda函数代码从S3存储桶中提取电子邮件,并将消息更新为所需的格式,并记录到CloudWatch日志中以供将来搜索。
- Lambda函数调用SES send_raw_email api来转发修改后的电子邮件。
- SES执行SMTP协议以将电子邮件发送到目的地。
更多细节
优点
- 免费(S3服务有1年的有效期,之后可能有很低的费用)
- 无限的电子邮件帐户
- 可靠,与EC2上的自托管电子邮件服务器相比,无需担心服务器停机
为什么要再造一个轮子?
在以下方面,现有的几个例子(参见英文)都不理想:
- 未实现为基础架构即代码,需要大量手动配置,可能会发生人为错误
- AWS博客示例以.eml文件转发,无法在Gmail上本地查看
- Github代码使用基于文本的处理,代码有点复杂; python的内置lib电子邮件包听起来是更好的解决方案
可以改进的地方
- 现在,我们仍然需要手动操作,以将非活动规则集移至活动状态,可以通过在cloudformation堆栈中添加自定义资源lambda来自动执行此步骤。
- 如果处理失败,我们可能希望有一个SNS到SMS的通知,以便我们可以捕获和查看原始电子邮件
故障排除
- 电子邮件未转发到我的目标邮箱,在哪里可以开始调试?
遵循答案2〜5。 - 我怎么知道SES正在处理我的电子邮件?
确保正确设置了域上的MX记录,请注意DNS记录更新可能会有些延迟。某些MX DNS查找工具(例如https://mxtoolbox.com/)也可以帮助进行验证。 - 为什么发送到域的电子邮件被拒绝并显示“地址不可达”?
可能是由于没有激活电子邮件规则过滤器引起的,请检查创建的规则过滤器是否激活。 - 我怎么知道我的lambda正在处理请求?
a) 检查S3存储桶以查看是否存在新文件
b) 检查CloudWatch日志以查看lambda是否有任何处理失败 - 为什么即使正确触发了lambda也无法将代理电子邮件发送到我的目标邮箱?
可能是由于目标邮件地址未列入白名单,默认情况下,SES阻止将电子邮件发送到未验证的域。 - 如何找到在堆栈中创建的资源?
在控制台中检查CloudFormation堆栈,请注意,您可能需要切换到正确的区域。