Odoo14通过AWS SES SMTP向多邮箱合作伙伴发信报554错误
问题场景
使用Odoo14系统,对接AWS SES作为SMTP服务发送邮件,向配置了多个邮箱地址的合作伙伴(格式示例:partner1@mail.com,partner2@mail.com,partner3@mail.com)发送发票邮件时发信失败,返回错误信息如下:
Unknown error: Mail Delivery Failed Mail delivery failed via SMTP server 'None'. SMTPDataError: 554 Transaction failed: Missing '<'
该问题仅在使用AWS SES SMTP发信时复现,切换为Gmail等其他SMTP服务时,邮件可正常发送,无异常。
根因说明
AWS SES对SMTP协议的RFC合规性校验远严于Gmail等公共邮箱服务,报错提示的Missing '<',指SMTP会话中传入的邮件地址未按RFC5322规范用<>包裹。
Odoo14原生逻辑处理合作伙伴绑定的多邮箱地址时,会直接读取数据库中逗号分隔的邮箱字符串,未做格式标准化就透传给SMTP服务:Gmail这类服务会自动修正不规范的地址格式,因此发信正常;SES严格执行规范校验,会直接拒绝不符合格式要求的发信请求。
常见触发点:
- 多邮箱地址拼接时仅用逗号分隔,未给每个独立邮箱包裹
<>,逗号后未加标准空格 - 合作伙伴邮箱字段混入了未格式化的姓名前缀、全角特殊符号、首尾冗余空格等内容
- 无效邮箱地址混在多收件人列表中,SES校验时直接抛出格式类错误
排查与解决方案
- 基础校验步骤
打开对应合作伙伴的编辑表单,检查邮箱字段内容:确认所有地址都是纯邮箱格式,没有混入非邮箱字符,多个邮箱之间用英文半角逗号分隔,逗号后补充1个半角空格。可临时将多邮箱拆分为单个邮箱测试发送,如果单邮箱发送正常,即可确认是多地址拼接的格式问题。同时确认SES侧已完成发件域名验证,账号未处于沙盒模式、未触发发送配额限制。 - 根治方案:修复Odoo原生发信逻辑
定位到Odoo源码中addons/base/models/ir_mail_server.py文件的send_email方法,在收件人、抄送、密送地址传入SMTP会话前,增加地址格式标准化处理:将逗号拼接的邮箱字符串拆分为单个地址数组,逐个去除首尾空格,给合法邮箱外层包裹<>,处理完成后再拼接为符合规范的地址列表传入。
可参考如下处理代码:
发信前调用该方法处理所有收件人、抄送人、密送人和发件人地址即可。import re VALID_EMAIL_PATTERN = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$') def format_email_addresses(raw_email_str): # 拆分多邮箱,过滤空值 email_list = [e.strip() for e in raw_email_str.split(',') if e.strip()] formatted_list = [] for email in email_list: # 已包裹尖括号的地址跳过处理 if email.startswith('<') and email.endswith('>'): formatted_list.append(email) continue # 合法邮箱包裹尖括号 if VALID_EMAIL_PATTERN.match(email): formatted_list.append(f'<{email}>') else: formatted_list.append(email) return ', '.join(formatted_list) - 无代码修改权限的临时方案
给配置多邮箱的合作伙伴搭建对应邮件分发列表,在Odoo的合作伙伴邮箱字段仅填写分发列表的单个邮箱地址,由邮件服务侧完成多地址转发;也可以在SES前增加一层SMTP中继服务,由中继层自动修正不规范的邮件地址格式。
内容的提问来源于stack exchange,提问作者Ferp
相关产品推荐
相关产品推荐

