Programování

Rychlý start JavaMail

V prostředí JavaMail najdete rozhraní API a implementace poskytovatelů, které vám umožní vyvíjet plně funkční aplikace e-mailových klientů. „E-mailové klientské aplikace“ vyvolává myšlenky na Microsoft Outlook; a ano, můžete napsat vlastní náhradu aplikace Outlook. Ale e-mailový klient nemusí vůbec zůstat na klientském počítači. Ve skutečnosti to může být servlet nebo EJB spuštěný na vzdáleném serveru, který poskytuje přístup koncového uživatele k e-mailu prostřednictvím webového prohlížeče. Přemýšlejte o Hotmailu (ano, můžete napsat i vlastní verzi Hotmailu). Nebo se můžete úplně vyhnout uživatelskému rozhraní. A co automatická odpověď, která čte příchozí zprávy a odesílá odpovědi přizpůsobené podle původního odesílatele?

V mém vlastním projektu pro domácí mazlíčky čte mluvící e-mailový klient - tj. Mluví - příchozí zprávy. Je založen na zdokonalení nápadu, který jsem představil v „Talking Java!“ O tom vám povím později.

Prozatím začněte instalací a konfigurací softwaru JavaMail.

Založit

Pokud používáte platformu Java 2, Enterprise Edition (J2EE) 1.3, máte štěstí: obsahuje JavaMail, takže není nutné žádné další nastavení. Pokud však používáte platformu Java 2 Platform Standard Edition (J2SE) 1.1.7 a vyšší a chcete e-mail pro své aplikace, stáhněte si a nainstalujte následující:

  • JavaMail
  • JavaBeans Activation Framework

Chcete-li nainstalovat, jednoduše rozbalte stažené soubory a přidejte obsažené soubory jar do své cesty ke třídě. Jako příklad je zde moje classpath pro tento projekt:

.; C: \ Apps \ Java \ javamail-1.2 \ mail.jar; C: \ Apps \ Java \ javamail-1.2 \ mailapi.jar; C: \ Apps \ Java \ javamail-1.2 \ pop3.jar; C: \ Apps \ Java \ javamail-1.2 \ smtp.jar; C: \ Apps \ Java \ jaf-1.0.1 \ activation.jar 

The mailapi.jar soubor obsahuje základní třídy API, zatímco soubor pop3.jar a smtp.jar soubory obsahují implementace poskytovatele pro příslušné poštovní protokoly. (Nebudeme používat imap.jar Soubor v tomto článku.) Implementace poskytovatele považujte za podobné ovladačům JDBC (Java Database Connectivity), ale spíše pro systémy zasílání zpráv než pro databáze. jako pro mail.jar Soubor obsahuje každý z výše uvedených souborů jar, takže můžete omezit svou cestu ke třídě pouze na mail.jar a activation.jar soubory.

The activation.jar Soubor vám umožňuje zpracovávat typy MIME (Multipurpose Internet Mail Extensions) dostupné prostřednictvím binárních datových proudů. Podívejte se na DataHandler třída v Nejen prostý text část později.

Zbytek článku v tomto článku nenabízí komplexní pokrytí API; spíše se naučíte cvičením. Pokud hledáte podrobné informace o API, podívejte se na soubory PDF a Javadocs obsažené v příslušných balíčcích ke stažení.

Po instalaci softwaru musíte získat podrobnosti o e-mailovém účtu, abyste mohli spustit následující příklady. Budete potřebovat název serveru ISP SMTP (Simple Mail Transfer Protocol) a název serveru POP (Post Office Protocol), přihlašovací jméno e-mailového účtu a heslo poštovní schránky. Obrázek 1 ukazuje moje podrobnosti, rozumíte, ne ty skutečné, jak jsou používány v aplikaci Microsoft Outlook.

Odesílání e-mailů přes SMTP

První příklad ukazuje, jak odeslat základní e-mailovou zprávu přes SMTP. Níže najdete SimpleSender třída, která převezme podrobnosti vaší zprávy z příkazového řádku a zavolá samostatnou metodu - poslat(...) - odeslat:

