V1.0 - 16/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering
V1.2 - 12/11/2004 - fix trunkeret linie og tilføj note til sidst om j2ee.jar
V1.3 - 16/02/2010 - smårettelser
Indledning
Det hænder at man har brug for at ens applikation kan
sende emails ud.
Og selvfølgelig kan det også gøres i Java.
Man kan sende email fra java på 2 måder:
* bruge JavaMail
* bruge en almindelig Socket connection til port 25
Jeg vil kun beskrive den første. Normalt vil man anbefale JavaMail,
fordi der er indbygget en masse funktionalitet.
I det efterfølgende vil jeg antage at:
- ens SMTP server er 192.168.1.10
- ens egen email adresse er mig@etsted.dk
- modtagers email adresse er enanden@etandetsted.dk
SMTP server er den samme som man angiver i browser/email
program (og for de fleste privat brugere er det en man får
udleveret i forbindelse med sit internet abonnement).
For at bruge JavaMail skal man hente:
JavaMail - http://java.sun.com/ (...)
JAF (Java Activation Framework) - http://java.sun.com/ (...)
Du downloader zip filerne, udpakker dem og putter jar filerne i
din classpath.
Hvis du har J2EE/Java EE SDK installeret kan du også bare putte j2ee.jar/javaee.jar i classpath,
fordi den har det hele.
Eksempler
Lad os starte med et simpelt eksempel som sender en text i ASCII.
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email1 {
private final static String SMTP_SERVER = "192.168.1.10";
private final static String FROM = "mig@etsted.dk";
public static void send(String to, String subj, String body) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_SERVER);
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subj);
message.setText(body);
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("enanden@etandetsted.dk", "Test 1", "Linie 1\nLinie 2\nLinie 3\n");
}
}
Nu modificerer vi det til at sende danske bogstaver i ISO-8859-1
karakter sæt:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email2 {
private final static String SMTP_SERVER = "192.168.1.10";
private final static String FROM = "mig@etsted.dk";
public static void send(String to, String subj, String body) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_SERVER);
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subj, "ISO-8859-1");
message.setText(body, "ISO-8859-1");
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("enanden@etandetsted.dk", "Test 2 med ÆØÅ", "ABC\n123\nÆØÅ\n");
}
}
Nu prøver vi at sende HTML:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email3 {
private final static String SMTP_SERVER = "192.168.1.10";
private final static String FROM = "mig@etsted.dk";
public static void send(String to, String subj, String body) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_SERVER);
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subj, "ISO-8859-1");
message.setContent(body, "text/html; charset=ISO-8859-1");
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("enanden@etandetsted.dk", "Test 3 med ÆØÅ", "<P>Linie 1</P><P>Linie 2</P><P>Linie 3 med ÆØÅ</P>");
}
}
Nu prøver vi så at sende en email med både text og HTML:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email4 {
private final static String SMTP_SERVER = "192.168.1.10";
private final static String FROM = "mig@etsted.dk";
public static void send(String to, String subj, String body1, String body2) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_SERVER);
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subj, "ISO-8859-1");
MimeBodyPart mpart1 = new MimeBodyPart();
mpart1.setText(body1, "ISO-8859-1");
MimeBodyPart mpart2 = new MimeBodyPart();
mpart2.setContent(body2, "text/html; charset=ISO-8859-1");
MimeMultipart mpart = new MimeMultipart();
mpart.addBodyPart(mpart1);
mpart.addBodyPart(mpart2);
message.setContent(mpart);
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("enanden@etandetsted.dk", "Test 4 med ÆØÅ",
"Linie 1\nLinie 2\nLinie 3 med ÆØÅ\n",
"<P>Linie 1</P><P>Linie 2</P><P>Linie 3 med ÆØÅ</P>");
}
}
Og til sidst vil vi sende en email med attachment:
import java.io.*;
import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email5 {
private final static String SMTP_SERVER = "192.168.1.10";
private final static String FROM = "mig@etsted.dk";
public static void send(String to, String subj, String body, String filename) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_SERVER);
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subj, "ISO-8859-1");
MimeBodyPart mpart1 = new MimeBodyPart();
mpart1.setText(body, "ISO-8859-1");
MimeBodyPart mpart2 = new MimeBodyPart();
mpart2.setDataHandler(new DataHandler(new FileDataSource(filename)));
mpart2.setFileName((new File(filename)).getName());
MimeMultipart mpart = new MimeMultipart();
mpart.addBodyPart(mpart1);
mpart.addBodyPart(mpart2);
message.setContent(mpart);
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("enanden@etandetsted.dk", "Test 5",
"Vedhæftet Z.ZIP\n", "C:\\Z.ZIP");
}
}
Det er faktisk ikke svært at sende email fra Java.
Bemærk at det ikke spiller nogen rolle om man sender fra en
J2SE/Java SE eller J2EE/Java EE applikation. Koden er den samme.
Men en vigtig pointe er: hvis det er en J2EE app, så må man
godt compile sin kode mod j2ee.jar/javaee.jar, men man må ikke bruge j2ee.jar/javaee.jar
runtime med andre servere end SUN's reference implementation. Hvis javax.mail
klasserne mangler så skal man deploye mail.jar og activation.jar.


