假javax.mail.Session

假javax.mail.Session,java,email,jakarta-mail,Java,Email,Jakarta Mail,我有一个发送电子邮件的应用程序。但是在我的开发环境中,我不希望应用程序发送电子邮件,而应该只在日志文件中打印消息 有一个假的javax.mail.Session实现,我可以做到这一点?不完全是您想要的,而是SMTP、POP3和IMAP协议的测试实现。您可以从JUnit启动GreenMail服务器并查询收到的电子邮件。通过这种方式,您可以运行整个堆栈,但是javax.mail在某个任意端口上使用运行在localhost上的假服务器 该库在maven中提供: <dependency>

我有一个发送电子邮件的应用程序。但是在我的开发环境中,我不希望应用程序发送电子邮件,而应该只在日志文件中打印消息


有一个假的
javax.mail.Session
实现,我可以做到这一点?

不完全是您想要的,而是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>

冰绿
绿色邮件
1.3.1b
测试

对于这个问题,我将使用一个自定义的
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安装配置为使用伪
传输
实现

会话实现似乎只从home lib文件夹和classpath META-INF/javamail.providers加载配置,请参阅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或应用程序中的任何位置。

不完全如此。我认为在本地服务器上运行的API类似于Google应用程序引擎电子邮件。在您的代码中,您使用Java邮件会话,但是为了发送电子邮件,此实现只在控制台中打印电子邮件,而不发送电子邮件。非常感谢。