使用AWS SES SDK V2发送邮件时特殊字符的Go转义问题
AWS SES SDK V2发送含特殊字符发件人名称报错的解决方法
使用AWS SES SDK V2发送邮件时,当发件人名称包含特殊字符(如Michael čisto),直接拼接地址字符串传入SendEmailInput会触发以下错误:operation error SESv2: SendEmail, https response error StatusCode: 400, BadRequestException: Missing '"'
用户的Go代码如下:
package main import ( "context" "github.com/aws/aws-sdk-go-v2/aws" awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sesv2" "github.com/aws/aws-sdk-go-v2/service/sesv2/types" ) func main() { name := "Michael čisto" body := "test email body" subject := "test email" CharSet := "UTF-8" /* Assemble the email */ input := &sesv2.SendEmailInput{ Destination: &types.Destination{ CcAddresses: []string{}, ToAddresses: []string{receiverEmail}, }, Content: &types.EmailContent{ Simple: &types.Message{ Body: &types.Body{ Html: &types.Content{ Charset: aws.String(CharSet), Data: aws.String(body), }, }, Subject: &types.Content{ Charset: aws.String(CharSet), Data: aws.String(subject), }, }, }, ReplyToAddresses: []string{"\"" + name + "\" <" + senderEmail + ">"}, FromEmailAddress: aws.String("\"" + name + "\" <" + senderEmail + ">"), } cfg, err := awsconfig.LoadDefaultConfig(context.TODO(), awsconfig.WithRegion("us-east-1"), ) client := sesv2.NewFromConfig(cfg) emailResp, err = client.SendEmail(context.TODO(), input) }
解决方法
问题根源是手动拼接的地址格式不符合RFC 5322邮件地址规范,非ASCII字符需要正确编码后才能被SES识别。推荐两种方式处理:
方式一:使用net/mail包构建合规地址
Go标准库的net/mail包可以自动处理特殊字符编码,生成符合规范的地址字符串:
import ( "net/mail" ) func main() { name := "Michael čisto" senderEmail := "your-sender@example.com" receiverEmail := "your-receiver@example.com" // 构建地址结构体 fromAddr := &mail.Address{ Name: name, Address: senderEmail, } // 格式化为合规的字符串 formattedFrom := fromAddr.String() // 替换原代码中的地址赋值 input := &sesv2.SendEmailInput{ // ... 其他字段保持不变 ReplyToAddresses: []string{formattedFrom}, FromEmailAddress: aws.String(formattedFrom), } // ... 后续SDK调用代码不变 }
方式二:手动使用mime.QEncoding编码名称
如果需要更精细的控制,可以用mime包的Q编码来处理名称部分:
import "mime" func main() { name := "Michael čisto" senderEmail := "your-sender@example.com" // 对名称进行UTF-8的Q编码 encodedName := mime.QEncoding.Encode("UTF-8", name) formattedFrom := encodedName + " <" + senderEmail + ">" // 替换原代码中的地址赋值 input := &sesv2.SendEmailInput{ // ... 其他字段保持不变 ReplyToAddresses: []string{formattedFrom}, FromEmailAddress: aws.String(formattedFrom), } // ... 后续SDK调用代码不变 }
原理说明
直接用双引号包裹含非ASCII字符的名称时,SES无法正确解析编码格式,导致语法错误。而上述两种方法都会将特殊字符转换为符合邮件规范的编码形式(如=?UTF-8?Q?Michael_=C4=8Disto?=),SES可以正常识别这种格式的发件人名称。
内容的提问来源于stack exchange,提问作者Amandeep kaur
相关产品推荐
相关产品推荐

