2010-04-15 9 views
14

Ovviamente non è così difficile inviare e-mail da un'applicazione Java EE tramite JavaMail. Quello che mi interessa è il modello migliore per ricevere le email (la notifica rimbalza, soprattutto)? Non sono interessato agli approcci basati su IMAP/POP3 (polling nella casella di posta in arrivo) - la mia domanda deve rispondere alle e-mail in entrata.Come ricevere e-mail nell'applicazione Java EE

Un approccio che riuscivo a pensare sarebbe

  • Tenere esistente MTA (postfix su Linux nel mio caso) -> ops squadra sa già come configurare/operare
  • Per ogni i messaggi che arrivano, genera una app Java che riceve i dati e li invia tramite JMS. Potrei farlo tramite una voce in/etc/alias come myuser: "|/path/to/javahelper" con javahelper che chiama l'app Java, passando con STDIN.
  • MDB (parte dell'applicazione Java EE) riceve il messaggio JMS, lo analizza, rileva il messaggio di mancato recapito e agisce di conseguenza.

Un altro approccio potrebbe essere

  • Aprire un socket di rete di ascolto sulla porta 25 sul contenitore di applicazioni Java EE.
  • Associare un SessionBean al socket. Bean fa parte dell'applicazione Java EE e può analizzare/rilevare bounce/gestire direttamente i messaggi.
  • Tenere MTA esistente come relè in entrata, fare tutto il suo filtri di protezione/spam, ma le email in avanti per myuser (che passano il filtro) al contenitore di applicazioni Java EE, porta 25.

Il primo approccio che ho fatto prima (anche se in una lingua/configurazione diversa).

Da un punto di vista delle prestazioni e della (percezione) della pulizia, ritengo che il secondo approccio sia migliore, ma richiederebbe una corretta implementazione del trasporto SMTP. Inoltre, non so se è possibile connettere una presa di rete con un bean ...

Qual è il tuo consiglio? Avete dettagli sul secondo approccio?

+0

Quale approccio ha finalmente scelto? – Theo

+0

Il progetto è andato su un backburner per un bel po '. In questo momento ci sto lavorando di nuovo, ma non ho ancora implementato la parte ricevente. Finora, il mio piano è quello di seguire il suggerimento di sleske e scansionare una casella di posta elettronica a intervalli regolari tramite IMAP. – Hank

+0

Elimina il jms in op 1 e invialo tramite arricciatura generata/http a un endpoint di resto e puoi tagliare un pezzo (JMS/MDB) di conf/complex out. – alphazero

risposta

8

Non penso che il secondo approccio sia "più pulito". Al contrario, richiede l'implementazione di una parte significativa di un MTA standard, quindi raccomando di non farlo.

Credo che il polling di un server POP/IMAP sia in realtà il modo più semplice per farlo. Perché hai deciso di non farlo? Se il server POP/IMAP e il tuo servizio si trovano nella stessa LAN (o anche sullo stesso maching), un sondaggio sarà abbastanza economico. Puoi farlo ogni 10-20 secondi per un ritardo minimo, che non dovrebbe causare problemi. Anche se questo può sembrare un po 'tecnicamente inelegante, si utilizzerà un protocollo di interoperabilità standard (POP3/IMAP), che offre una certa flessibilità evitando di reimplementare un server di posta.

L'approccio di deposizione delle uova un'applicazione Java sembra praticabile, ma preferisco il polling, perché:

a) L'interfaccia si utilizza (POP3/IMAP) è più standardizzato, mentre l'interfaccia utilizzata per "plug-in" al server di posta sarà specifico del server (su Unix, si potrebbe usare eg procmail, ma si dipende ancora da software specifico)

b) Avviare un processo separato per mail avrà probabilmente molto più di polling.

Per inciso: un terzo approccio sarebbe quello di scaricare in qualche modo i messaggi in arrivo come file in una directory "in entrata" (molti server di posta possono farlo), quindi eseguire il polling della directory. Il polling di una directory sarà ancora meno costoso rispetto al polling di un server. State attenti di problemi di sincronizzazione (lettura posta a metà scritte, diversi lettori concorrenti leggono lo stesso file di posta ...)

La mia esperienza:

devo sistemi implementati utilizzando entrambi gli approcci (IMAP polling, e deposizione delle uova un separato processi). Il sondaggio riguardava un'applicazione Java abbastanza grande che elaborava i dati inviati dalle persone a una casella di posta; Non ho avuto problemi con i sondaggi. L'approccio di spawning era per un piccolo script Perl; L'ho fatto solo perché era un programma semplice che elaborava solo pochi messaggi al giorno e collegarlo al mailserver era più facile che eseguire IMAP in Perl.

