天天看點

JAVAmail的簡單應用

本文轉載自:[url]http://www.blogjava.net/wangfun/archive/2009/04/15/265748.html[/url]

[b]首先,需要用到的jar包有兩個分别是activation.jar和 mail.jar[/b]

我照着做了,基本可以實作發郵件功能,我做的是當點選按鈕的時候觸發發郵件的功能,基本需要三個寫三個工具類。

代碼按類分為以下三部分:

一、發郵件需要的基本資訊類

public class MailSenderInfo {

// 發送郵件的伺服器的IP和端口

private String mailServerHost;

private String mailServerPort = "25";

// 郵件發送者的位址

private String fromAddress;

// 郵件接收者的位址

private String toAddress;

// 登陸郵件發送伺服器的使用者名和密碼

private String userName;

private String password;

// 是否需要身份驗證

private boolean validate = false;

// 郵件主題

private String subject;

// 郵件的文本内容

private String content;

// 郵件附件的檔案名

private String[] attachFileNames;

public Properties getProperties(){

Properties p = new Properties();

p.put("mail.smtp.host", this.mailServerHost);

p.put("mail.smtp.port", this.mailServerPort);

p.put("mail.smtp.auth", validate ? "true" : "false");

return p;

}

public String getMailServerHost() {

return mailServerHost;

}

public void setMailServerHost(String mailServerHost) {

this.mailServerHost = mailServerHost;

}

public String getMailServerPort() {

return mailServerPort;

}

public void setMailServerPort(String mailServerPort) {

this.mailServerPort = mailServerPort;

}

public boolean isValidate() {

return validate;

}

public void setValidate(boolean validate) {

this.validate = validate;

}

public String[] getAttachFileNames() {

return attachFileNames;

}

public void setAttachFileNames(String[] fileNames) {

this.attachFileNames = fileNames;

}

public String getFromAddress() {

return fromAddress;

}

public void setFromAddress(String fromAddress) {

this.fromAddress = fromAddress;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getToAddress() {

return toAddress;

}

public void setToAddress(String toAddress) {

this.toAddress = toAddress;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getSubject() {

return subject;

}

public void setSubject(String subject) {

this.subject = subject;

}

public String getContent() {

return content;

}

public void setContent(String textContent) {

this.content = textContent;

}

}

第二個類:簡單郵件(不帶附件的郵件)發送器

public class SimpleMailSender {

public boolean sendTextMail(MailSenderInfo mailInfo) {

// 判斷是否需要身份認證

MyAuthenticator authenticator = null;

Properties pro = mailInfo.getProperties();

if (mailInfo.isValidate()) {

// 如果需要身份認證,則建立一個密碼驗證器

authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());

}

// 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session

Session sendMailSession = Session.getDefaultInstance(pro,authenticator);

try {

// 根據session建立一個郵件消息

Message mailMessage = new MimeMessage(sendMailSession);

// 建立郵件發送者位址

Address from = new InternetAddress(mailInfo.getFromAddress());

// 設定郵件消息的發送者

mailMessage.setFrom(from);

// 建立郵件的接收者位址,并設定到郵件消息中

Address to = new InternetAddress(mailInfo.getToAddress());

mailMessage.setRecipient(Message.RecipientType.TO,to);

// 設定郵件消息的主題

mailMessage.setSubject(mailInfo.getSubject());

// 設定郵件消息發送的時間

mailMessage.setSentDate(new Date());

// 設定郵件消息的主要内容

String mailContent = mailInfo.getContent();

mailMessage.setText(mailContent);

// 發送郵件

Transport.send(mailMessage);

return true;

} catch (MessagingException ex) {

ex.printStackTrace();

}

return false;

}

public static boolean sendHtmlMail(MailSenderInfo mailInfo){

// 判斷是否需要身份認證

MyAuthenticator authenticator = null;

Properties pro = mailInfo.getProperties();

//如果需要身份認證,則建立一個密碼驗證器

if (mailInfo.isValidate()) {

authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());

}

// 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session

Session sendMailSession = Session.getDefaultInstance(pro,authenticator);

try {

// 根據session建立一個郵件消息

Message mailMessage = new MimeMessage(sendMailSession);

// 建立郵件發送者位址

Address from = new InternetAddress(mailInfo.getFromAddress());

// 設定郵件消息的發送者

mailMessage.setFrom(from);

// 建立郵件的接收者位址,并設定到郵件消息中

Address to = new InternetAddress(mailInfo.getToAddress());

// Message.RecipientType.TO屬性表示接收者的類型為TO

mailMessage.setRecipient(Message.RecipientType.TO,to);

// 設定郵件消息的主題

mailMessage.setSubject(mailInfo.getSubject());

// 設定郵件消息發送的時間

mailMessage.setSentDate(new Date());

// MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象

Multipart mainPart = new MimeMultipart();

// 建立一個包含HTML内容的MimeBodyPart

BodyPart html = new MimeBodyPart();

// 設定HTML内容

html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");

mainPart.addBodyPart(html);

// 将MiniMultipart對象設定為郵件内容

mailMessage.setContent(mainPart);

// 發送郵件

Transport.send(mailMessage);

return true;

} catch (MessagingException ex) {

ex.printStackTrace();

}

return false;

}

}

