我有一个发送电子邮件的应用程序。但是在我的开发环境中,我不希望应用程序发送电子邮件,而应该只在日志文件中打印消息。
有一个假的javax.mail.Session
实现,我可以做到这一点?
我有一个发送电子邮件的应用程序。但是在我的开发环境中,我不希望应用程序发送电子邮件,而应该只在日志文件中打印消息。
有一个假的javax.mail.Session
实现,我可以做到这一点?
对于这个问题,我会使用一个javax.mail.Transport
注册到 SMTP 协议的自定义。
首先实现CustomTransport类
import javax.mail.Transport;
import javax.mail.*;
public class CustomTransport extends Transport {
public CustomTransport(Session smtpSession, URLName urlName) {
super(smtpSession, urlName);
}
@Override
public void sendMessage(Message message, Address[] addresses) throws MessagingException {
// Take the message and write it somewhere
// e.g.: a logger or an OutputStream message.writeTo(...);
}
@Override
public void connect() throws MessagingException {}
@Override
public void connect(String host, int port, String username, String password) throws MessagingException {}
@Override
public void connect(String host, String username, String password) throws MessagingException {}
@Override
public void close() {}
}
之后,您可以使用该 CustomTransport 创建一个javax.mail.Session
将您的邮件写入定义的位置
public Session getMailSession(){
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.provider.class", CustomTransport.class.getName());
props.put("mail.smtp.provider.vendor", "foo");
props.put("mail.smtp.provider.version", "0.0.0");
return Session.getInstance(props);
}
如果您想将本地Tomcat安装配置为使用假Transport
实现,
Session 实现似乎只从 home lib 文件夹和类路径 META-INF/javamail.providers 加载配置,请参阅Session javadoc。
如果您使用Tomcat JNDI配置邮件会话,只需将带有一个文件的附加 JAR 文件复制META-INF/javamail.providers
到 Tomcat lib 文件夹:
$ mkdir META-INF
$ echo 'protocol=smtp; type=transport; class=CustomTransport;' > META-INF/javamail.providers
$ jar cf custom-transport.jar META-INF
$ cp custom-transport.jar $TOMCAT/lib/
您可以将上述类CustomTransport
放入同一个 Jar 或应用程序中的任何位置。
不完全是您所要求的,但GreenMail是 SMTP、POP3 和 IMAP 协议的测试实现。您可以从 JUnit 启动 GreenMail 服务器并查询收到的电子邮件。这样您就可以使用整个堆栈,但javax.mail
使用localhost
在某个任意端口上运行的假服务器。
该库在 Maven 中可用:
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.3.1b</version>
<scope>test</scope>
</dependency>