Я пытаюсь разработать 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
- Попытка 2
Попытка 1, когда больше ничего не выполняется, никогда не получает почту. Попытка 1 с запущенной автономной версией приводит к конфликтам привязки порта.
Попытка 2, когда больше ничего не работает, выдает исключение, что она не подключена. Попытка 2 с запущенной автономной версией приводит к конфликтам привязки порта.
Я не понимаю разницы или вариантов использования этих двух подходов. Я просто скопировал их из примеров и попытался посмотреть, будут ли они работать. Я действительно понятия не имею, что они делают (или пытаются сделать).
По большей части, я думаю, что понимаю, почему я вижу результаты, которые я получаю, но я не уверен, что мне нужно сделать, чтобы "сделать это правильно". Я думаю, в более широком смысле, c, я просто не знаю, как правильно использовать API для достижения моих целей.
ОБНОВЛЕНИЕ 2 :
После дополнительных исследований и исследований я начинаю понимать, что почтовые серверы SMTP и IMAP (или POP3) играют разные и взаимодополняющие роли. SMTP в основном предназначен для отправки почты (а также ретрансляции или пересылки), а IMAP - для получения почты. Пожалуйста, исправьте меня, если я ошибаюсь в этом описании.
Тогда может показаться, что если я попытаюсь использовать «систему электронной почты», то «целевое» приложение отправит почту * 1074. * на или на получение почты от , мне нужно реализовать (или использовать существующую реализацию) и сервер SMTP и IMAP. Также может показаться, что SMTP-сервер должен был бы сделать почту, отправленную с отправляющего клиента, доступной для IMAP-сервера, чтобы получающий клиент мог запросить его. Имеет ли это смысл?
Если это более или менее правильное представление, какие рекомендации существуют для простых серверов SMTP и IMAP? Кроме того, каждый из них нуждается в дополнительном клиенте? Это так много, что я не понимаю. Я не против того, чтобы использовать либо существующие (желательно бесплатные и с открытым исходным кодом) решения, либо, если это достаточно легко понять и реализовать (хорошая документация!), Писать свои собственные.