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
相关产品推荐
相关产品推荐

