Spring的 JavaMailSender与 Testcontainers的 Mailpit无法一起工作

后端开发 2026-07-09

为了测试,我正在运行一个Mailpit的 Testcontainers实例:

@Container
static MailpitContainer mailpitContainer = new MailpitContainer()
    .withNetwork(TESTCONTAINERS_NETWORK);

待测试的服务本身也部署在一个Testcontainers实例中:

public class MyServiceUnderTestContainer extends GenericContainer<ArgusBatchContainer>

    private static final String IMAGE_NAME...

    static {
        Testcontainers.exposeHostPorts(1025);
    }

    public MyServiceUnderTestContainer(Map<String, String> environmentVariables) {
        super(IMAGE_NAME);
        this.withAccessToHost(true);
        this.withNetwork(TESTCONTAINERS_NETWORK);
    }
}

我的Spring JavaMailSender配置如下:

@Bean
public JavaMailSenderImpl createJavaMailSenderBean() {
    final JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("host.testcontainers.internal");
    mailSender.setPort(1025);
    mailSender.setUsername("");
    mailSender.setPassword(null);
    mailSender.setProtocol("smtp");
    mailSender.setJavaMailProperties(createJavaMailProperties());
    return mailSender;
}

private Properties createJavaMailProperties() {
    final Properties properties = new Properties();
    properties.put("mail.smtp.auth", false);
    properties.put("mail.smtp.starttls.enable", false);
    properties.put("mail.smtp.connectiontimeout", 180000);
    properties.put("mail.smtp.timeout", 180000);
    return properties;
}

我收到了如下错误信息:

org.springframework.mail.MailSendException: 邮件服务器连接失败。失败的消息:jakarta.mail.MessagingException: 来自SMTP主机host.testcontainers.internal的问候不正确,端口:1025,响应:[EOF]

为什么会出现这个错误,该如何修复?

解决方案

这个问题的原因是 host.testcontainers.internal 在你的设置中使用不当。

该主机名本应用于在容器内从主机机器访问运行在主机上的服务。但在你的情形中,Mailpit运行在另一个Testcontainers容器中,而不是在主机上。因此,你的服务容器试图连接到一个在该地址实际上并不暴露SMTP服务器的目标,导致 EOF(没有SMTP欢迎语)的错误。

由于两个容器处于同一个Testcontainers网络,它们应该通过一个 网络别名或容器名称 来进行通信,而不是通过主机。

一个更好的做法是:

  • 给Mailpit容器分配一个网络别名(例如 "mailpit"
  • 将你的 JavaMailSender 配置为使用该别名作为主机,端口为 1025

示例思路:

  • Mailpit容器 → .withNetworkAliases("mailpit")
  • SMTP配置 → host = "mailpit",port = 1025

另外,Testcontainers.exposeHostPorts(1025) 在这里并不需要,因为你不是从主机访问Mailpit,而是从另一个容器。

简言之,这是一个网络问题:容器之间的通信应使用共享的Docker网络,而不是 host.testcontainers.internal

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章