今天學習了一下JavaMail,javamail發送郵件确實是一個比較麻煩的問題。為了以後使用友善,自己寫了段代碼,打成jar包,以友善以後使用。呵呵
以下三段代碼是我的全部代碼,朋友們如果想用,直接複制即可。jar包因為我不知道怎麼傳到javaeye上,是以朋友們回去自己打吧。
我的代碼有三個類:
第一個類:MailSenderInfo.java
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
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 {
- 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); //不要用getDefaultInstance,這樣隻能使用一種郵箱,再想改成别的郵箱就不行了
- Session sendMailSession = Session.getInstance(pro,authenticator); //用這個,程式裡可以切換其他郵箱,前提是這些郵箱要開通smtp協定,這是MailSenderInfo裡寫死的。
- 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); //不要用getDefaultInstance,這樣隻能使用一種郵箱,再想改成别的郵箱就不行了
Session sendMailSession = Session.getInstance(pro,authenticator); //用這個,程式裡可以切換其他郵箱,前提是這些郵箱要開通smtp協定,這是MailSenderInfo裡寫死的。
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);
-
//添加附件
// 建立一新的MimeBodyPart
MimeBodyPart mdp = new MimeBodyPart();
//得到檔案資料源
FileDataSource fds = new FileDataSource("/mnt/sdcard/WhenC/20120417.sms");
//得到附件本身并至入BodyPart
mdp.setDataHandler(new DataHandler(fds));
//得到檔案名同樣至入BodyPart
mdp.setFileName(fds.getName());
mainPart.addBodyPart(mdp);
- // 将MiniMultipart對象設定為郵件内容
- mailMessage.setContent(mainPart);
- // 發送郵件
- Transport.send(mailMessage);
- return true;
- } catch (MessagingException ex) {
- ex.printStackTrace();
- }
- return false;
- }
- }
第三個類:MyAuthenticator.java
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);
- }
- }
下面給出使用上面三個類的代碼:
Java代碼
- 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("設定郵箱标題");
- 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("[email protected]");這兩句話。即如果你使用163smtp伺服器,那麼發送郵件位址就必須用163的郵箱,如果不的話,是不會發送成功的。
5、關于javamail驗證錯誤的問題,網上的解釋有很多,但我看見的隻有一個。就是我的第三個類。你隻要複制全了代碼,我想是不會有問題的。
6、網絡權限<uses-permission android:name="android.permission.INTERNET"/>