在 docker 中设置本地 smtp+pop3 以与 Java 客户端进行集成测试

发布时间:2021-03-06 16:57

我正在尝试为发送电子邮件的组件设置一个简单的测试。在测试中,我想使用 POP3 来验证电子邮件是否已发送。在测试期间,所有这些都将在安全的机器上运行,因此我不需要身份验证或 SSL。

我使用默认配置在我的 ubuntu docker 容器中设置了 postfix。我能够成功发送电子邮件,但是当我尝试使用 Java 客户端检索电子邮件时,出现异常:

Exception in thread "main" javax.mail.AuthenticationFailedException: EOF on socket

就像我提到的,我不需要身份验证,那么如何在没有 AuthenticationFailedException 的情况下连接到 POP3 收件箱?


邮件客户端

public static void main(final String[] args) throws MessagingException {
  final Session session = Session.getDefaultInstance(new Properties(), null);
  final Store store = session.getStore("pop3");
  store.connect("localhost", 10110, "root", "");
  final Folder inbox = store.getFolder("inbox");
  inbox.open(Folder.READ_ONLY);
  final Message[] messages = inbox.getMessages();
    
  for (final Message message : messages) {
    System.out.println(message.getReceivedDate());
    System.out.println(message.getSubject());
  }
    
  inbox.close(true);
  store.close();
}

基本设置

码头工人

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y \
      postfix

COPY start_postfix.sh /
ENTRYPOINT /bin/bash /start_postfix.sh

start_postfix.sh

postconf -e "myhostname = my.testserver.com"
postfix start

Docker 运行

POSTFIX_SMTP_PORT=10025
POSTFIX_POP3_PORT=10110
docker run \
  --name email-test \
  -d \
  -p $POSTFIX_SMTP_PORT:25 -p $POSTFIX_POP3_PORT:110 \
  email-test-image /start_servers.sh

发件人

public static void main(final String[] args) throws MessagingException {
  final Session session = Session.getDefaultInstance(new Properties(), null);
  final Store store = session.getStore("pop3");
  store.connect("localhost", 10110, "root", "");
  final Folder inbox = store.getFolder("inbox");
  inbox.open(Folder.READ_ONLY);
  final Message[] messages = inbox.getMessages();
    
  for (final Message message : messages) {
    System.out.println(message.getReceivedDate());
    System.out.println(message.getSubject());
  }
    
  inbox.close(true);
  store.close();
}

回答1