You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:37:01