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

Java读取TXT邮箱列表构造InternetAddress发邮件报错如何解决

问题排查与解决方案

报错原因分析

  • 第一种写法抛出AddressException:错误信息明确说明传入了空字符串''构造邮箱地址,根源是读取TXT文件时混入了空行、全空白行,行内容trim后变为空字符串,不符合邮箱地址格式要求。你单独测试每个邮箱正常,通常是忽略了文件首尾的隐形空行、或中间的空白分隔行。
  • 第二种写法抛出空指针异常:属于逻辑错误,props.getProperty()作用是从配置对象中读取对应key的配置值,收件人邮箱本身是业务值不是配置key,用邮箱字符串作为key去props中查询必然返回null,传入构造函数后就会触发空指针,该写法直接舍弃即可。

排查修复步骤

  1. 先修正基础语法错误:你提供的代码中BufferedReader in = new BufferedReader(filepath));存在两个问题,一是多了一个多余的右括号,二是BufferedReader不能直接传入文件路径构造,需要套一层FileReader实例。
  2. 读取文件时过滤无效内容:每行读取后先清理不可见特殊字符、trim去首尾空白,判断非空后再加入邮箱列表,避免无效内容进入后续逻辑。
  3. 动态匹配数组长度:用过滤后的有效邮箱列表长度初始化InternetAddress数组,避免数组长度大于有效邮箱数,导致数组末尾元素为null触发后续异常。
  4. 新增邮箱合法性校验:构造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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:06:02