如何通过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
相关产品推荐
相关产品推荐

