Access Keys:
Skip to content (Access Key - 0)


Oppbygging av en JavaMail applikasjon

Added by Joachim Haagen Skeie , last edited by Joachim Haagen Skeie on Nov 21, 2009 23:18
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

Det finnes flere metoder å byge opp en JavaMail applikasjon på. Sun har brukt mye tid på å frigjøre JavaMail fra protokoll spesifikke implementasjoner, som i kombinasjon med den objekt orienterte oppbygningen gjør at du som utvikler ikke trenger å vite noe som helst om hvordan epost protokollen du ønsker å kommunisere over fungerer.

Sette opp og installere JavaMail
Det første du må gjøre er å laste ned og installere JavaMail og Java Activation Framework (linker nederst på siden). Når du er ferdig med nedlastingen pakker du opp filene. I JavaMail mappen ligger det en fil som heter mail.jar, og i JAF pakken ligger activation.jar. Disse filene må du plassere i CLASSPATH variablen på maskinen din.

Inkluderede de nødvendige pakkene fra JavaMail

Å inkludere de nødvendige pakkene fra JavaMail inkluderer som rekel kun:

import javax.mail.*; 
import javax.mail.Internet; 

Sette opp egeneskapene for forbindelsen

Å sette opp egenskapene for forbindelsen gjøres før Session objektet opprettes, ettersom de sendes til Session objektet når det opprettes. Egenskapene benyttes til å fortelle Session hva slags type forbindelse du ønsker. JavaMail definerer en rekke forskjellige egenskaper, men jeg vil kun ta for meg POP og SMTP egeneskapene, så vel som egenskapene nødvendig for å autorisere deg mot epost serveren

JavaMail benytter seg av java.util.Properties for å lagre og holde rede på egenskapene, så det første steget er å hente ut egenskapene fra JVM.

Properties properties = System.getProperties(); 

Deretter må egenskapene for forbindelsen til epost serveren opprettes.

properties.put("mail.pop3.host", "mail.server.com");      //SMTP hostname 
properties.put("mail.pop3.auth", "true");               //Server requires authentication 
properties.put("mail.pop3.user", "brukernavn");         //Username 
properties.put("mail.pop3.password", "passord");       //Password 

Dersom du ønsker å få informasjon over forbindelsen underveis, må mail.debug settes til sann.

properties.put("mail.debug", "true); 

Dersom du ikke spesifiserer en egenskap vil JavaMail gå utifra at du vil ha standard verdiene. I eksempelet overfor vil JavaMail gå utifra at du ønsker en POP3 forbindelse til mail.server.com via port 25 ettersom mail.pop3.port ikke er angitt.

Generere autentikasjons informasjon

For å autorisere deg mot serveren må du først spesifisere "mail.smtp.auth" til "true" som overfor, og deretter sende et javax.mail.Authenticator objekt til Session objektet når det opprettes. Dette involverer som regel å opprette en egen klasse som arver fra javax.mail.Authenticator med en enkel metode getPasswordAuthentication.

import javax.mail.PasswordAuthentication; 

public class SMTPAuth extends javax.mail.Authenticator 
{ 
   private String username = ""; 
   private String password = ""; 

   public SMTPAuth(String username, String password) 
   { 
      this.username = username; 
      this.password = password; 
   } 

   public PasswordAuthentication getPasswordAuthenticator() 
   { 
      return new PasswordAuthentication(this.username, this.password); 
   } 
} 

Opprette eller hente ut Session objektet for forbindelsen

Første steget er å opprette et nytt SMTPAuth objekt som har brukernavn og passord. Deretter hentes et nytt Session objekt ut fra den statiske klassen Session (javax.mail.Session, ikke javax.HttpSession) og så sende både egenskapene opprettet overfor og autentikasjons objektet som parametere.

Authenticator authenticator = new SMTPAuth("brukernavn", "passord"); 
Session session = Session.getInstance(properties, authenticator); 

Koden overfor vil opprette et nytt Session objekt. Alternativt kan du kalle getDefaultInstance() som returnerer standard Session objektet for denne forbindelsen. Dersom ingen Session objekt er opprettet tidligere opprettes et nytt.

Sende epost

Det er tre steg som må gjennomføres for å sende epost. Først må et nytt Message objekt opprettes og fylles med innhold før eposten kan transporteres over nettet til mottageren.

Når du oppretter et nytt Message objekt sender du som regel en referanse til Session objektet for forbindelsen. Mest sannsynlig ønsker du å opprette et nytt MimeMessage objekt fra javax.mail.MimeMessage.

Message msg = new MimeMessage(session); 

Når Message objektet er opprettet kan det fylles med informasjon ved hjelp av standard setter metoder.

msg.setFrom(addressFrom);                   //Set the From address 
msg.setRecipients(Message.RecipientType.TO, addressTo);       //Set the to recipients 
msg.setRecipients(Message.RecipientType.CC, addressCc);       //Set the cc recipients 
msg.setRecipients(Message.RecipientType.BCC, addressBcc);    //Set the bcc recipients 
msg.setSubject(subject);                      //Set the subject 
msg.setContent(message, "text/plain");                //Set the content (main body) 

Deretter kan eposten transporteres til mottakeren ved hjelp av et Transport objekt. Før meldingen kan sendes må du lagre endringene.

msg.saveChanges(); 
Transport transport = session.getTransport("smtp"); 
transport.connect("mail.server.com", "brukernavn", "passord"); 
transport.sendMessage(msg, msg.getAllRecipients()); 
transport.close(); 

Alternativt kan du benytte Transport.send(msg) for å gjennomføre de fire stegene overfor. Fordelen med å opprette et nytt Transport objekt er at du kan sende flere meldinger gjennom samme forbindelse uten å måtte lukke og åpne en ny forbindelse for hver melding.

Motta epost

Å motta epost involverer flere steg enn å sende epost ettersom du må hente inn brukerens postkasse og meldinger. Det første steget er å hente ut lageret for den valgte protokollen og koble lageret opp mot epost serveren.

Store store = session.getStore("pop3"); 
store.connect("mail.server.com", "brukernavn", "passord"); 

Deretter kan du hente ut innboksen til brukeren og åpne denne. Ettersom forbindelsen skjer v.hj.a. POP finnes det kun en postkasse kalt "INBOX".

Folder folder = store.getFolder("INBOX"); 
folder.open(Folder.READ_ONLY); //evt. folder.open(Folder.READ_WRITE); 

Når postkassen er åpen kan du hente ut meldingene som ligger lagret der

Message[] messages = folder.getMessages(); 

folder.getMessage() returnerer en matrise med meldinger noe som kan virke veldig treigt dersom man kan mange epostere i postkassen. JavaMail er bygget opp slik at den kun henter ut informasjon om meldingene når det trengs. Dermed må postkassen forbli åpen til du er ferdig med å behandle samtlige meldinger, en smart design løsning ettersom du som regel kun ønsker å hente ut full informasjon om et fåtall meldinger i postkassen.

Når du er ferdig med å lese fra meldingene må forbindelsen til postkassen og lageret lukkes.

folder.close(); 
store.close(); 

Referanser

Adaptavist Theme Builder (3.3.5-conf210) Powered by Atlassian Confluence 3.0.2, the Enterprise Wiki.