我在测试中使用GreenMail来验证我们的应用程序是否正确发送了电子邮件。

我以以下方式启动GreenMail:

GreenMail greenMailServer = new GreenMail(new ServerSetup(port, "localhost", ServerSetup.PROTOCOL_SMTP));
greenMailServer.start();


我有一个单独的过程将电子邮件发送到GreenMail SMTP服务器(这是集成测试的一部分),因此我的测试代码以以下方式等待电子邮件:

long endTime = System.currentTimeMillis() + timeout;
// Get the fake mail server and listen for messages
GreenMail mailServer = ITester.getFakeEMail();
while(System.currentTimeMillis() < endTime)  {
     boolean timedOut = !mailServer.waitForIncomingEmail(endTime - System.currentTimeMillis(), 1);
     if(timedOut) {
          throw new TestFailure(lineNumber, "Timed out waiting for email To: '"+to+"' Subject: '"+subject+"' Body: '"+body+"' .");
     }
     for(MimeMessage message : mailServer.getReceivedMessages()) {
          try {
              StringBuilder errors = new StringBuilder();
              // Check who the message is going to
              //Address[] allRecipients = message.getRecipients(Message.RecipientType.BCC);
              Address[] allRecipients = message.getAllRecipients();


我已经尝试了对收件人和getAllRecipients的注释请求,但是我总是收到null。我已验证我的应用程序正在将电子邮件发送到“密件抄送”字段中的一个地址。

知道为什么我看不到收件人的电子邮件地址吗?

最佳答案

我在此博客上找到了答案:

https://developer.vz.net/2011/11/08/unit-testing-java-mail-code/

简短版本是使用用户并从其收件箱中获取消息,而不是从整个服务器中获取消息。然后,您知道它到了该电子邮件地址。

GreenMailUser user = mailServer.setUser("[email protected]", "");
MailFolder inbox = mailServer.getManagers().getImapHostManager().getInbox(user);
for(StoredMessage message : inbox.getMessages()) {
   // Verify the messages
}

09-25 20:35