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

使用smtplib调用Amazon SES正常,但boto3调用出现签名不匹配错误

解决Amazon SES boto3调用SignatureDoesNotMatch错误

你遇到的问题核心是SMTP凭证和IAM API密钥的混淆,结合你的情况,给出几个针对性的排查和解决步骤:

1. 不要混用SES SMTP凭证和IAM Access Key

SES提供两种完全不同的凭证:

  • SMTP用户名/密码:仅用于SMTP协议(就是你smtplib代码里用的SES_KEY和SES_SECRET)
  • IAM Access Key ID/Secret Access Key:用于调用AWS API(boto3需要的是这个)

你大概率是把SMTP的凭证填到了boto3的aws_access_key_id和aws_secret_access_key参数里,这会直接导致签名验证失败。

  • 解决:登录IAM控制台,找到拥有ses:SendEmail权限的IAM用户,生成/复制它的Access Key和Secret Key,替换到boto3代码里。

2. 检查密钥输入是否准确

  • 确认密钥没有多余空格、缺失字符,尤其是Secret Key里的特殊符号(比如+、/、=),复制粘贴时很容易出错。
  • 建议直接从IAM控制台的密钥下载页面复制,不要手动输入。

3. 验证区域和资源的一致性

  • 确认你的发件邮箱地址(some@email.com)是在us-east-1区域完成验证的,如果发件地址在其他区域,即使boto3指定了us-east-1也会触发错误。
  • 检查IAM用户的权限策略,确保没有限制区域(如果策略里有Condition限制了区域,要和boto3的region_name匹配)。

4. 校准本地系统时间

AWS的签名算法对时间精度要求很高,如果你的本地机器时间和UTC时间偏差超过5分钟,就会出现签名不匹配。

  • 解决:同步系统时间,比如用系统自带的时间同步工具(Windows的自动同步、Linux的ntp服务)。

5. 优化凭证管理(可选但推荐)

不要在代码里硬编码密钥,改用环境变量或者AWS凭证文件:

  • 环境变量方式:
    export AWS_ACCESS_KEY_ID="你的IAM Access Key"
    export AWS_SECRET_ACCESS_KEY="你的IAM Secret Key"
    
    然后boto3代码可以简化,不用手动传密钥:
    ses = boto3.client('ses', region_name='us-east-1')
    

附你的相关代码和错误信息:

正常工作的smtplib代码

import smtplib

fromaddr = "some@email.com"
toaddrs  = "other@email.com"
msg = """From: some@email.com
Hello, this is test from python.
"""

smtp_server = 'email-smtp.us-east-1.amazonaws.com'
smtp_username = 'SES_KEY'
smtp_password = 'SES_SECRET'
smtp_port = '25'
smtp_do_tls = True

server = smtplib.SMTP(
    host = smtp_server,
    port = smtp_port,
    timeout = 10
)
server.set_debuglevel(10)
server.starttls()
server.ehlo()
server.login(smtp_username, smtp_password)
server.sendmail(fromaddr, toaddrs, msg)
print(server.quit())

boto3报错信息

Error: An error occurred (SignatureDoesNotMatch) when calling the SendEmail operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

你的boto3代码

import boto3
from botocore.exceptions import BotoCoreError, ClientError

def send_email():
    ses = boto3.client('ses', region_name='us-east-1', aws_access_key_id='key', aws_secret_access_key='secret')
    subject = 'Your Email Subject'
    body = """
    This is a test email from BOTO3 SES.
    """
    message = {"Subject": {"Data": subject},
               "Body": {"Text": {"Data": body}}}

    try:
        response = ses.send_email(Source='some@email.com',
                                  Destination={'ToAddresses': ['other@email.com']},
                                  Message=message)
    except (BotoCoreError, ClientError) as error:
        print(f"Error: {error}")
send_email()

内容的提问来源于stack exchange,提问作者Krishh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:27:05