接入 AWS SES 服务详细教程:Python/Golang 代码示例

需求背景

由于开发的产品用户增长太快,原本托管在飞书邮箱的邮箱验证码功能达到飞书邮箱每日上限,因此考虑采用云服务来代替实现。SES就是各大厂商提供的一个用于发邮件的云服务,相比自己搭建邮箱服务器的话,走SES代发邮件不容易进垃圾邮件,也不用自己管理一个邮箱服务。

详细过程

参考官方文档:设置 Amazon Simple Email Service
https://docs.aws.amazon.com/zh_cn/ses/latest/dg/setting-up.html

在这个过程中,需要下载 AWS 的 SDK:
AWS SDK:https://aws.amazon.com/cn/developer/tools/#sdk
这里我们分别对 Golang 和 Python 版本进行的实现和测试。

【说明】第一次使用 AWS SES 服务时,会处于“沙盒模式”,即只能对验证过的邮箱发送,这个沙盒模式说白了就是内测版,需要满足条件后才能申请然后切入生产模式。

1.在 AWS 上验证电子邮件地址和发送域,电子邮件需要点一个邮件,发送域需要配几个 CNAME 解析;在域名管理系统配置 cname 要细心,有些配置项是不需要加后面的host(比如baidu.com,只需要写www.baidu.com的前面的部分,即www,部分的内容),这个在配置 DKIM 协议时需要特别注意。配置成功后可以用 dig 命令验证一下,或者使用这个 dns在线查询 工具验证下是否配置成功。

2.下载 AWS SDK 以便于 使用 SES API;在使用 SDK 前还需要下载 AWS CLI 配置 access key;

1.安装 aws cli:https://aws.amazon.com/cn/cli/
2.运行 aws configure 配置 IAM 账户的 access key
3.创建IAM子账户,授权SES服务权限,创建访问密钥(本地代码访问)

沙盒审批比较严格,可以找 AWS 商务要审批模板,然后提交审批,审批需要1-3天,可以催商务加急;

代码示例

Python

pip install boto3 
import boto3
from botocore.exceptions import ClientError

def send_email_via_ses(sender, recipient, aws_region, subject, body_text, body_html, charset="UTF-8"):
    # 创建一个SES客户端
    ses = boto3.client('ses', region_name=aws_region)

    # 尝试发送邮件
    try:
        # 提供邮件内容
        response = ses.send_email(
            Destination={
                'ToAddresses': [
                    recipient,
                ],
            },
            Message={
                'Body': {
                    'Html': {
                        'Charset': charset,
                        'Data': body_html,
                    },
                    'Text': {
                        'Charset': charset,
                        'Data': body_text,
                    },
                },
                'Subject': {
                    'Charset': charset,
                    'Data': subject,
                },
            },
            Source=sender,
        )
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        print("Email sent! Message ID:"),
        print(response['MessageId'])

# 配置你的发送和接收邮件地址
SENDER = "admin@xxx" # 配置过 DKIM 协议的域名都可以
RECIPIENT = "xxx" # 沙盒模式收件邮箱也需要经过验证才可以

# 配置AWS区域
AWS_REGION = "us-east-1" # 这个要配置正确

# 邮件主题与内容
SUBJECT = "Amazon SES Test (SDK for Python)"
BODY_TEXT = ("Amazon SES Test (Python)\r\n"
             "This email was sent with Amazon SES using the AWS SDK for Python (Boto)."
            )
BODY_HTML = """<html>
<head></head>
<body>
  <h1>Amazon SES Test (SDK for Python)</h1>
  <p>This email was sent with <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the AWS SDK for Python (Boto).</p>
</body>
</html>
"""

if __name__ == '__main__':
    send_email_via_ses(SENDER, RECIPIENT, AWS_REGION, SUBJECT, BODY_TEXT, BODY_HTML)

Golang

go get -u github.com/aws/aws-sdk-go
package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/service/ses"
)

var Sender = "xxxx"
var Recipient = "xxxx"
var Subject = "Amazon SES Test (AWS SDK for Go)"
var HtmlBody = "<h1>Amazon SES Test Email (AWS SDK for Go)</h1><p>This email was sent with Amazon SES using the AWS SDK for Go.</p>"
var TextBody = "This email was sent with Amazon SES using the AWS SDK for Go."
var Charset = "UTF-8"

func main() {
	awsAccessKeyID := "xxx"
	awsSecretAccessKey := "xxx"
	sess, err := session.NewSession(&aws.Config{
		Region: aws.String("us-east-1"),
		Credentials: credentials.NewStaticCredentials(awsAccessKeyID, awsSecretAccessKey, ""),
	})
	if err != nil {
		fmt.Println("Failed to create session,", err)
		return
	}

	svc := ses.New(sess)

	input := &ses.SendEmailInput{
		Destination: &ses.Destination{
			ToAddresses: []*string{
				aws.String(Recipient),
			},
		},
		Message: &ses.Message{
			Body: &ses.Body{
				Html: &ses.Content{
					Charset: aws.String(Charset),
					Data:    aws.String(HtmlBody),
				},
				Text: &ses.Content{
					Charset: aws.String(Charset),
					Data:    aws.String(TextBody),
				},
			},
			Subject: &ses.Content{
				Charset: aws.String(Charset),
				Data:    aws.String(Subject),
			},
		},
		Source: aws.String(Sender),
	}

	_, err = svc.SendEmail(input)
	if err != nil {
		fmt.Println("Error sending email:", err)
		return
	}

	fmt.Println("Email sent successfully!")
}

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真·skysys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值