模拟 imaps 服务器 - Greenmail

simulate imaps server - Greenmail

我想使用 Greenmail 来模拟 imaps 服务器。 我想使用服务器进行系统测试,我想 运行 greenmail 服务器并向其发送电子邮件,然后从我的应用程序服务器上 运行 的作业中获取这些电子邮件。 我的问题是 GreenMail.start 与将 GreenMail 部署为 Web 应用程序之间有什么区别。 GreenMail.start 是否部署了一个监听的服务器,我可以从不同的机器向它发送 imaps 请求?

我想使用 GreenMail.start 而不是将 GreenMail 部署为 Web 应用程序的原因是每次测试 运行 时我都必须在 greenmail 服务器上创建一个电子邮件帐户,这是因为测试将 运行 同时在不同的机器上进行,所以我不希望所有机器使用相同的帐户。

我的代码:

import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.security.Security;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.icegreen.greenmail.util.DummySSLSocketFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.icegreen.greenmail.user.GreenMailUser;
import com.icegreen.greenmail.user.UserException;
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetupTest;
import testIMAPS.MailSender;

public class GreenmailTest {
public static final String USER_PASSWORD = "abcdef123";
public static final String USER_NAME = "hascode";
public static final String EMAIL_USER_ADDRESS = "hascode@localhost";
public static final String EMAIL_TO = "someone@localhost.com";
public static final String EMAIL_SUBJECT = "Test E-Mail";
public static final String EMAIL_TEXT = "This is a test e-mail.";
public static final String LOCALHOST = "127.0.0.1";
public static GreenMail mailServer;

@Before
public void setUp() {

    if (mailServer == null){
        Security.setProperty("ssl.SocketFactory.provider",
                DummySSLSocketFactory.class.getName());
        mailServer = new GreenMail(ServerSetupTest.IMAPS);
        mailServer.start();
    }
}

@After
public void tearDown() {
    mailServer.stop();
}

@Test
public void getMails() throws IOException, MessagingException,
        UserException, InterruptedException {
    // create user on mail server
    GreenMailUser user = mailServer.setUser(EMAIL_USER_ADDRESS, USER_NAME,
            USER_PASSWORD);

    // create an e-mail message using javax.mail ..
    MimeMessage message = new MimeMessage((Session) null);
    message.setFrom(new InternetAddress(EMAIL_TO));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(
            EMAIL_USER_ADDRESS));
    message.setSubject(EMAIL_SUBJECT);
    message.setText(EMAIL_TEXT);

    // use greenmail to store the message
    user.deliver(message);

    // fetch the e-mail via imaps using javax.mail .. 
    /*i want this code to be run on different machines to this greenmail server */
    Properties props = new Properties();
    String imapsProtocol = "imaps";
    props.setProperty("mail.store.protocol", imapsProtocol);

    props.setProperty("mail.imaps.port", String.valueOf(ServerSetupTest.IMAPS.getPort()));
    Session session = Session.getInstance(props);
    Store store = session.getStore(imapsProtocol);
    store.connect(LOCALHOST, USER_NAME, USER_PASSWORD);

    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);
    Message[] messages = folder.getMessages();
    assertNotNull(messages);
    assertThat(1, equalTo(messages.length));
    assertEquals(EMAIL_SUBJECT, messages[0].getSubject());
    assertTrue(String.valueOf(messages[0].getContent())
            .contains(EMAIL_TEXT));
    assertEquals(EMAIL_TO, messages[0].getFrom()[0].toString());
}
}

当我在 tomcat 上部署 greenmail webapp 时,我看到我定义的端口已按预期使用。但是当我使用 mailServer.start() 时,我看不到该端口正在使用中。为什么?

谢谢:)

是,GreenMail.start 使用提供的 ServerSetup 配置启动服务器。 GreenMail 可从其他主机访问,具体取决于主机设置(本地主机与例如 0.0.0.0)。无论使用 GreenMail.start 还是部署 GreenMail webapp(它只是将其放入应用程序服务器的包装器),您都可以执行此操作。

您可以使用您需要的用户预先配置 GreenMail Webapp。请参阅 configuring GreenMail webapp 以了解如何通过打包 web.xml 添加用户或配置您的 IMAPS 端口。

关于"seeing the port used": 对于 mailServer.start(),您可以通过

greenMail.getImaps().getPort()

访问 IMAPS 端口

当running/deploying GreenMail作为webapp时,你在web.xml里面预配置端口。当 GreenMail Webapp 部署时,它会记录端口。我想这就是你所说的 "seeing the port used"?