Version 9, last updated by dj_necro at December 03, 2009 09:13 UTC

Poniżej przedstawiam wyniki research'u w związku z fragmentem projektu odpowiedzialnym za logikę aplikacji.

 

WSTĘP, czyli czego potrzebujemy  

Biorąc pod uwagę ogólny zarys funkcjonalności konieczne jest utworzenie mechanizmu pozwalającego na odbieranie (ew. wysyłanie - zal. od dodatkowych funkcjonalności) wiadomości e-mail, następnie, w zależności od statusu danego adresu: jeśli jest aktywny zapisanie ich w bazie danych, a gdy nieaktywny dodanie odpowiedniego wpisu do części ze statystykami. Złożonośc problemu rośnie ze wzgledu na to, że system musi zarządzac wieloma róznymi domenami, co wymaga wykorzystania własnego serwera DNS (Więcej na temat : domeny)

 

Potrzebny jest serwer umożliwiający zarządzanie pocztą elektroniczną przez protokół POP3 lub IMAP (opcjonalnie SMTP), którego bazę użytkowników można zintegrowac z bazą użytkowników naszej aplikacji, oraz taki, który umożliwi wybranie i skonfigurowanie serwera DNS pod kątem korzystania z naszego serwisu.

 

 

1. JES Java Email Server (REJECTED) 

 Jest to implementacja serwera POP3 i SMTP stworzona na bazie  przez Erica Daughtery, udostępniona na licencji LGPL.

Serwer jest prosty, wykorzystuje minimum rzeczy koniecznych dostarczając pełnej implementacji począwszy od zarządzania socket'ami po autentykację uzytkowników. Po drobnych modyfikacjach, głównie dotyczących persystencji maili można by go było wykorzystac do naszego projektu.

Jego wadą jest natomiast fakt, że korzysta bezpośrednio z biblioteki javaDNS co jednoznacznie zmuszało by nas do użycia tego własnie serwera nazw. Drugim problemem jest fakt, że nie implementuje on standardów MIME, co wymusza obsługę tylko i wyłącznie tekstowych wiadomosci.

Więcej na temat JES'a TUTAJ

 

 2. JAMES - Java Apache Mail Enterprise Server (ACCEPTED)

 Jest to napisany w 100% w Javie, bezpieczny i przenośny serwer E-mail, wyprodukowany przez Apache. Dzięki abstrakcyjnemu modelowi rdzenia odpowiedzialnego za zarządzanie wiadomościami i zestawowi modułów odpowiedzialnych za konkretne protokoły JAMES znajduje szerokie zastosowanie. Jedną z głównych zalet JAMES jest support dla Spring'a. Warto również dodać, że jest w pełni kompatybilny z biblioteką Mime4J, która dostarcza możliwości parsowania wiadomosci typu MIME.

 

Główne cechy, na które warto zwrócic uwagę:

  • możliwość konfiguracji do współpracy z dowolnym DNS'em.
  • parsery email w standardzie plain RFC822 (wiadomośc tekstowa) oraz MIME (załączniki, obrazki, html) - Biblioteka MIME4J.
  • Obsługa protokołów POP3, IMAP, SMTP.
  • wsparcie dla Spring'a.
  • Możliwośc bogatej konfiguracji Storage'u zarówno dla systemu plików jak i bazy danych.
  • wbudowana obsługa Mailet'ów - samodzielnych agentów przetwarzających maile, analogicznych do Servletów dla WebService'ów.
  • Bogate możliwości testowania  - narzędzie Postage współpracujące z JAMES pozwala na "stress testing" serwera przez generowanie sztucznego ruchu mailowego.

 
Więcej na temat JAMES można przeczytac tutaj

 

 RÓŻNE MODELE ROZWIĄZAŃ W OPARCIU O FUNKCJONALNOŚĆ JAMES

 

MODEL 1 

 

 Model pierwszy działa w oparciu o mechanizm Storage'u servera JAMES.

Dzięki odpowiedniemu skonfigurowaniu dostępu do bazy oraz zapytań można sprawic, że JAMES wykorzysta bazę danych aplikacji, w celu pobrania informacji dla autentykacji użytkowników (2) oraz przechowywania wiadomości (1).

Konfiguracja zapytań SQL jest dostępna w pliku file:sqlResources.xml.

Warstwa prezentacji, oraz warstwa logiki odpowiedzialna za dodatkowe funkcjonalności (np. prowadzenie statystyk) operuje poprzez DAO na informacjach zawartych w Bazie Danych. (3)


Wadą tego podejścia jest zwiększone obciążenie bazy danych, gdyż istnieje koniecznośc odbierania wszystkich emaili, a następnie przetwarzania ich, włącznie z usunięciem tych niepotrzebnych z punktu widzenia celu projektu. 

 

 

MODEL 2

Model drugi pod wieloma aspektami przypomina model pierwszy.

W tym wypadku również przewidziane jest wykorzystanie mechanizmu Storage servera JAMES, w tym przypadku do autentykacji użytkowników przez serwer(3).Warstwa prezentacji tak jak poprzednio poprzez DAO odwołuje się do Bazy Danych (4)

Główna różnica polega na tym, że JAMES sam z siebie nie przechowuje odbieranych wiadomości, natomiast są one przekazywane do warstwy logiki biznesowej, która odpowiada za ich przetworzenie (w tym weryfikację czy adres jest aktywny), a następnie zapisanie odpowiednich informacji w Bazie Danych.

Do wykonania wyżej wspomnianych operacji na serwerze JAMES można wykorzystać dwa różne podejścia:

1 . Napisanie działającego w wątku programu przy wykorzystaniu biblioteki JavaMail, który co pewien krótki okres czasu sprawdza zawartość serwera pod kątem nowych wiadomości, a następnie odpowiednio je przetwarza.

Przykładowy kod klienta pisanego z użyciem JavaMail można znaleźć tutaj : file:javamail_example_client.java

 

2. Biorąc pod uwagę to, że JAMES jest kontenerem Mailet'ów można wykorzystac mechanizm Apache Mailets do przetwarzania przychodzących wiadomości, a następnie ich zapisu do Bazy Danych.

Mailety i Matchery to agenty współpracujące z JAMES i ustawiane przez jego pliki konfiguracyjne, zajmujące się filtrowaniem i przetwarzaniem przychodzących wiadomości.

Ich cykl życia jest bardzo prosty:

1. init(MailetConfig config) - tutaj odbywa sie konfiguracja i przekazanie informacji środowiskowych

2. service(Mail mail) - Tutaj pojawia się umplementacja kodu do przetworzenia obiektu Mail, i zapisania odpowiednich danych przy wykorzystaniu DAO do bazy. Metoda ta jest wywoływana wielokrotnie podczas cyklu życia, UWAGA !!! może być wywołana współbieżnie.

3. destroy() - wywoływana pod koniec cyklu życia obiektu

Odpowiednio zaimplementowany mailet "wstrzyknięty" do konfiguracji JAMES'a może sprawnie i bez dodatkowych obciążeń takich jak nasłuchiwanie zmian, czy przechowywanie maili w pamięci, poradzic sobie z przetwarzaniem wiadomości na tym poziomie jakiego my wymagamy.

W przypadku części dodatkowych funkcjonalności możemy z powodzeniem wykorzystac zaimplementowane już mailety (np. Redirect)