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

Haskell使用mime-mail-ses发邮件遇TlsNotSupported错误求助

解决mime-mail-ses发送邮件时的"TlsNotSupported"错误

刚碰到过类似的问题,给你梳理下解决方案:

首先,这个错误的核心原因是AWS SES的SMTP服务要求使用STARTTLS加密连接,而默认情况下mime-mail-ses的配置可能没匹配上SES要求的端口和加密方式。

关键背景:SES的SMTP端口规则

SES明确要求:

  • 使用STARTTLS加密时,对应端口是587(官方推荐)或25(可能受ISP或云服务商限制)
  • 直接SSL/TLS连接用465,但AWS更推荐STARTTLS的587端口

如何在mime-mail-ses中指定端口

虽然mime-mail-ses的上层API没直接暴露端口参数,但可以通过底层的SMTPConfig手动配置。你可以修改代码,自定义SMTP连接设置:

import Network.Mail.SMTP (SMTPConfig(..), defaultSMTPConfig)
import Network.Mail.SES (sendEmail, SES(..))

-- 构造适配SES的SMTP配置
sesSMTPConfig :: SMTPConfig
sesSMTPConfig = defaultSMTPConfig
  { smtpHost = "email-smtp." ++ seRegion ++ ".amazonaws.com" -- 匹配你的区域端点
  , smtpPort = 587 -- 指定STARTTLS端口
  , smtpUseTLS = False -- STARTTLS是先明文连接再升级加密,所以这里设为False
  , smtpEnableSTARTTLS = True -- 启用STARTTLS加密流程
  }

-- 创建自定义的SES实例,传入上面的SMTP配置
customSES :: SES
customSES = SES
  { sesFrom = seFrom
  , sesTo = seTo
  , sesAccessKey = seAccessKey
  , sesSecretKey = seSecretKey
  , sesSessionToken = seSessionToken
  , sesRegion = seRegion
  , sesSMTPConfig = sesSMTPConfig -- 替换默认的SMTP配置
  }

-- 使用自定义SES实例发送邮件
sendEmail customSES sMail'

额外注意点

  • 确保seRegion的值正确,比如us-east-1、eu-west-1等,对应的SMTP端点格式固定为email-smtp.<region>.amazonaws.com
  • 如果尝试用25端口,需要检查服务器出站防火墙是否允许(很多云服务商默认限制25端口)
  • 验证你的IAM权限是否包含ses:SendRawEmail,避免因权限不足引发其他问题

这个方案应该能解决你的"TlsNotSupported"错误,本质就是让客户端按照SES要求的方式建立加密连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:02:03