編輯:關於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>
1 簡介Android大型項目中為了減小apk的體積,可以采用插件化的方法,即一些不常用的功能獨立成插件,當用戶需要的使用的時候再從服務器上下載回來,動態加載。這樣就避免
本案例知識是:後台執行定時任務。Alarm機制:一、創建LongRunningService類 package com.example.servicebestp
在Android的開發中,我們經常遇見倒計時的操作,通常使用Timer和Handler共同操作來完成。當然也可以使用Android系統控件CountDownTimer,這
做一個記錄~