JavaMail
Ezt a szócikket némileg át kellene dolgozni a wiki jelölőnyelv szabályainak figyelembevételével, hogy megfeleljen a Wikipédia alapvető stilisztikai és formai követelményeinek. |
A JavaMail egy olyan Java nyelven írt alkalmazásprogramozási felület, melyen keresztül SMTP, POP3 és IMAP protokollokon keresztül is lehet e-maileket küldeni és fogadni. A JavaMail Java EE platformon működik, de egy további csomaggal kibővítve Java SE alatt is lehet használni.
2011. január 21-én jelent meg a JavaMail 1.4.4 számú veziója.
Létezik egy másik, szintén nyílt forráskódú változata, 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.
JavaMail specifikációs célok
- az egyszerű, jól áttekinthető osztályok révén a fejlesztőknek könnyű elsajátítani és használni
- a jól megszokott programozási technikák alkalmazásával jól összeköthető más Java API-val
- a könnyűsúlyú osztályok és interfészek használata egyszerűvé teszi az alapvető e-mail szolgáltatások beépítését bármely alkalmazásba
- elősegíti a robosztus levelező rendszereket használó alkalmazásokat: többéle komplex levél formátumot, adattípust valamint protokollt támogat
A JavaMail komponensei
- Message osztály: egy levél attribútumait és a tartami részét foglalja magába
- Folder osztály: leveleket és almappákat tartalmzhat, valamint levelek másolását, törlését, összefűzését is lehetővá teő metódusokat deifiniá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
1. Egy JavaMail kliens tipikusan 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();
Licence
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
- http://en.wikipedia.org/wiki/Javamail
- http://www.oracle.com/technetwork/java/javamail-1-149769.pdf
- http://download.oracle.com/docs/cd/E19644-01/817-5449/djmail.html
Külső hivatkozások
JavaMail példák
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
// Egyszerű, egy részes text/plain e-mail küldése
public class TestEmail {
public static void main(String[] args) {
// EMAIL CÍM MEGADÁSA!!!
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// ISP MAIL SERVER MEGADÁSA!!!
String host = "smtp.yourisp.net";
// Beállítások létrehozása
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);
// Ha be szeretnénk tekinteni, hogy mi is történik
props.put("mail.debug", "true");
Session session = Session.getInstance(props);
try {
// Üzenet létrehozása
Message msg = new MimeMessage(session);
//Üzenet tulajdonságainak beállítása
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("Test E-Mail through Java");
msg.setSentDate(new Date());
// Üzenet tartalma
msg.setText("This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here is line 2.");
//Üzenet küldése
Transport.send(msg);
}
catch (MessagingException mex) {
// Megejelenítjük az összes lácolt kivételt!
mex.printStackTrace();
}
}
}// Az osztály vége
Minta Kód Többrészes E-Mail, HTML E-Mail és Fájl Csatolmány Küldésére
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) {
// EMAIL CÍM MEGADÁSA!!!
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// ISP MAIL SERVER MEGADÁSA!!!
String host = "smtpserver.yourisp.net";
// Session beállításainak létrehozása
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);
// Ha be szeretnénk tekinteni, hogy mi is történik
props.put("mail.debug", "true");
// Session lekérése
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ég is ->
//bus.connect("smtpserver.yourisp.net", "username", "password");
// Üzenet létrehozása
Message msg = new MimeMessage(session);
// Üzenet tulajdonságainak beállítása
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
// A vesszővel elválasztott email címek listájának párosítása.
msg.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(to, true));
// Parse comma/space-separated list. Cut some slack.
msg.setRecipients(Message.RecipientType.BCC,
InternetAddress.parse(to, false));
msg.setSubject("Test E-Mail through Java");
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) {
// Láncolt kivételek megjelenítése
mex.printStackTrace();
// Hogyan férjünk hozzá a láncolt kivételekhez
while (mex.getNextException() != null) {
// A következő kivétel a láncban
Exception ex = mex.getNextException();
ex.printStackTrace();
if (!(ex instanceof MessagingException)) break;
else mex = (MessagingException)ex;
}
}
}
// Egyszerű, egy részes text/plain e-mail
public static void setTextContent(Message msg) throws MessagingException {
// Üzenet tartalmának beállítása
String mytxt = "This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here is line 2.";
msg.setText(mytxt);
// A form tartalmának megváltoztatása az általunk definiáltra
msg.setContent(mytxt, "text/plain");
}
// Egyszerű több részes e-mail. Mind kettő törzs ré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 karakter készlet beállítása
p2.setText("This is the second part", "us-ascii");
// 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);
}
// Fájl csatolmányként történő beállítása. JAF FileDataSource-ját //használja.
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("This is part one of a test multipart e-mail." +
"The second part is file as an attachment");
// 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 tartalma 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;
}
// Hml 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";
}
}
} //Osztály vége