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

Java从ResultSet取邮箱后批量发送邮件失败问题求助

解决思路

你的推测完全正确——问题就出在users.toString()上。List的toString方法会返回类似[UserDto@123, UserDto@456]的字符串,这不是邮件服务器能识别的收件人格式,自然发不出邮件。下面给两种可行的解决方式:

方式一:逐个给每个邮箱发送邮件

遍历获取到的UserDto列表,逐个提取邮箱地址并调用发送方法,适合需要单独给每个用户发邮件的场景:

Delegate delegate = new Delegate();
List<UserDto> users = delegate.getEmail();

// 遍历每个用户,单独发送邮件
for (UserDto user : users) {
    // 提取单个用户的邮箱地址
    String toEmail = user.getEmailAddress();
    delegate.sendNotification("****", "****", toEmail, "", "", "", body);
}

方式二:拼接成多收件人格式的字符串发送

如果你的sendNotification方法支持多个收件人用逗号分隔的格式,可以把所有邮箱地址拼接成符合要求的字符串,一次性发送:

Delegate delegate = new Delegate();
List<UserDto> users = delegate.getEmail();

// 用Stream提取所有邮箱,并用逗号拼接
String toEmail = users.stream()
                      .map(UserDto::getEmailAddress) // 提取每个UserDto的邮箱
                      .collect(Collectors.joining(",")); // 用逗号连接成字符串

delegate.sendNotification("****", "****", toEmail, "", "", "", body);

额外优化:修复资源泄漏问题

你的getEmail方法存在数据库资源泄漏风险——finally块只关闭了preparedStatement,但connection和searchResultSet没关闭。推荐用Java的try-with-resources语法自动关闭资源,代码更简洁且安全:

public List<UserDto> getEmail() {
    // try-with-resources会自动关闭实现AutoCloseable接口的资源
    try (Connection connection = getConnection();
         PreparedStatement preparedStatement = connection.prepareStatement(
                 "SELECT EMAIL FROM USER WHERE USER.U_SEQ IN ('1','650')");
         ResultSet searchResultSet = preparedStatement.executeQuery()) {
        
        return getEmail(searchResultSet);
        
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

内容的提问来源于stack exchange,提问作者uma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:35:26