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
相关产品推荐
相关产品推荐

