Java 简单本地化邮件服务器和客户端

Java 简单本地化邮件服务器和客户端,java,email,apache-camel,Java,Email,Apache Camel,我正在尝试开发apachecamel应用程序,这将使我们的研究项目能够将各种形式的应用程序级网络流量注入到目标应用程序中。我们希望能够模拟各种类型的流量,例如通过FTP的文件传输、电子邮件传输、通过HTTP GET和POST的HTTP传输、视频流等。我们还需要控制流量的能力(即传输速率和数据大小) 这篇文章的重点是关于电子邮件。我对电子邮件服务器或客户端以及它们的工作方式几乎一无所知。我的计划是在目标端设置适当的驼峰路由,以便能够发送和接收电子邮件流量,但我不知道在管道的另一端需要什么 所有的电

我正在尝试开发apachecamel应用程序,这将使我们的研究项目能够将各种形式的应用程序级网络流量注入到目标应用程序中。我们希望能够模拟各种类型的流量,例如通过FTP的文件传输、电子邮件传输、通过HTTP GET和POST的HTTP传输、视频流等。我们还需要控制流量的能力(即传输速率和数据大小)

这篇文章的重点是关于电子邮件。我对电子邮件服务器或客户端以及它们的工作方式几乎一无所知。我的计划是在目标端设置适当的驼峰路由,以便能够发送和接收电子邮件流量,但我不知道在管道的另一端需要什么

所有的电子邮件流量都将包含在本地网络中,并且永远不需要“在网络上”。我更希望能够使用尽可能简单并且可以在我们的环境中运行的电子邮件服务器

我做了一些实验,并成功地建立了一个基于Python的SMTP服务器,我可以从Python客户端应用程序或骆驼驱动的Java应用程序向其发送邮件。这些应用程序非常小、简单,而且运行良好

我似乎不知道如何从服务器获取邮件(见相关文章)。给我的印象是SMTP服务器只能用于传输消息(发送、回复或转发),我需要其他类型的服务器才能从服务器检索邮件

有人能告诉我如何解决这个问题吗?是否有非SMTP邮件服务器处理来自客户端的邮件请求?如果是,它们的可用性如何?如有任何建议,将不胜感激

更新

根据@Alexey R的建议,我已经查看并尝试使用Greenmail()。它似乎有很好的文档记录,但我没有太多的运气让它工作。我肯定是因为我不知道自己在做什么;)

有一件事让我有些困惑,那就是大多数示例似乎都在运行单元测试的上下文中。我不想对任何东西执行单元或集成测试,我只需要能够发送和接收电子邮件

以下是我迄今为止的实验:

注意:它们是独立的Spring启动应用程序,运行时使用:VM args-Dgreenmail.verbose-Dgreenmail.auth.disabled

MailSender.java:

@Service
public class MailSender {

  private final Logger logger = LoggerFactory.getLogger(MailSender.class);

  @Scheduled(fixedRate = 5000)
  public void send() throws IOException, MessagingException {
    GreenMail gm = new GreenMail(ServerSetupTest.SMTP_POP3_IMAP);

    // Do I need to do this? What does it do?
    gm.setUser("receiver@mail.com", "receiver", "");
    gm.setUser("sender@mail.com", "sender", "");

    // What, exactly, is being started (and stopped)?
    gm.start();

    GreenMailUtil.sendTextEmail("receiver@mail.com", "sender@mail.com", "Subject", "Test message",
        ServerSetupTest.SMTP);
    logger.info("sent mail");
    // How do I verify it actually HAS been sent? Where did it go? Has it been stored somewhere?

    gm.stop();
  }

}
MailReceiver.java:

@Service
public class MailReceiver {

  private final Logger logger = LoggerFactory.getLogger(MailReceiver.class);

  @Scheduled(fixedRate = 5000)
  public void receive() throws IOException, MessagingException {
    GreenMail gm = new GreenMail(ServerSetupTest.SMTP_POP3_IMAP);

    // Do I need to do this? What does it do?
    gm.setUser("receiver@mail.com", "receiver", "");
    gm.setUser("sender@mail.com", "sender", "");

    // What, exactly, is being started (and stopped)?
    gm.start();

    // What is the difference between the two attempts below?

    // Attempt 1 - use getReceivedMessages - never gets anything

    MimeMessage[] messages = gm.getReceivedMessages();
    logger.info("getReceivedMessages: {} messages", messages.length);

    for (MimeMessage m : messages) {
      logger.info(m.toString());
    }

    // Attempt 2 - create a session, get a bunch of stuff, try to get messages

    Session imapSession = gm.getImap().createSession();
    Store store = imapSession.getStore("imap");
    Folder inbox = store.getFolder("INBOX");
    inbox.open(Folder.READ_ONLY);
    Message[] msgs = inbox.getMessages();
    logger.info("inbox.getMessages: {} messages", msgs.length);

    gm.stop();
  }

}
我已经尝试了各种测试,有些是运行独立的Greenmail服务器,有些是不运行

对于MailSender,如果我自己运行它(没有独立运行),它会执行,没有异常,但是我不知道如何验证是否有任何东西是“发送”的。如果我在独立运行的情况下运行它,就会出现端口绑定冲突,我想这是有道理的(但我该怎么做才能纠正它呢?)

对于MailReceiver,有两种变体:

  • 尝试1
  • 尝试2
  • 在不运行任何其他操作的情况下尝试1,从未收到任何邮件。 在单机版也运行的情况下尝试1,会导致端口绑定冲突

    在不运行任何其他内容的情况下尝试2会引发未连接的异常。 在单机版也运行的情况下尝试2,会导致端口绑定冲突

    我不理解这两种方法的区别或用例。我基本上只是从示例中复制它们,并尝试看看它们是否有效。我真的不知道他们在做什么(或试图做什么)

    在大多数情况下,我想我理解为什么我看到了我得到的结果,但我对我需要做什么才能“做对”感到困惑。我认为从更基本的意义上讲,我真的不知道如何正确使用API来实现我的目标

    更新2

    经过更多的研究和挖掘,我开始理解SMTP和IMAP(或POP3)邮件服务器具有不同的互补作用。SMTP主要用于发送邮件(中继或转发),而IMAP主要用于接收邮件。如果我的描述有误,请纠正我

    这样看来,如果我想让“目标”应用程序发送邮件或接收邮件的“电子邮件系统”可用,我需要实现(或利用现有的实现)SMTP和IMAP服务器。SMTP服务器似乎还需要将从发送客户端发送的邮件提供给IMAP服务器,以便接收客户端可以请求该邮件。这些都有意义吗


    如果这或多或少是正确的观点,那么对于简单的SMTP和IMAP服务器有什么建议?此外,是否每个都需要一个补充客户?这里面有太多我不明白的地方。我不反对使用现有的(最好是免费的和开源的)解决方案,或者如果它很容易理解和实现(好的文档!),写我自己的。

    看看快速问题:Greenmail是否要求您在单元测试上下文或环境中使用它?您可以将其作为独立解决方案或在应用程序运行时上下文(单元测试的一部分或应用程序本身)中使用。这篇文章介绍如何配置独立的green mail并将其与常规邮件客户端一起使用(希望这将有助于管理加载邮件使用骆驼-毕竟概念是一样的)。