虚假的javax.mail.Session

4
我有一个发送电子邮件的应用程序。但在我的开发环境中,我不希望该应用程序发送电子邮件,而是应该仅将消息打印到日志文件中。
是否有一个虚假的javax.mail.Session实现可以做到这一点?
3个回答

4
针对此问题,我会使用一个定制的javax.mail.Transport,该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);
}

2
如果您想配置本地的Tomcat安装程序以使用假的Transport实现,则应执行以下操作:
会话实现似乎只从主目录lib文件夹和类路径META-INF/javamail.providers加载配置,请参阅Session javadoc。
如果您使用Tomcat JNDI配置邮件会话,则只需将一个包含文件META-INF/javamail.providers的额外JAR文件复制到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包中或应用程序的任何位置。

1

虽然不完全符合您的要求,但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>

不完全是。我认为在本地服务器上运行类似于Google App Engine电子邮件的API。在您的代码中,您使用了Java Mail Session,但实现只会将电子邮件打印到控制台,而不会发送电子邮件。谢谢。 - Otávio Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接