今天學習了一下JavaMail,javamail傳送郵件確實是一個比較麻煩的問題。為了以後使用方便,自己寫了段程式碼,打成jar包,以方便以後使用。呵呵
以下三段程式碼是我的全部程式碼,朋友們如果想用,直接複製即可。jar包因為我不知道怎麼傳到javaeye上,所以朋友們回去自己打吧。
我的程式碼有三個類:
第一個類:MailSenderInfo.java
- package com.util.mail;
- /**
- * 傳送郵件需要使用的基本資訊
- */
- import java.util.Properties;
- 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;
- }
- }
第二個類:SimpleMailSender.java
- package com.util.mail;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Address;
- import javax.mail.BodyPart;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.Multipart;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeBodyPart;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeMultipart;
- /**
- * 簡單郵件(不帶附件的郵件)傳送器
- */
- public class SimpleMailSender {
- /**
- * 以文字格式傳送郵件
- * @param mailInfo 待傳送的郵件的資訊
- */
- 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;
- }
- /**
- * 以HTML格式傳送郵件
- * @param mailInfo 待傳送的郵件資訊
- */
- 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;
- }
- }
第三個類:MyAuthenticator.java
- package com.util.mail;
- import javax.mail.*;
- 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);
- }
- }
下面給出使用上面三個類的程式碼:
- public static void main(String[] args){
- //這個類主要是設定郵件
- MailSenderInfo mailInfo = new MailSenderInfo();
- mailInfo.setMailServerHost("smtp.163.com");
- mailInfo.setMailServerPort("25");
- mailInfo.setValidate(true);
- mailInfo.setUserName("han2000lei@163.com");
- mailInfo.setPassword("**********");//您的郵箱密碼
- mailInfo.setFromAddress("han2000lei@163.com");
- mailInfo.setToAddress("han2000lei@163.com");
- mailInfo.setSubject("設定郵箱標題");
- mailInfo.setContent("設定郵箱內容");
- //這個類主要來傳送郵件
- SimpleMailSender sms = new SimpleMailSender();
- sms.sendTextMail(mailInfo);//傳送文體格式
- sms.sendHtmlMail(mailInfo);//傳送html格式
- }
最後,給出朋友們幾個注意的地方:
1、使用此程式碼你可以完成你的javamail的郵件傳送功能。三個類缺一不可。
2、這三個類我打包是用的com.util.mail包,如果不喜歡,你可以自己改,但三個類檔案必須在同一個包中
3、不要使用你剛剛註冊過的郵箱在程式中發郵件,如果你的163郵箱是剛註冊不久,那你就不要使用“smtp.163.com”。因為你發不出去。剛註冊的郵箱是不會給你這種許可權的,也就是你不能通過驗證。要使用你經常用的郵箱,而且時間比較長的。
4、另一個問題就是mailInfo.setMailServerHost("smtp.163.com");與mailInfo.setFromAddress("han2000lei@163.com");這兩句話。即如果你使用163smtp伺服器,那麼傳送郵件地址就必須用163的郵箱,如果不的話,是不會傳送成功的。
5、關於javamail驗證錯誤的問題,網上的解釋有很多,但我看見的只有一個。就是我的第三個類。你只要複製全了程式碼,我想是不會有問題的。
http://www.iteye.com/topic/352753
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.qq.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName("**@qq.com");
mailInfo.setPassword("**");//您的郵箱密碼
mailInfo.setFromAddress("**@qq.com");
mailInfo.setToAddress("**@qq.com");
mailInfo.setSubject("設定郵箱標題");
mailInfo.setContent("設定郵箱內容");
//這個類主要來傳送郵件
SimpleMailSender sms = new SimpleMailSender();
sms.sendTextMail(mailInfo);//傳送文體格式
sms.sendHtmlMail(mailInfo);//傳送html格式
報這個錯誤
javax.mail.SendFailedException: Sending failed;
nested exception is:
class javax.mail.AuthenticationFailedException
at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at com.mail.SimpleMailSender.sendTextMail(SimpleMailSender.java:48)
at com.mail.Mail.main(Mail.java:18)
javax.mail.SendFailedException: Sending failed;
這個異常同樣是驗證失敗的一個異常,建議你仔細檢查。另外,我沒有用過qq作為smtp來傳送郵件,不知道效果怎麼樣。你可以再換一下163、126、gmail這樣的郵箱來試一下(如果你有的話)
mailInfo.setValidate(false); 必須設為true,因為現在不是你自己的郵件伺服器,163的伺服器是需要驗證的
而且你必須使用
mailInfo.setUserName("**@163.com");
mailInfo.setPassword("**********");
來進行驗證。就是你的郵箱名和密碼。如果沒有163的郵箱,就改用別的吧