Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 使用 JavaMail

Android 使用 JavaMail

編輯:關於Android編程

今天學習了一下JavaMail,javamail發送郵件確實是一個比較麻煩的問題不用第三方郵件程序。為了以後使用方便,自己寫了段代碼.

Javamail-Android配置步驟:

下載Android版本JavaMail包,additional.jar、mail.jar和activation.jar,下載地址JavaMail-Android

在項目與src同一目錄級別下,新建文件夾lib,將下載的3個jar包放入該文件夾

右鍵->Properties->Java Build Path->Libraries,選擇Add External JARs,找到項目下lib目錄的3個jar包


我的代碼有三個類: 
第一個類:MailSenderInfo.java

01
package com.util.mail;
02
/**
03
* 發送郵件需要使用的基本信息
04
*/
05
import java.util.Properties;
06
public class MailSenderInfo {
07
    // 發送郵件的服務器的IP和端口
08
    private String mailServerHost;
09
    private String mailServerPort = "25";
10
    // 郵件發送者的地址
11
    private String fromAddress;
12
    // 郵件接收者的地址
13
    private String toAddress;
14
    // 登陸郵件發送服務器的用戶名和密碼
15
    private String userName;
16
    private String password;
17
    // 是否需要身份驗證
18
    private boolean validate = false;
19
    // 郵件主題
20
    private String subject;
21
    // 郵件的文本內容
22
    private String content;
23
    // 郵件附件的文件名
24
    private String[] attachFileNames; 
25
    /**
26
      * 獲得郵件會話屬性
27
      */
28
    public Properties getProperties(){
29
      Properties p = new Properties();
30
      p.put("mail.smtp.host", this.mailServerHost);
31
      p.put("mail.smtp.port", this.mailServerPort);
32
      p.put("mail.smtp.auth", validate ? "true" : "false");
33
      return p;
34
    }
35
    public String getMailServerHost() {
36
      return mailServerHost;
37
    }
38
    public void setMailServerHost(String mailServerHost) {
39
      this.mailServerHost = mailServerHost;
40
    }
41
    public String getMailServerPort() {
42
      return mailServerPort;
43
    }
44
    public void setMailServerPort(String mailServerPort) {
45
      this.mailServerPort = mailServerPort;
46
    }
47
    public boolean isValidate() {
48
      return validate;
49
    }
50
    public void setValidate(boolean validate) {
51
      this.validate = validate;
52
    }
53
    public String[] getAttachFileNames() {
54
      return attachFileNames;
55
    }
56
    public void setAttachFileNames(String[] fileNames) {
57
      this.attachFileNames = fileNames;
58
    }
59
    public String getFromAddress() {
60
      return fromAddress;
61
    }
62
    public void setFromAddress(String fromAddress) {
63
      this.fromAddress = fromAddress;
64
    }
65
    public String getPassword() {
66
      return password;
67
    }
68
    public void setPassword(String password) {
69
      this.password = password;
70
    }
71
    public String getToAddress() {
72
      return toAddress;
73
    }
74
    public void setToAddress(String toAddress) {
75
      this.toAddress = toAddress;
76
    }
77
    public String getUserName() {
78
      return userName;
79
    }
80
    public void setUserName(String userName) {
81
      this.userName = userName;
82
    }
83
    public String getSubject() {
84
      return subject;
85
    }
86
    public void setSubject(String subject) {
87
      this.subject = subject;
88
    }
89
    public String getContent() {
90
      return content;
91
    }
92
    public void setContent(String textContent) {
93
      this.content = textContent;
94
    }
95
}
第二個類:MultiMailsender.java
001
package com.util.mail;
002
 
003
import java.util.Date;
004
import java.util.Properties;
005
 
006
import javax.mail.Address;
007
import javax.mail.BodyPart;
008
import javax.mail.Message;
009
import javax.mail.MessagingException;
010
import javax.mail.Multipart;
011
import javax.mail.Session;
012
import javax.mail.Transport;
013
import javax.mail.internet.InternetAddress;
014
import javax.mail.internet.MimeBodyPart;
015
import javax.mail.internet.MimeMessage;
016
import javax.mail.internet.MimeMultipart;
017
 
018
/**
019
 * 發送郵件給多個接收者、抄送郵件
020
 */
