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

如何通过Java EWS API获取刚发邮件ID并存入数据库?

获取Java EWS发送邮件的ID并存入数据库

嘿,这事儿很简单!当你调用sendAndSaveCopy()方法发送邮件后,EWS会自动把邮件的唯一ID填充到你创建的EmailMessage对象里,直接调用它的getId()方法就能拿到,之后存入数据库就好啦。

我给你修改了代码,加上了获取ID和存入数据库的逻辑(用JDBC做示例,你可以换成自己常用的ORM框架):

try {
    String isiEmail = generateIsiEmail(nmBank, jenis, tglAw, tglAk, produk);
    EmailMessage mail = new EmailMessage(service);
    mail.setSubject(jdlEmail);
    mail.setBody(new MessageBody(isiEmail));
    
    // 设置收件人、抄送
    mail.getToRecipients().add(new EmailAddress(from.replaceAll("\\s", "")));
    String[] too = to.split("\\;");
    for (int i = 0; i < too.length; i++) {
        mail.getToRecipients().add(new EmailAddress(too[i].replaceAll("\\s", "")));
    }
    String[] ccc = cc.split("\\;");
    for (int i = 0; i < ccc.length; i++) {
        mail.getCcRecipients().add(new EmailAddress(ccc[i].replaceAll("\\s", "")));
    }
    
    // 发送并保存副本到已发送邮件箱
    mail.sendAndSaveCopy();
    
    // 核心:获取刚发送邮件的ID
    String emailId = mail.getId().toString();
    System.out.println("刚发送的邮件完整ID:" + emailId);
    
    // 将ID存入数据库(JDBC示例,可替换为MyBatis/JPA等)
    String insertSql = "INSERT INTO sent_emails (email_id, email_subject, sent_timestamp) VALUES (?, ?, ?)";
    // 注意:替换成你的数据库连接信息
    try (Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "db_user", "db_password");
         PreparedStatement stmt = dbConn.prepareStatement(insertSql)) {
        stmt.setString(1, emailId);
        stmt.setString(2, jdlEmail);
        stmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
        
        int affectedRows = stmt.executeUpdate();
        if (affectedRows > 0) {
            System.out.println("邮件ID已成功存入数据库");
        }
    } catch (SQLException sqlEx) {
        System.err.println("数据库操作失败:" + sqlEx.getMessage());
        sqlEx.printStackTrace();
        // 这里可以添加失败后的处理逻辑,比如日志告警、重试等
    }
    
} catch (ServiceLocalException e) {
    System.err.println("EWS服务异常:" + e.getMessage());
    e.printStackTrace();
} catch (Exception e) {
    System.err.println("未知异常:" + e.getMessage());
    e.printStackTrace();
}

几个关键注意点:

  • getId()返回的是ItemId对象,调用toString()会得到完整的标识字符串(格式为邮件ID|ChangeKey),这个字符串是EWS中识别邮件的唯一凭证,后续如果需要修改、删除这封邮件都要用到它。
  • 数据库操作部分要根据你的实际技术栈调整:如果用MyBatis,就写对应的Mapper接口和XML;如果用JPA,创建一个SentEmail实体类,调用repository.save()即可。
  • 确保你的EWS账号有写入已发送邮件箱的权限(一般默认都有,但如果是企业级权限管控可能需要确认),不然sendAndSaveCopy()可能执行失败,也就拿不到ID了。
  • 异常处理可以再优化下,比如把打印堆栈换成日志框架(如SLF4J/Logback)输出,方便线上排查问题。

内容的提问来源于stack exchange,提问作者amor - muammar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:17