SingleEmailMessage与CC字段问题:空字段触发无效邮箱错误
问题根源与解决方案
我帮你找到了问题的核心所在,咱们一步步拆解:
问题出在哪?
你处理收件人地址的逻辑完全写反了,而且空字段的处理方式错误,导致传入了无效的空邮箱地址。
看你这段核心代码:
if (String.isBlank(this.recipientEmail)) { addresses = this.recipientEmail.split(';'); message.setToAddresses(addresses); } else addresses.clear(); if (String.isBlank(this.ccEmail)) { addresses = this.ccEmail.split(';'); message.setCcAddresses(addresses); } else addresses.clear(); if (String.isBlank(this.bccEmail)) { addresses = this.bccEmail.split(';'); message.setBccAddresses(addresses); } else addresses.clear();
这里的逻辑是当邮箱字段为空时才去拆分字符串并设置地址,但空字符串用split(';')会得到一个包含空字符串的数组(比如''.split(';')返回['']),这个空字符串就是触发「无效邮箱地址」错误的直接原因!
而当邮箱字段不为空时,你反而清空了列表却不设置地址,这也不符合业务预期。
正确的处理方式
Salesforce的setCcAddresses和setBccAddresses方法接受**空的List<String>**来表示无该类型收件人,我们需要修正判断逻辑,同时过滤掉拆分后可能出现的无效空邮箱。
步骤1:封装一个邮箱解析工具方法
这个方法会帮你处理空字符串、过滤拆分后的空白邮箱,返回干净的收件人列表:
private List<String> parseEmailAddresses(String emailStr) { List<String> validAddresses = new List<String>(); if (!String.isBlank(emailStr)) { // 拆分邮箱字符串 for (String rawEmail : emailStr.split(';')) { // 去掉前后空格 String trimmedEmail = rawEmail.trim(); // 只保留非空的有效邮箱 if (!String.isBlank(trimmedEmail)) { validAddresses.add(trimmedEmail); } } } // 空字符串会直接返回空列表 return validAddresses; }
步骤2:用工具方法替换原有的地址处理逻辑
在emailPdf方法中,把原来的地址处理部分替换成以下代码:
// 设置主收件人(你已经有前置校验确保recipientEmail不为空) message.setToAddresses(parseEmailAddresses(this.recipientEmail)); // 设置Cc收件人:空列表表示无Cc收件人 message.setCcAddresses(parseEmailAddresses(this.ccEmail)); // 设置Bcc收件人:空列表表示无Bcc收件人 message.setBccAddresses(parseEmailAddresses(this.bccEmail));
为什么这样能解决问题?
- 当Cc/Bcc字段为空时,
parseEmailAddresses会返回空列表,传给setCcAddresses/setBccAddresses后,Salesforce会识别为该字段无收件人,不会报错; - 拆分后的邮箱会被自动去掉前后空格,同时过滤掉空字符串(比如用户输入
a@test.com;;b@test.com这种多打了分号的情况),避免无效邮箱; - 逻辑清晰,避免了原代码中判断条件颠倒的低级错误。
内容的提问来源于stack exchange,提问作者Jerry Welliver
相关产品推荐
相关产品推荐

