Простой локализованный почтовый сервер и клиент - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь разработать Apache верблюжьи приложения, которые позволят нашему исследовательскому проекту внедрить различные формы сетевого трафика приложения c в целевое приложение. Мы хотим иметь возможность моделировать потоки traffi c различных типов, например, передачу файлов через FTP, передачу электронной почты, передачу HTTP через HTTP GET и POST, потоковое видео и тому подобное. Нам также нужна возможность контролировать поток (то есть скорость передачи и размер данных).

В центре внимания этого поста речь идет о электронной почте. Я почти ничего не знаю о почтовых серверах или клиентах или о том, как они работают. Я планирую настроить соответствующие маршруты Camel на целевой стороне, чтобы иметь возможность отправлять и получать электронную почту traffi c, но я понятия не имею, что мне нужно на другом конце конвейера.

Все сообщения электронной почты c будут храниться в локальной сети и никогда не должны go выходить «в сети». Я бы предпочел использовать серверы электронной почты, которые настолько просты, насколько это возможно, и могут работать в нашей среде.

Я немного поэкспериментировал и успешно настроил SMTP-сервер на основе Python что я смог отправить почту на из клиентского приложения Python или из Java приложения, управляемого Camel. Эти приложения очень маленькие, простые и работают хорошо.

Я не могу понять, как можно получать почту с сервера (см. Связанный пост Проблема с подключением на Python почтовый сервер с Java верблюжьим приложением ). У меня сложилось впечатление, что SMTP-сервер может использоваться только для передачи сообщений (отправка, ответ или пересылка) и что мне нужен сервер другого типа, чтобы иметь возможность получать почту с сервера.

Может ли кто-нибудь дать мне представление о том, как я могу решить эту проблему? Существуют ли не SMTP-почтовые серверы, которые обрабатывают запросы на почту от клиента? Если так, какова их доступность? Будем благодарны за любые предложения.

ОБНОВЛЕНИЕ :

В соответствии с предложениями @Alexey R, я посмотрел и попытался использовать Greenmail (http://www.icegreen.com/greenmail/#). Кажется, это хорошо документировано, но мне не очень повезло заставить его работать. Я уверен, что это потому, что я понятия не имею, что я делаю;)

Одна вещь, которая несколько смущает меня, это то, что большинство примеров, кажется, в контексте выполнения модульных тестов. Я не пытаюсь выполнить модульные или интеграционные тесты для чего-либо, скорее мне просто нужна возможность отправлять и получать сообщения электронной почты.

Вот мои эксперименты:

( Примечание : это отдельные приложения Spring Boot, запускаемые с: 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. Попытка 1
  2. Попытка 2

Попытка 1, когда больше ничего не выполняется, никогда не получает почту. Попытка 1 с запущенной автономной версией приводит к конфликтам привязки порта.

Попытка 2, когда больше ничего не работает, выдает исключение, что она не подключена. Попытка 2 с запущенной автономной версией приводит к конфликтам привязки порта.

Я не понимаю разницы или вариантов использования этих двух подходов. Я просто скопировал их из примеров и попытался посмотреть, будут ли они работать. Я действительно понятия не имею, что они делают (или пытаются сделать).

По большей части, я думаю, что понимаю, почему я вижу результаты, которые я получаю, но я не уверен, что мне нужно сделать, чтобы "сделать это правильно". Я думаю, в более широком смысле, c, я просто не знаю, как правильно использовать API для достижения моих целей.

ОБНОВЛЕНИЕ 2 :

После дополнительных исследований и исследований я начинаю понимать, что почтовые серверы SMTP и IMAP (или POP3) играют разные и взаимодополняющие роли. SMTP в основном предназначен для отправки почты (а также ретрансляции или пересылки), а IMAP - для получения почты. Пожалуйста, исправьте меня, если я ошибаюсь в этом описании.

Тогда может показаться, что если я попытаюсь использовать «систему электронной почты», то «целевое» приложение отправит почту * 1074. * на или на получение почты от , мне нужно реализовать (или использовать существующую реализацию) и сервер SMTP и IMAP. Также может показаться, что SMTP-сервер должен был бы сделать почту, отправленную с отправляющего клиента, доступной для IMAP-сервера, чтобы получающий клиент мог запросить его. Имеет ли это смысл?

Если это более или менее правильное представление, какие рекомендации существуют для простых серверов SMTP и IMAP? Кроме того, каждый из них нуждается в дополнительном клиенте? Это так много, что я не понимаю. Я не против того, чтобы использовать либо существующие (желательно бесплатные и с открытым исходным кодом) решения, либо, если это достаточно легко понять и реализовать (хорошая документация!), Писать свои собственные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...