Spring的 JavaMailSender与 Testcontainers的 Mailpit无法一起工作
为了测试,我正在运行一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。