Aplikacja do wysyłania poczty

W ramach zadania należy zaimplementować w technologii J2EE aplikację do
wysyłania poczty elektronicznej do wielu odbiorców.

Aplikacja ma mieć następującą funkcjonalność:
- wysyłanie poczty do jednego lub wielu odbiorców naraz
- zapamiętywanie wysłanych listów w bazie danych, z możliwością przeglądania
  i wykorzystania do ponownej wysyłki
- nie jest wymagana obsługa HTML ani załączników - wystarczy możliwość
  wysyłania zwykłych listów tekstowych
- możliwość wykorzystywania do wysyłki listów wielu serwerów SMTP - do
  różnych adresatów listy mogą być wysyłane przez różne serwery SMTP
- książka adresowa - możliwość dodawania, usuwania i edycji wpisów oraz
  wykorzystywania wpisów do wysyłki listów;
  wpis powinien zawierać dane osobowe, adres email oraz (opcjonalnie) nazwę
  serwera SMTP przez który należy wysyłać listy do danej osoby;
  konfiguracja aplikacji ma zawierać adres domyślnego serwera SMTP - używany
  gdy dla adresata nie jest podany inny serwer
- ze względu na czasochłonność wysyłki listu do wielu adresatów, wysyłka
  powinna być realizowana asynchronicznie: komponent warstwy logiki wstawia
  żądania wysyłki do kolejki JMS, skąd są pobierane i realizowane przez
  komponent MDB
- do wysyłania poczty przez SMTP używamy API JavaMail
- aplikacja ma być wyposażona w dwa zupełnie różne implementacyjnie i
  wizualnie (ale równoważne funkcjonalnie) interfejsy użytkownika:
  - interfejs WWW zrealizowany z użyciem stron JSP (i opcjonalnie jednego z
    frameworków MVC, np. Struts, Tapestry, WebWork itp.)
  - interfejs w zupełnie innej technologii - np. program kliencki
    komunikujący się z warstwą logiki przez zdalnie wywołania (RMI, CORBA
    lub SOAP) lub interfejs oparty o "grubego" klienta (jeden z interfejsów
    w technologii XUL, Droplets itp) lub jeszcze inny;

  celem realizacji dwóch interfejsów jest wymuszenie całkowitej separacji
  warstwy prezentacji od warstwy logiki.
- do komunikacji z bazą danych można użyć bezpośrednich wywołań JDBC,
  mechanizmów EJB (CMP), biblioteki Hibernate lub interfejsu JDO - wedle
  uznania
- logika aplikacji może (ale nie musi) korzystać z komponentów Session
  Beans.