【问题标题】:Is it possible to use MailDev with Java?是否可以将 MailDev 与 Java 一起使用?
【发布时间】:2021-01-15 22:15:35
【问题描述】:

我在远程服务器上安装了一个MailDev 实例。

我试图了解是否可以使用这个假的 SMTP 服务器通过 Java(使用标准 JavaMailSender)发送电子邮件。

配置只需要 URL 和端口,但在我的情况下,它不起作用。

它总是返回: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host ...

WebUI 运行正常,我可以看到服务器上的空收件箱。

谢谢。

【问题讨论】:

  • 看起来是连接问题。是否有防火墙或防病毒软件阻止呼叫?你能从运行 Java 客户端的机器上通过浏览器以外的东西(例如 telnet)访问 MailDev 服务器吗?

标签: java email smtp jakarta-mail


【解决方案1】:

您似乎遇到了连接问题。虽然我不能告诉你原因是什么,但也许我可以提供一个替代解决方案来测试你的电子邮件?

使用Wiser,您可以运行嵌入式 SMTP 服务器并在您的 junit 测试中查询该服务器。我在我的开源项目Simple Java Mail 中使用了很多,并为此创建了a Rule

package testutil.testrules;

import org.jetbrains.annotations.NotNull;
import org.junit.rules.ExternalResource;
import org.subethamail.smtp.server.SMTPServer;
import org.subethamail.wiser.Wiser;
import org.subethamail.wiser.WiserMessage;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.List;

/**
 * SmtpServerRule - a TestRule wrapping a Wiser instance (a SMTP server in Java), started and stopped right before and after each test.
 * <br>
 * SmtpServerRule exposes the same methods as the {@link Wiser} instance by delegating the implementation to the instance. These methods, however, can not be
 * used outside a JUnit statement (otherwise an {@link IllegalStateException} is raised).
 * <br>
 * The {@link Wiser} instance can be directly retrieved but also only from inside a JUnit statement.
 */
public class SmtpServerRule extends ExternalResource {
    private final Wiser wiser = new Wiser();
    private final int port;

    public SmtpServerRule(@NotNull Integer port) {
        this.port = port;
    }

    @Override
    protected void before() {
        this.wiser.setPort(port);
        this.wiser.start();
    }

    @Override
    protected void after() {
        this.wiser.stop();
    }

    @NotNull
    public Wiser getWiser() {
        checkState("getWiser()");
        return this.wiser;
    }

    @NotNull
    public List<WiserMessage> getMessages() {
        checkState("getMessages()");
        return wiser.getMessages();
    }
    
    @NotNull
    public MimeMessage getOnlyMessage(String envelopeReceiver)
            throws MessagingException {
        checkState("getMessages()");
        List<WiserMessage> messages = getMessages();
        assertThat(messages).hasSize(1);
        Iterator<WiserMessage> iterator = messages.iterator();
        WiserMessage wiserMessage = iterator.next();
        assertThat(wiserMessage.getEnvelopeReceiver()).isEqualTo(envelopeReceiver);
        MimeMessage mimeMessage = wiserMessage.getMimeMessage();
        iterator.remove();
        return mimeMessage;
    }
    
    @NotNull
    public MimeMessageAndEnvelope getOnlyMessage()
            throws MessagingException {
        checkState("getMessages()");
        List<WiserMessage> messages = getMessages();
        assertThat(messages).hasSize(1);
        Iterator<WiserMessage> iterator = messages.iterator();
        WiserMessage wiserMessage = iterator.next();
        iterator.remove();
        return new MimeMessageAndEnvelope(wiserMessage.getMimeMessage(), wiserMessage.getEnvelopeSender());
    }
    
    @NotNull
    public MimeMessage getMessage(String envelopeReceiver)
            throws MessagingException {
        checkState("getMessages()");
        List<WiserMessage> messages = getMessages();
        Iterator<WiserMessage> iterator = messages.iterator();
        while (iterator.hasNext()) {
            WiserMessage wiserMessage = iterator.next();
            if (wiserMessage.getEnvelopeReceiver().equals(envelopeReceiver)) {
                MimeMessage mimeMessage = wiserMessage.getMimeMessage();
                iterator.remove();
                return mimeMessage;
            }
        }
        throw new AssertionError("message not found for recipient " + envelopeReceiver);
    }

    @NotNull
    public SMTPServer getServer() {
        checkState("getServer()");
        return wiser.getServer();
    }

    public boolean accept(String from, String recipient) {
        checkState("accept(String, String)");
        return wiser.accept(from, recipient);
    }

    public void deliver(String from, String recipient, InputStream data)
            throws IOException {
        checkState("deliver(String, String, InputStream)");
        wiser.deliver(from, recipient, data);
    }

    public void dumpMessages(PrintStream out)
            throws MessagingException {
        checkState("dumpMessages(PrintStream)");
        wiser.dumpMessages(out);
    }

    private void checkState(String method) {
        if (this.wiser == null) {
            throw new IllegalStateException(format("%s must not be called outside of a JUnit statement", method));
        }
    }
}

然后我这样使用它:

public class MailerLiveTest {
    private static final Integer SERVER_PORT = 251;

    @Rule
    public final SmtpServerRule smtpServerRule = new SmtpServerRule(SERVER_PORT);

    @Before
    public void setup() {
        mailer = MailerBuilder.withSMTPServer("localhost", SERVER_PORT).buildMailer();
    }
    
    @Test
    public void createMailSession_EmptySubjectAndBody() {
        // send mail using mailer, which goes to localhost:251

        MimeMessageAndEnvelope receivedMimeMessage = smtpServerRule.getOnlyMessage();
        Email receivedEmail = EmailConverter.mimeMessageToEmail(receivedMimeMessage.getMimeMessage());

        // perform assertions on Email object...
    }
}

【讨论】:

  • 是的,这只是一个连接问题,但感谢您的回答。
【解决方案2】:

检查 mail.smtp.auth 和 mail.smtp.starttls.enable 是否设置为 false。就我而言,它有效(我还将 localhost 设置为主机,将 1025 设置为端口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    • 2014-03-15
    相关资源
    最近更新 更多