021
public class MultiMailsender {
022
 
023
    
024
    /**
025
      * 以文本格式發送郵件
026
      * @param mailInfo 待發送的郵件的信息
027
      */
028
        public boolean sendTextMail(MultiMailSenderInfo mailInfo) {
029
          // 判斷是否需要身份認證
030
          MyAuthenticator authenticator = null;
031
          Properties pro = mailInfo.getProperties();
032
          if (mailInfo.isValidate()) {
033
          // 如果需要身份認證,則創建一個密碼驗證器
034
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
035
          }
036
          // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session
037
          Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
038
          try {
039
          // 根據session創建一個郵件消息
040
          Message mailMessage = new MimeMessage(sendMailSession);
041
          // 創建郵件發送者地址
042
          Address from = new InternetAddress(mailInfo.getFromAddress());
043
          // 設置郵件消息的發送者
044
          mailMessage.setFrom(from);
045
          // 創建郵件的接收者地址,並設置到郵件消息中
046
          Address[] tos = null;
047
          String[] receivers = mailInfo.getReceivers();
048
          if (receivers != null){
049
              // 為每個郵件接收者創建一個地址
050
              tos = new InternetAddress[receivers.length + 1];
051
              tos[0] = new InternetAddress(mailInfo.getToAddress());
052
              for (int i=0; i<receivers.length; i++){
053
                  tos[i+1] = new InternetAddress(receivers[i]);
054
              }
055
          } else {
056
              tos = new InternetAddress[1];
057
              tos[0] = new InternetAddress(mailInfo.getToAddress());
058
          }
059
 
060
          // Message.RecipientType.TO屬性表示接收者的類型為TO
061
          mailMessage.setRecipients(Message.RecipientType.TO,tos);
062
          // 設置郵件消息的主題
063
          mailMessage.setSubject(mailInfo.getSubject());
064
          // 設置郵件消息發送的時間
065
          mailMessage.setSentDate(new Date());
066
          // 設置郵件消息的主要內容
067
          String mailContent = mailInfo.getContent();
068
          mailMessage.setText(mailContent);
069
          // 發送郵件
070
          Transport.send(mailMessage);
071
          return true;
072
          } catch (MessagingException ex) {
073
              ex.printStackTrace();
074
          }
075
          return false;
076
        }
077
    /**
078
     * 發送郵件給多個接收者,以Html內容
079
     * @param mailInfo    帶發送郵件的信息
080
     * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a>
081
     */
082
    public static boolean sendMailtoMultiReceiver(MultiMailSenderInfo mailInfo){
083
        MyAuthenticator authenticator = null;
084
        if (mailInfo.isValidate()) {
085
            authenticator = new MyAuthenticator(mailInfo.getUserName(),
086
                    mailInfo.getPassword());
087
        }
088
        Session sendMailSession = Session.getInstance(mailInfo
089
                .getProperties(), authenticator);
090
        try {
091
            Message mailMessage = new MimeMessage(sendMailSession);
092
            // 創建郵件發送者地址
093
            Address from = new InternetAddress(mailInfo.getFromAddress());
094
            mailMessage.setFrom(from);
095
            // 創建郵件的接收者地址,並設置到郵件消息中
096
            Address[] tos = null;
097
            String[] receivers = mailInfo.getReceivers();
098
            if (receivers != null){
099
                // 為每個郵件接收者創建一個地址
100
                tos = new InternetAddress[receivers.length + 1];
101
                tos[0] = new InternetAddress(mailInfo.getToAddress());
102
                for (int i=0; i<receivers.length; i++){
103
                    tos[i+1] = new InternetAddress(receivers[i]);
104
                }
105
            } else {
106
                tos = new InternetAddress[1];
107
                tos[0] = new InternetAddress(mailInfo.getToAddress());
108
            }
109
            // 將所有接收者地址都添加到郵件接收者屬性中
110
            mailMessage.setRecipients(Message.RecipientType.TO, tos);
111
            
112
            mailMessage.setSubject(mailInfo.getSubject());
113
            mailMessage.setSentDate(new Date());
114
            // 設置郵件內容
115
            Multipart mainPart = new MimeMultipart();
116
            BodyPart html = new MimeBodyPart();
117
            html.setContent(mailInfo.getContent(), "text/html; charset=GBK");
118
            mainPart.addBodyPart(html);
119
            mailMessage.setContent(mainPart);
120
            // 發送郵件
121
            Transport.send(mailMessage);
122
            return true;
123
        } catch (MessagingException ex) {
124
            ex.printStackTrace();
125
        }
126
        return false;
127
    }
128
    
129
    /**
130
     * 發送帶抄送的郵件
131
     * @param mailInfo    待發送郵件的消息
132
     * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a>
133
     */
134
    public static boolean sendMailtoMultiCC(MultiMailSenderInfo mailInfo){
135
        MyAuthenticator authenticator = null;
136
        if (mailInfo.isValidate()) {
137
            authenticator = new MyAuthenticator(mailInfo.getUserName(),
138
                    mailInfo.getPassword());
139
        }
140
        Session sendMailSession = Session.getInstance(mailInfo
141
                .getProperties(), authenticator);
142
        try {
143
            Message mailMessage = new MimeMessage(sendMailSession);
144
            // 創建郵件發送者地址
145
            Address from = new InternetAddress(mailInfo.getFromAddress());
146
            mailMessage.setFrom(from);
147
            // 創建郵件的接收者地址,並設置到郵件消息中
148
            Address to = new InternetAddress(mailInfo.getToAddress());
149
            mailMessage.setRecipient(Message.RecipientType.TO, to);
150
            
151
            // 獲取抄送者信息
152
            String[] ccs = mailInfo.getCcs();
153
            if (ccs != null){
154
                // 為每個郵件接收者創建一個地址
155
                Address[] ccAdresses = new InternetAddress[ccs.length];
156
                for (int i=0; i<ccs.length; i++){
157
                    ccAdresses[i] = new InternetAddress(ccs[i]);
158
                }
159
                // 將抄送者信息設置到郵件信息中,注意類型為Message.RecipientType.CC
160
                mailMessage.setRecipients(Message.RecipientType.CC, ccAdresses);
161
            }
162
            
163
            mailMessage.setSubject(mailInfo.getSubject());
164
            mailMessage.setSentDate(new Date());
165
            // 設置郵件內容
166
            Multipart mainPart = new MimeMultipart();
167
            BodyPart html = new MimeBodyPart();
168
            html.setContent(mailInfo.getContent(), "text/html; charset=GBK");
169
            mainPart.addBodyPart(html);
170
            mailMessage.setContent(mainPart);
171
            // 發送郵件
172
            Transport.send(mailMessage);
173
            return true;
174
        } catch (MessagingException ex) {
175
            ex.printStackTrace();
176
        }
177
        return false;
178
    }
179
    
180
    /**
181
     * 發送多接收者類型郵件的基本信息
182
     */
183
    public static class MultiMailSenderInfo extends MailSenderInfo{
184
        // 郵件的接收者,可以有多個
185
        private String[] receivers;
186
        // 郵件的抄送者,可以有多個
187
        private String[] ccs;
188
        
189
        public String[] getCcs() {
190
            return ccs;
191
        }
192
        public void setCcs(String[] ccs) {
193
            this.ccs = ccs;
194
        }
195
        public String[] getReceivers() {
196
            return receivers;
197
        }
198
        public void setReceivers(String[] receivers) {
199
            this.receivers = receivers;
200
        }
201
    }
202
}
第三個類:MyAuthenticator.java
01
package com.util.mail;
02
 