[color=darkred]那麼,在上面的類中,我們會發現他有兩個發郵件的方法,一個是單純發出文本郵件的方法,第二種是以HTML的格式發送郵件的方法,在我的項目中郵件隻是一個簡單地通知功能,故此,我隻用了sendTextMail(),當然這個以個人的需要選擇方法,不拘一格,适用就好[/color]

第三個類:MyAuthenticator

public class MyAuthenticator extends Authenticator{

String userName=null;

String password=null;

public MyAuthenticator(){

}

public MyAuthenticator(String username, String password) {

this.userName = username;

this.password = password;

}

protected PasswordAuthentication getPasswordAuthentication(){

return new PasswordAuthentication(userName, password);

}

}

[color=orange]如果我們要做個測試的話,下面就是main的代碼:[/color]

public static void main(String[] args){

//這個類主要是設定郵件

MailSenderInfo mailInfo = new MailSenderInfo();

mailInfo.setMailServerHost("smtp.163.com");

mailInfo.setMailServerPort("25");

mailInfo.setValidate(true);

mailInfo.setUserName("[email protected]");

mailInfo.setPassword("**********");//您的郵箱密碼

mailInfo.setFromAddress("[email protected]");

mailInfo.setToAddress("[email protected]");

mailInfo.setSubject("設定郵箱标題 如http://www.guihua.org 中國桂花網");

mailInfo.setContent("設定郵箱内容 如http://www.guihua.org 中國桂花網 是中國最大桂花網站==");

//這個類主要來發送郵件

SimpleMailSender sms = new SimpleMailSender();

sms.sendTextMail(mailInfo);//發送文體格式

sms.sendHtmlMail(mailInfo);//發送html格式

}

我先把他的文章中提醒讀者需要注意的地方說一下:

1、使用此代碼你可以完成你的javamail的郵件發送功能。三個類缺一不可。

2.不要使用你剛剛注冊過的郵箱在程式中發郵件,如果你的163郵箱是剛注冊不久,那你就不要使用“smtp.163.com”。因為你發不出去。剛注冊的郵箱是不會給你這種權限的,也就是你不能通過驗證。要使用你經常用的郵箱,而且時間比較長的。

3.另一個問題就是mailInfo.setMailServerHost("smtp.163.com");與mailInfo.setFromAddress("[email protected]");這兩句話。即如果你使用163smtp伺服器,那麼發送郵件位址就必須用163的郵箱,如果不的話,是不會發送成功的。

4、關于javamail驗證錯誤的問題,網上的解釋有很多,但我看見的隻有一個。就是我的第三個類。你隻要複制全了代碼,我想是不會有問題的。

[color=red]我很感謝他給我們提供這個友善,上面的都是沒任何問題的,接下來我補充一下,而這些補充也是至關重要的,做過安卓的朋友應該知道,像我們做一個火車票查詢的話,我們需要用第三方的服務,不過這個相比而言真的就簡單多了,我們要用譬如騰訊的郵箱的話,隻需簡單地點選幾下滑鼠即可,

第一步:點選【郵箱】圖示,進入郵箱後

第二步:點選【設定】超連結,進入後可以看到二級菜單點選【賬戶】,一直往下拉,會看到有個開啟服務那麼一項,為了保險起見,我們把前兩個複選框打上勾,而後,滑鼠往下拉儲存更改就好了,服務就此開啟。[/color]

[color=blue]再唠叨幾句吧,讀者也請耐心點哈,在測試類中你會看到有一個 mailInfo.[b]setValidate(true)[/b];這個是讓我們選擇是否設定POP3/SMTP的SSL加密,如果我們選擇true也即設定POP3/SMTP的SSL加密的話需要注意一下資訊的相應填寫,

[table]

|使用SSL的通用配置如下:|

|接收郵件伺服器:|pop.qq(這裡如果我們使用163郵箱的話就把qq改為163即可).com,使用SSL,端口号995|

|發送郵件伺服器:|smtp.qq(這裡如果我們使用163郵箱的話就把qq改為163即可).com,使用SSL,端口号465或587(建議使用587)|

|賬戶名:|您的QQ郵箱賬戶名(如果您是VIP帳号或Foxmail帳号,賬戶名需要填寫完整的郵件位址)|

|密碼:|您的QQ郵箱密碼|

|電子郵件位址:|您的QQ郵箱的完整郵件位址|

[/table]如果我們不想設定SSL加密的話,預設端口都是25,其他照舊

關于SSL推薦一個網址;http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=369

便于深入了解SSL[/color]

哎呀,長舒一口氣,做到這裡不出錯的話就可以發郵件了,他說可能挺慢,我覺得挺快的,我點選了按鈕成功發送的話最多兩秒鐘也就能收到郵件了,謝謝