JavaMail

A Wikipédiából, a szabad enciklopédiából
JavaMail
Fejlesztő Oracle Corporation
Legfrissebb stabil kiadás 1.5.1 (2013. november 13.) +/-
Legfrissebb fejlesztői kiadás ismeretlen +/-
Állapot aktív
Kategória Java APIk
A JavaMail weboldala

A JavaMail egy Java nyelven írt alkalmazásprogramozási felület, amivel e-maileket küldeni és fogadni SMTP, POP3 és IMAP protokollokon keresztül. A JavaMail a Java EE specifikáció részét képezi, de egy opcionális csomag segítségével Java SE környezetben is használható.

A hivatalos referenciaimplementáció mellett létezik egy másik, szintén nyílt forráskódú implementáció, a GNU JavaMail. Igaz, hogy csak a JavaMail 1.3-as változatát támogatja, de ezen kívül lehetőséget kínál NNTP csatlakozásra is. Ezzel a rendszerrel tehát hírfolyamcikkeket lehet írni és olvasni.

A JavaMail komponensei[szerkesztés | forrásszöveg szerkesztése]

  • Message osztály: egy levél attribútumait és a tartalmi részét foglalja magába
  • Folder osztály: leveleket és almappákat tartalmazhat, valamint levelek másolását, törlését, összefűzését is lehetővé tevő metódusokat definiál
  • Store osztály: egy adatbázist definiál, amely magába foglalja a könyvtárszerkezetet és az abban lévő leveleket, valamint metódusokat biztosít az adatbázishoz kapcsolódáshoz, lekérdezéséhez, valamint a kapcsolat megszüntetéséhez
  • Transport osztály: a levél célba való eljuttatásáért felelős, metódusokat definiál a több címzettnek való küldéshez is
  • Session osztály: olyan globális és felhasználókénti tulajdonságokat definiál, amelyek meghatározzák a levelezésre képes alkalmazások és a hálózat közötti interfészt

A JavaMail használata[szerkesztés | forrásszöveg szerkesztése]

1. Egy JavaMail kliens jellemzően egy Session objektum létrehozásával kezdődik:

Session session = Session.getInstance(props, authenticator);

2. A Session objekum getStore() metódusának segítségével kapcsolódik az alapértelmezett tárolóhoz, valamint a connect() metódus segítségével hozhatja létre a tényleges kapcsolatot:

Store store = session.getStore(); 
store.connect();

3. Amennyiben a kapcsolat sikeresen létrejött, a kliens eléri az adott tároló mappáit és az azokban lévő leveleket:

// az INBOX mappa lekérése
Folder inbox = store.getFolder("INBOX");
// az INBOX mappa megnyitása
inbox.open(Folder.READ_WRITE);   
// az első levél lekérése
Message m = inbox.getMessage(1);       
// a levél címének lekérése  
String subject = m.getSubject(); 
// a levél tartalmának lekérése      
Object content = m.getContent();

4. Végezetül a kliens bezárja az összes megnyitott mappát, valamint a tárolót:

// INBOX bezárása 
inbox.close();   
// a tároló bezárása          
store.close();