+0

@sleske: Thx per la risposta dettagliata! Sfortunatamente il MTA non fornisce servizi POP3/IMAP (oggi) ... penserò a quale parte è più facile. – Hank

7

Il modo "corretto" secondo l'architettura Java EE sarebbe avere un connettore JCA per effettuare la connessione in entrata/uscita con il server SMTP.

Il connettore JCA può fare tutto ciò che si desidera, compresa la filettatura e il collegamento a sistemi esterni con prese. In realtà JMS è solo un tipo speciale di connettore JCA che si collega al broker JMS e recapita il messaggio a MDB "normale". Un connettore JCA può quindi eseguire il polling del server SMTP e recapitare il messaggio a un MDB personalizzato.

Il documento migliore su JCA è Creating Resource Adapters with J2EE Connector Architecture 1.5 e in realtà utilizza l'esempio di recapito della posta elettronica. Buona fortuna :) Ti suggerisco di dargli un'occhiata. Il codice può essere trovato come parte degli esempi Java EE e utilizza JavaMail, ma non so se è pronto per la produzione.

correlati:

+0

Sembra piuttosto complicato ... Perché non implementare solo un EJB stateless che periodicamente controlla la presenza di nuove e-mail (utilizzando il servizio timer)? L'approccio JCA mi offre ulteriori vantaggi in termini di prestazioni, affidabilità, ecc.? – Theo

+0

@Theo È possibile utilizzare un timer EJB o generare un thread da un 'ServletContextListener'. Ho usato entrambi per i processi in background, ma, secondo la "filosofia" JEE, tale infrastruttura dovrebbe essere gestita dal server dell'app stesso o da un connettore JCA e non far parte del codice dell'applicazione. Inoltre, le impostazioni di infrastruttura come le impostazioni SMTP non dovrebbero essere considerate come le impostazioni di "business" con 'env-entry'. Ma alla fine, questa è una questione di purezza del design e di ciò che si vuole che faccia il lavoro. Quindi vai avanti con ciò che è più semplice per te. – ewernli

+0

ewernli è corretto al 100% qui (in effetti questo sembra un potenziale progetto OSS davvero grande). * qualsiasi cosa * che fai al di fuori del set di funzionalità gestito dal contenitore * non è * coperta dallo SLA di un server di applicazioni JEE. Questo diventa particolarmente importante se si avvia la distribuzione attraverso i contenitori. – alphazero

2

Utilizzando un ESB - stand-alone o embeded.

"Un ESB offre concetti correlati al flusso come la trasformazione e il routing a un'architettura orientata ai servizi Un ESB può anche fornire un'astrazione per gli endpoint. ".

Per esempio MULE "Mule ESB è il più utilizzato open source ESB. Una piattaforma di integrazione e il servizio contenitore leggero, Mule ESB offre funzioni per i servizi web, il routing dei messaggi, la mediazione, trasformazione e gestione delle transazioni, aiutando gli sviluppatori integrare le loro applicazioni in ore, non settimane"

come ricevere messaggi di posta elettronica tramite mulo http://books.dzone.com/articles/mule-messaging-chapter?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fsoa+(SOA+Zone)

seguito è semplicemente di configurazione che inviare messaggi JMS come reazione messaggio ricevuto (è tutto ciò che serve) - definire in entrata (IMAP/pop3/etc) - definire in uscita.

<imap:inbound-endpoint user="bob" password="password" host="localhost" port="65433" checkFrequency="3000"/> 
<jms:outbound-endpoint queue="my.destination" connector-ref="jmsQueueConnector"/> 
+0

L'esempio con 'imap: inbound-endpoint' recupera i messaggi tramite IMAP, che è esattamente ciò che l'OP ha esplicitamente rifiutato. – sleske

+1

In effetti, dai documenti sembra che Mule non supporti nemmeno l'SMTP in arrivo, solo in uscita. Quindi Mule potrebbe non aiutare qui ... – sleske

+0

Anche se questo non è quello che l'OP cercherebbe, trovo che questa sia una soluzione più appropriata per un'azienda in quanto disaccoppia la gestione della posta elettronica dall'applicazione, l'applicazione può esporre un endpoint di servizio per i messaggi. –

3

Che dire di Apache James?

implementa tutto lo stack e consente di reagire alla posta in arrivo con un approccio simile a una servlet; è open source, completamente apache con licenza (quindi può essere utilizzato in prodotti commerciali) ed è già stato testato per anni.

+0

Fantastica idea, ci penserò! Sembra che potrebbe implementare il mio approccio basato sugli eventi. – Hank