Java 發(fā)送郵件
Java 程序發(fā)送 E-mail 是一份十分簡單的事情
唯一有點難度的就是要在機器上安裝 JavaMail API 和Java Activation Framework (JAF)
可以從 Java 網(wǎng)站下載最新版本的 JavaMail ,打開網(wǎng)頁右側(cè)有個 Downloads 鏈接,點擊它下載
可以從 Java 網(wǎng)站下載最新版本的 JAF ( 版本 1.1.1)
下載并解壓縮這些文件吻谋,然后把 mail.jar 和 activation.jar 文件添加到 CLASSPATH 中
發(fā)送一封簡單的電子郵件
下面的范例使用 javax.mail 包中的相關(guān)類來發(fā)送一封純文本格式的電子郵件
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail
{
public static void main(String [] args)
{
// 收件人電子郵箱
String to = "abcd@gmail.com";
// 發(fā)件人電子郵箱
String from = "web@gmail.com";
// 指定發(fā)送郵件的主機為 localhost
String host = "localhost";
// 獲取系統(tǒng)屬性
Properties properties = System.getProperties();
// 設(shè)置郵件服務器
properties.setProperty("mail.smtp.host", host);
// 獲取默認session對象
Session session = Session.getDefaultInstance(properties);
try{
// 創(chuàng)建默認的 MimeMessage 對象
MimeMessage message = new MimeMessage(session);
// Set From: 頭部頭字段
message.setFrom(new InternetAddress(from));
// Set To: 頭部頭字段
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: 頭部頭字段
message.setSubject("This is the Subject Line!");
// 設(shè)置消息體
message.setText("This is actual message");
// 發(fā)送消息
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
編譯運行上面的 Java 代碼较曼,它會發(fā)送一封簡單的 E-mail
$ java SendEmail
Sent message successfully....
如果想發(fā)送一封 Email 給多個收件人倾鲫,那么使用下面的方法來指定多個收件人 ID
void addRecipients(Message.RecipientType type,Address[] addresses) throws MessagingException
參數(shù)說明
參數(shù) | 說明 |
---|---|
type | 設(shè)置為 TO, CC 或者 BCC贝搁,這里 CC 代表抄送必逆、BCC 代表秘密抄送 舉例: Message.RecipientType.TO |
addresses | 這是 email ID 的數(shù)組 指定電子郵件 ID 時怠堪,需要使用 InternetAddress() 方法 |
發(fā)送 HTML 格式的電子郵件
發(fā)送 HTML 格式的電子郵件需要設(shè)置 setContent() 方法的第二個參數(shù)為 "text/html" 來設(shè)置內(nèi)容來指定要發(fā)送 HTML 內(nèi)容
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendHTMLEmail
{
public static void main(String [] args)
{
// 收件人電子郵箱
String to = "abcd@gmail.com";
// 發(fā)件人電子郵箱
String from = "web@gmail.com";
// 指定發(fā)送郵件的主機為 localhost
String host = "localhost";
// 獲取系統(tǒng)屬性
Properties properties = System.getProperties();
// 設(shè)置郵件服務器
properties.setProperty("mail.smtp.host", host);
// 獲取默認的 Session 對象。
Session session = Session.getDefaultInstance(properties);
try{
// 創(chuàng)建默認的 MimeMessage 對象名眉。
MimeMessage message = new MimeMessage(session);
// Set From: 頭部頭字段
message.setFrom(new InternetAddress(from));
// Set To: 頭部頭字段
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: 頭字段
message.setSubject("This is the Subject Line!");
// 發(fā)送 HTML 消息, 可以插入html標簽
message.setContent("<h1>This is actual message</h1>",
"text/html" );
// 發(fā)送消息
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
編譯運行以上 Java 代碼粟矿,輸出結(jié)果如下,并會發(fā)送一封 HTML 格式的電子郵件
$ java SendHTMLEmail
Sent message successfully....
發(fā)送帶有附件的郵件
發(fā)送帶有附件的電子郵件需要使用到 Multipart 類來創(chuàng)建附件
具體說明看代碼注釋
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendFileEmail
{
public static void main(String [] args)
{
// 收件人電子郵箱
String to = "abcd@gmail.com";
// 發(fā)件人電子郵箱
String from = "web@gmail.com";
// 指定發(fā)送郵件的主機為 localhost
String host = "localhost";
// 獲取系統(tǒng)屬性
Properties properties = System.getProperties();
// 設(shè)置郵件服務器
properties.setProperty("mail.smtp.host", host);
// 獲取默認的 Session 對象损拢。
Session session = Session.getDefaultInstance(properties);
try{
// 創(chuàng)建默認的 MimeMessage 對象陌粹。
MimeMessage message = new MimeMessage(session);
// Set From: 頭部頭字段
message.setFrom(new InternetAddress(from));
// Set To: 頭部頭字段
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: 頭字段
message.setSubject("This is the Subject Line!");
// 創(chuàng)建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText("This is message body");
// 創(chuàng)建多重消息
Multipart multipart = new MimeMultipart();
// 設(shè)置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 發(fā)送完整消息
message.setContent(multipart );
// 發(fā)送消息
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
編譯運行以上代碼,如果一切設(shè)置正確福压,那么將會發(fā)送一封帶有附件的郵件
$ java SendFileEmail
Sent message successfully....
用戶認證部分
郵件服務器可能需要提供用戶名和密碼來達到用戶認證的目的
這時掏秩,我們可以通過如下設(shè)置來完成
props.put("mail.smtp.auth", "true");
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
范例
我們以國內(nèi)數(shù)量龐大的 QQ 郵箱為例,
首先我們需要在登錄 QQ 郵箱后臺在 "設(shè)置" => 賬號中開啟POP3/SMTP 服務
QQ 郵箱通過生成授權(quán)碼來設(shè)置密碼:
然后我們就可以使用下面的代碼來發(fā)送郵件了
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendEmail2
{
public static void main(String [] args)
{
// 收件人電子郵箱
String to = "xxx@qq.com";
// 發(fā)件人電子郵箱
String from = "xxx@qq.com";
// 指定發(fā)送郵件的主機為 smtp.qq.com
String host = "smtp.qq.com"; //QQ 郵件服務器
// 獲取系統(tǒng)屬性
Properties properties = System.getProperties();
// 設(shè)置郵件服務器
properties.setProperty("mail.smtp.host", host);
properties.put("mail.smtp.auth", "true");
// 獲取默認session對象
Session session = Session.getDefaultInstance(properties,new Authenticator(){
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("xxx@qq.com", "qq郵箱密碼"); //發(fā)件人郵件用戶名荆姆、密碼
}
});
try{
// 創(chuàng)建默認的 MimeMessage 對象
MimeMessage message = new MimeMessage(session);
// Set From: 頭部頭字段
message.setFrom(new InternetAddress(from));
// Set To: 頭部頭字段
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: 頭部頭字段
message.setSubject("This is the Subject Line!");
// 設(shè)置消息體
message.setText("This is actual message");
// 發(fā)送消息
Transport.send(message);
System.out.println("Sent message successfully....from twle.cn");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}