balíček com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; import java.util. *; / ** * Jednoduchá třída odesílatele e-mailu. * / public class SimpleSender {/ ** * Hlavní metoda pro odeslání zprávy zadané na příkazovém řádku. * / public static void main (String args []) {try {String smtpServer = args [0]; Řetězec to = args [1]; Řetězec z = args [2]; Řetězcový předmět = args [3]; Tělo řetězce = args [4]; odeslat (smtpServer, na, od, předmět, tělo); } catch (Exception ex) {System.out.println ("Použití: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Dále spusťte SimpleSender jak je uvedeno níže. Nahradit smtp.myISP.net s vlastním serverem SMTP, jak je odvozeno z vašeho nastavení pošty:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] „Dobrý den“ „Jen pozdravit.“ 

A pokud to funguje, na přijímacím konci uvidíte něco jako to, co je znázorněno na obrázku 2.

The poslat(...) metoda doplňuje SimpleSender třída. Nejprve ukážu kód a teorii podrobně rozvedu:

 / ** * metoda "odeslat" k odeslání zprávy. * / public static void send (String smtpServer, String to, String from, String subject, String body) {try {Properties props = System.getProperties (); // - Připojení k výchozí relaci, nebo bychom mohli spustit novou - props.put ("mail.smtp.host", smtpServer); Session session = Session.getDefaultInstance (rekvizity, null); // - Vytvořit novou zprávu - Zpráva msg = nová MimeMessage (relace); // - Nastavit pole FROM a TO - msg.setFrom (new InternetAddress (from)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (to, false)); // - Mohli bychom zahrnout i příjemce CC - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Nastavit předmět a hlavní text - msg.setSubject (subject); msg.setText (tělo); // - Nastavit další informace v záhlaví - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (nové datum ()); // - Odeslat zprávu - Transport.send (msg); System.out.println ("Zpráva odeslána v pořádku."); } catch (Exception ex) {ex.printStackTrace (); }}} 

Nejprve si všimněte, že dostáváte relaci pošty (java.mail.Session), bez kterého nemůžete nic dělat. V tomto případě voláte Session.getDefaultInstance (...) získat sdílenou relaci, kterou mohou ostatní desktopové aplikace znovu použít; můžete také nastavit zcela novou relaci - prostřednictvím Session.getInstance (...) metoda - to by bylo pro vaši aplikaci jedinečné. Druhá možnost by se mohla ukázat důležitou pro e-mailové klienty, kteří nejsou izolováni na základě jednotlivých uživatelů, například webový e-mailový systém implementovaný pomocí servletů.

Navázání relace vyžaduje, abyste nastavili určité vlastnosti; minimálně potřebujete mail.smtp.host vlastnost, pokud posíláte zprávy přes SMTP. Najdete další vlastnosti popsané v dokumentaci API.

Jakmile máte relaci, vytvořte zprávu. V tomto příkladu nastavujete zprávu z a na e-mailové adresy, předmět, a tělo text, vše převzato původně z příkazového řádku. Nastavujete také některé informace v záhlaví, včetně data, a můžete je určit cc příjemci, pokud chcete.

Nakonec zprávu odešlete prostřednictvím javax.mail.Transport třída. Pokud vás zajímá, jak ví o naší poštovní relaci, podívejte se zpět na konstruktor zprávy.

Nejen prostý text

The setText (...) pohodlná metoda ve třídě javax.mail.Message (zděděno z javax.mail.Část interface) nastaví obsah zprávy na dodaný řetězec a nastaví typ MIME na text / prostý.

Nejste však omezeni na prostý text: další typy obsahu můžete odesílat prostřednictvím setDataHandler (...) metoda. Ve většině případů můžete pod pojmem „jiné typy obsahu“ rozumět přílohy souborů, například dokumenty Word, ale pro něco trochu zajímavějšího zkontrolujte tento kód pro odesílání serializovaného objektu Java:

ByteArrayOutputStream byteStream = nový ByteArrayOutputStream (); ObjectOutputStream objectStream = nový ObjectOutputStream (byteStream); objectStream.writeObject (theObject); msg.setDataHandler (nový DataHandler (nový ByteArrayDataSource (byteStream.toByteArray (), "lotontech / javaobject")))); 

Nenajdete DataHandler třída v rámci javax.mail. * struktura balíčku, protože patří do balíčku JavaBeans Activation Framework (JAF) javax.activation. Nezapomeňte, že jste si stáhli distribuci JAF i JavaMail. JAF poskytuje mechanismus pro manipulaci napsaný datový obsah, což pro internetový obsah znamená typy MIME.

A pokud opravdu vyzkoušíte výše uvedený kód pro odeslání objektu Java e-mailem, budete mít potíže s nalezením ByteArrayDataSource třídy, protože ani jeden mail.jar ani activation.jar zahrnout to. Zkuste se podívat do ukázkového adresáře JavaMail!

Pokud jde o ty přílohy souborů, které vás zpočátku pravděpodobněji zajímají, vytvořili byste a javax.activation.FileDataSource instance v DataHandlerkonstruktor. Samozřejmě není pravděpodobné, že pošlete soubor sám; spíše to bude pravděpodobně příloha k textové zprávě. K tomu musíte pochopit koncept vícedílných zpráv, takže tento koncept představím nyní, v kontextu přijímání e-mailů.

Příjem e-mailů přes POP3

Dříve jsem představil javax.mail.Část rozhraní implementované javax.mail.Message. Nyní vysvětlím jeho části zprávy, které jsou v tomto příkladu důležité. Nejprve se podívejte na obrázek 3.

Obrázek 3 ukazuje a Zpráva jak byl vytvořen v předchozím příkladu, který je jak zprávou, tak částí zprávy, protože implementuje Část rozhraní. Pro jakoukoli část můžete získat její obsah (jakýkoli objekt Java) a v případě jednoduché textové zprávy může být objektem obsahu Tětiva. U vícedílné zprávy bude obsah typu Vícedílné, od kterých se můžeme zmocnit jednotlivých částí těla, které samy realizují Část rozhraní.

V praxi se vše projeví při procházení kódu a Jednoduchý přijímač třída, kterou představím ve třech částech: první, definice třídy a hlavní(...) metoda, která bere podrobnosti o připojení z příkazového řádku; zadruhé dostávat(...) metoda, která zachycuje a prochází příchozí zprávy; a nakonec printMessage (...) metoda, která vytiskne informace o záhlaví a obsah každé zprávy.

Tady je první část:

balíček com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; import java.util. *; importovat java.io. *; / ** * Jednoduchá třída přijímače e-mailů. * / public class SimpleReceiver {/ ** * Hlavní metoda pro příjem zpráv z poštovního serveru zadaná * jako argumenty příkazového řádku. * / public static void main (String args []) {try {String popServer = args [0]; Řetězec popUser = args [1]; Řetězec popPassword = args [2]; příjem (popServer, popUser, popPassword); } catch (Exception ex) {System.out.println ("Použití: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Později vás provedu řádnou testovací jízdou, ale prozatím je zde příkazový řádek ke spuštění (nezapomeňte nahradit argumenty příkazu nastavením pošty):

> java com.lotontech.mail.SimpleReceiver pop.myIsp.net myUserName myPassword 

The dostávat(...) metoda - volána z hlavní(...) - otevře vaši POP3 DORUČENOU složku a při každém volání postupně posílá zprávy printMessage (...). Zde je kód:

 / ** * Metoda "přijímat" k načtení zpráv a jejich zpracování. * / public static void receive (String popServer, String popUser, String popPassword) {Store store = null; Folder folder = null; zkuste {// - Chyťte výchozí relaci - Vlastnosti props = System.getProperties (); Session session = Session.getDefaultInstance (rekvizity, null); // - Chyťte úložiště zpráv POP3 a připojte se k němu - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Pokuste se chytit výchozí složku - folder = store.getDefaultFolder (); if (folder == null) throw new Exception ("No default folder"); // - ... a jeho Doručená pošta - složka = folder.getFolder ("Doručená pošta"); if (folder == null) throw new Exception ("No POP3 INBOX"); // - Otevřít složku pouze pro čtení - folder.open (Folder.READ_ONLY); // - Získejte obálky zpráv a zpracovejte je - Zpráva [] msgs = folder.getMessages (); for (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} catch (Exception ex) {ex.printStackTrace (); } konečně {// - pěkně se zavřete - zkuste {if (adresář! = null) adresář.close (false); if (store! = null) store.close (); } catch (Výjimka ex2) {ex2.printStackTrace ();}}} 

Všimněte si, že z relace získáváte obálku úložiště zpráv POP3 a poté se k ní připojujete pomocí nastavení pošty původně dodaného na příkazovém řádku.

Po připojení získáte popisovač výchozí složky - ve skutečnosti kořen stromu složek - a odtud složku Doručená pošta, která obsahuje příchozí zprávy. Otevřete Doručenou poštu pro přístup jen pro čtení; chytíte zprávy a procházíte je jeden po druhém.

Kromě toho by vás mohlo zajímat, jestli byste někdy chtěli otevřít DORUČENOU složku pro napsat přístup. Pokud byste chtěli označit zprávy jako přijaté nebo je odebrat ze serveru, měli byste. V našem příkladu se na ně jen díváte.

Nakonec v kódu výše dbáte na to, abyste po dokončení zavřeli složku a úložiště zpráv, což ponechá pouze printMessage (...) metoda k dokončení této třídy.

Vytiskněte zprávy

V této části dříve javax.mail.Část diskuse o rozhraní se stává relevantní.