Egyrészes, sima szöveges email küldése[szerkesztés | forrásszöveg szerkesztése]

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class TestEmail {
 
    public static void main(String[] args) {
 
        String to = "sendToMailAddress";
        String from = "sendFromMailAddress";
        String host = "smtp.yourisp.net";
 
        Properties props = new Properties();
 
        // Ha a statikus Transport.send()-et használjuk,
        // meg kell adni melyik hoston keresztül küldjünk
        props.put("mail.smtp.host", host);
 
        // Debug bekapcs
        props.put("mail.debug", "true");
        Session session = Session.getInstance(props);
 
        try {
            Message msg = new MimeMessage(session);
 
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("sima, szöveges email java kódból");
            msg.setSentDate(new Date());
            msg.setText("Íme itt az üzenet,\n" +
                        "ez a második sora.");
 
            Transport.send(msg);
        }
        catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
}

Többrészes email és HTML-email küldése valamint fájl csatolása[szerkesztés | forrásszöveg szerkesztése]

import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendMailUsage {
 
    public static void main(String[] args) {
 
        String to = "sendToMailAddress";
        String from = "sendFromMailAddress";
        String host = "smtpserver.yourisp.net";
 
        Properties props = new Properties();
 
        // Ha a statikus Transport.send()-et használjuk,
        // meg kell adni melyik hoston keresztül küldjünk 
        props.put("mail.smtp.host", host);
 
        // Debug bekapcsolása
        props.put("mail.debug", "true");
 
        Session session = Session.getInstance(props);
 
        try {
            // Transport objektummal történő küldés
            Transport bus = session.getTransport("smtp");
 
            // Csak egyszer csatlakozik
            // Transport.send() minden küldés után kapcsolatot bont
            // Általában, SMTP-hez nem szükséges felhasználónév és jelszó 
            bus.connect();
            //de ha mégis, akkor
            //bus.connect("smtpserver.yourisp.net", "username", "password");
 
            Message msg = new MimeMessage(session);
 
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("javás emailküldés");
            msg.setSentDate(new Date());
 
            // Üzenet tartalmának megadása és küldés
            setTextContent(msg);
            msg.saveChanges();
            bus.sendMessage(msg, address);
 
            setMultipartContent(msg);
            msg.saveChanges();
            bus.sendMessage(msg, address);
 
            setFileAsAttachment(msg, "C:/WINDOWS/CLOUD.GIF");
            msg.saveChanges();
            bus.sendMessage(msg, address);
 
            setHTMLContent(msg);
            msg.saveChanges();
            bus.sendMessage(msg, address);
 
            bus.close();
 
        }
        catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
 
    // Egyszerű, egyrészes text/plain email
    public static void setTextContent(Message msg) throws MessagingException {
            // Üzenet tartalmának beállítása
            String mytxt = "Íme itt az email, \n" +
                            "ez a második sora.";
            msg.setText(mytxt);
 
            // A form tartalmának megváltoztatása az általunk definiáltra
            msg.setContent(mytxt, "text/plain");
 
    }
 
    // Egyszerű többrészes e-mail. Mindkét törzsrész text/plain.
    public static void setMultipartContent(Message msg) throws MessagingException {
        // Első rész létrehozása és kitöltése
        MimeBodyPart p1 = new MimeBodyPart();
        p1.setText("This is part one of a test multipart e-mail.");
 
        // Második rész létrehozása és kitöltése
        MimeBodyPart p2 = new MimeBodyPart();
        // A karakterkészlet beállítása
        p2.setText("Ez a második rész", "utf-8");
 
        // Multipart létrehozása. A törzsrészeket hozzáadjuk.
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(p1);
        mp.addBodyPart(p2);
 
        // Beállítjuk a Multipartot az üzenet tartalmának
        msg.setContent(mp);
    }
 
    // Fájl csatolása a JAF FileDataSource használatával:
    public static void setFileAsAttachment(Message msg, String filename)throws MessagingException {
 
        // Első rész létrehozása és kitöltése
        MimeBodyPart p1 = new MimeBodyPart();
        p1.setText("Ez az email első része." +
                    "A második rész csatolmány.");
 
        // Második rész létrehozása és kitöltése
        MimeBodyPart p2 = new MimeBodyPart();
 
        // Betesszük a fájlt a második részbe
        FileDataSource fds = new FileDataSource(filename);
        p2.setDataHandler(new DataHandler(fds));
        p2.setFileName(fds.getName());
 
        // Multipart létrehozása. A törzsrészeket hozzáadjuk.
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(p1);
        mp.addBodyPart(p2);
 
        // Beállítjuk a Multipart-ot üzenet tartalmának
        msg.setContent(mp);
    }
 
    // Egyrészes HTML-tartalom beállítása.
    // Bármilyen más típusú adat küldése hasonló
    public static void setHTMLContent(Message msg) throws MessagingException {
 
        String html = "<html><head><title>" +
                        msg.getSubject() +
                        "</title></head><body><h1>" +
                        msg.getSubject() +
                        "</h1><p>This is a test of sending an HTML e-mail" +
                        " through Java.</body></html>";
 
        // HTMLDataSource egy belső osztály
        msg.setDataHandler(new DataHandler(new HTMLDataSource(html)));
    }
 
    	/*
* Belső osztály, hogy JAF adatforrásként HTML e-mail tartalmat *küldhessünk
    	 */
    Static class HTMLDataSource implements DataSource {
        private String html;
 
        public HTMLDataSource(String htmlString) {
            html = htmlString;
        }
 
        // HTML string InputStream-ként történő visszaadása.
        // Minden alkalamommal új folyamot kell visszaadni.
        public InputStream getInputStream() throws IOException {
            if (html == null) throw new IOException("Null HTML");
            return new ByteArrayInputStream(html.getBytes());
        }
 
        public OutputStream getOutputStream() throws IOException {
            throw new IOException("This DataHandler cannot write HTML");
        }
 
        public String getContentType() {
            return "text/html";
        }
 
        public String getName() {
            return "JAF text/html dataSource to send e-mail only";
        }
    }
 
}

Licence[szerkesztés | forrásszöveg szerkesztése]

A JavaMail a Project Kenai részeként nyílt forráskódú program.

A forráskód a következő licencek alatt érhető el:

Források[szerkesztés | forrásszöveg szerkesztése]

További információk[szerkesztés | forrásszöveg szerkesztése]