Java读取TXT邮箱列表构造InternetAddress发邮件报错如何解决
问题排查与解决方案
报错原因分析
- 第一种写法抛出
AddressException:错误信息明确说明传入了空字符串''构造邮箱地址,根源是读取TXT文件时混入了空行、全空白行,行内容trim后变为空字符串,不符合邮箱地址格式要求。你单独测试每个邮箱正常,通常是忽略了文件首尾的隐形空行、或中间的空白分隔行。 - 第二种写法抛出空指针异常:属于逻辑错误,
props.getProperty()作用是从配置对象中读取对应key的配置值,收件人邮箱本身是业务值不是配置key,用邮箱字符串作为key去props中查询必然返回null,传入构造函数后就会触发空指针,该写法直接舍弃即可。
排查修复步骤
- 先修正基础语法错误:你提供的代码中
BufferedReader in = new BufferedReader(filepath));存在两个问题,一是多了一个多余的右括号,二是BufferedReader不能直接传入文件路径构造,需要套一层FileReader实例。 - 读取文件时过滤无效内容:每行读取后先清理不可见特殊字符、trim去首尾空白,判断非空后再加入邮箱列表,避免无效内容进入后续逻辑。
- 动态匹配数组长度:用过滤后的有效邮箱列表长度初始化InternetAddress数组,避免数组长度大于有效邮箱数,导致数组末尾元素为null触发后续异常。
- 新增邮箱合法性校验:构造InternetAddress后主动调用
validate()方法校验格式,非法邮箱直接跳过避免中断整体发送流程。
修正后参考代码
try { // 修正BufferedReader构造逻辑 BufferedReader in = new BufferedReader(new FileReader(filepath)); ArrayList<String> emails = new ArrayList<>(); String s; while ((s = in.readLine()) != null) { // 先移除不可见特殊字符,再trim去空白 String email = s.replaceAll("[^\\x00-\\x7F]", "").trim(); // 仅非空内容加入列表 if (!email.isEmpty()) { emails.add(email); } } in.close(); int validSize = emails.size(); InternetAddress[] addresses = new InternetAddress[validSize]; for (int i = 0; i < validSize; i++) { String currentEmail = emails.get(i); try { addresses[i] = new InternetAddress(currentEmail); // 主动校验邮箱格式合法性 addresses[i].validate(); } catch (AddressException e) { System.err.println("跳过非法邮箱地址:" + currentEmail); e.printStackTrace(); } } message.setRecipients(Message.RecipientType.TO, addresses); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者happyness
相关产品推荐
相关产品推荐