03
import javax.mail.*;
04
   
05
public class MyAuthenticator extends Authenticator{
06
    String userName=null;
07
    String password=null;
08
      
09
    public MyAuthenticator(){
10
    }
11
    public MyAuthenticator(String username, String password) {
12
        this.userName = username;
13
        this.password = password;
14
    }
15
    protected PasswordAuthentication getPasswordAuthentication(){
16
        return new PasswordAuthentication(userName, password);
17
    }
18
}
下面給出使用上面三個類的代碼:
01
public static void main(String[] args){
02
         //這個類主要是設置郵件
03
      MultiMailSenderInfo mailInfo = new MultiMailSenderInfo();
04
      mailInfo.setMailServerHost("smtp.163.com");
05
      mailInfo.setMailServerPort("25");
06
      mailInfo.setValidate(true);
07
      mailInfo.setUserName("[email protected]");
08
      mailInfo.setPassword("**********");//您的郵箱密碼
09
      mailInfo.setFromAddress("[email protected]");
10
      mailInfo.setToAddress("[email protected]");
11
      mailInfo.setSubject("設置郵箱標題");
12
      mailInfo.setContent("設置郵箱內容");
13
      String[] receivers = new String[]{"***@163.com", "***@tom.com"};
14
      String[] ccs = receivers; mailInfo.setReceivers(receivers);
15
      mailInfo.setCcs(ccs);
16
      //這個類主要來發送郵件
17
      MultiMailsender sms = new MultiMailsender();
18
      sms.sendTextMail(mailInfo);//發送文體格式
19
      MultiMailsender.sendHtmlMail(mailInfo);//發送html格式
20
      MultiMailsender.sendMailtoMultiCC(mailInfo);//發送抄送
最後,給出朋友們幾個注意的地方: 
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、 然後在Android項目中添加網絡訪問權限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>


作者:am10
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved