一、背景
我们在实际开发中,常常会遇到需要使用java代码进行发送邮件的需求,我们可以通过这种方式向用户推送通知等。
二、Java代码
1 package com.hafiz.zhang.mail;
2
3 import java.util.Properties;
4
5 import javax.activation.DataHandler;
6 import javax.activation.FileDataSource;
7 import javax.mail.Address;
8 import javax.mail.BodyPart;
9 import javax.mail.Message;
10 import javax.mail.Multipart;
11 import javax.mail.Session;
12 import javax.mail.Transport;
13 import javax.mail.internet.InternetAddress;
14 import javax.mail.internet.MimeBodyPart;
15 import javax.mail.internet.MimeMessage;
16 import javax.mail.internet.MimeMultipart;
17
18
19 public class Mail {
20
21 private MimeMessage mimeMsg; //MIME邮件对象
22 private Session session; //邮件会话对象
23 private Properties props; //系统属性
24 private boolean needAuth = false; //smtp是否需要认证
25 //smtp认证用户名和密码
26 private String username;
27 private String password;
28 private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
29
30 /**
31 * Constructor
32 * @param smtp 邮件发送服务器
33 */
34 public Mail(String smtp){
35 setSmtpHost(smtp);
36 createMimeMessage();
37 }
38
39 /**
40 * 设置邮件发送服务器
41 * @param hostName String
42 */
43 public void setSmtpHost(String hostName) {
44 System.out.println("设置系统属性:mail.smtp.host = "+hostName);
45 if(props == null)
46 props = System.getProperties(); //获得系统属性对象
47 props.put("mail.smtp.host",hostName); //设置SMTP主机
48 }
49
50
51 /**
52 * 创建MIME邮件对象
53 * @return
54 */
55 public boolean createMimeMessage()
56 {
57 try {
58 System.out.println("准备获取邮件会话对象!");
59 session = Session.getDefaultInstance(props,null); //获得邮件会话对象
60 }
61 catch(Exception e){
62 System.err.println("获取邮件会话对象时发生错误!"+e);
63 return false;
64 }
65
66 System.out.println("准备创建MIME邮件对象!");
67 try {
68 mimeMsg = new MimeMessage(session); //创建MIME邮件对象
69 mp = new MimeMultipart();
70
71 return true;
72 } catch(Exception e){
73 System.err.println("创建MIME邮件对象失败!"+e);
74 return false;
75 }
76 }
77
78 /**
79 * 设置SMTP是否需要验证
80 * @param need
81 */
82 public void setNeedAuth(boolean need) {
83 System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
84 if(props == null) props = System.getProperties();
85 if(need){
86 props.put("mail.smtp.auth","true");
87 }else{
88 props.put("mail.smtp.auth","false");
89 }
90 }
91
92 /**
93 * 设置用户名和密码
94 * @param name
95 * @param pass
96 */
97 public void setNamePass(String name,String pass) {
98 username = name;
99 password = pass;
100 }
101
102 /**
103 * 设置邮件主题
104 * @param mailSubject
105 * @return
106 */
107 public boolean setSubject(String mailSubject) {
108 System.out.println("设置邮件主题!");
109 try{
110 mimeMsg.setSubject(mailSubject);
111 return true;
112 }
113 catch(Exception e) {
114 System.err.println("设置邮件主题发生错误!");
115 return false;
116 }
117 }
118
119 /**
120 * 设置邮件正文
121 * @param mailBody String
122 */
123 public boolean setBody(String mailBody) {
124 try{
125 BodyPart bp = new MimeBodyPart();
126 bp.setContent(""+mailBody,"text/html;charset=GBK");
127 mp.addBodyPart(bp);
128
129 return true;
130 } catch(Exception e){
131 System.err.println("设置邮件正文时发生错误!"+e);
132 return false;
133 }
134 }
135 /**
136 * 添加附件
137 * @param filename String
138 */
139 public boolean addFileAffix(String filename) {
140
141 System.out.println("增加邮件附件:"+filename);
142 try{
143 BodyPart bp = new MimeBodyPart();
144 FileDataSource fileds = new FileDataSource(filename);
145 bp.setDataHandler(new DataHandler(fileds));
146 bp.setFileName(fileds.getName());
147
148 mp.addBodyPart(bp);
149
150 return true;
151 } catch(Exception e){
152 System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
153 return false;
154 }
155 }
156
157 /**
158 * 设置发信人
159 * @param from String
160 */
161 public boolean setFrom(String from) {
162 System.out.println("设置发信人!");
163 try{
164 mimeMsg.setFrom(new InternetAddress(from)); //设置发信人
165 return true;
166 } catch(Exception e) {
167 return false;
168 }
169 }
170 /**
171 * 设置收信人
172 * @param to String
173 */
174 public boolean setTo(String to){
175 if(to == null)return false;
176 try{
177 mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
178 return true;
179 } catch(Exception e) {
180 return false;
181 }
182 }
183
184 /**
185 * 设置抄送人
186 * @param copyto String
187 */
188 public boolean setCopyTo(String copyto)
189 {
190 if(copyto == null)return false;
191 try{
192 mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
193 return true;
194 }
195 catch(Exception e)
196 { return false; }
197 }
198
199 /**
200 * 发送邮件
201 */
202 public boolean sendOut()
203 {
204 try{
205 mimeMsg.setContent(mp);
206 mimeMsg.saveChanges();
207 System.out.println("正在发送邮件....");
208
209 Session mailSession = Session.getInstance(props,null);
210 Transport transport = mailSession.getTransport("smtp");
211 transport.connect((String)props.get("mail.smtp.host"),username,password);
212 transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
213 transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));
214 //transport.send(mimeMsg);
215
216 System.out.println("发送邮件成功!");
217 transport.close();
218
219 return true;
220 } catch(Exception e) {
221 System.err.println("邮件发送失败!"+e);
222 return false;
223 }
224 }
225
226 /**
227 * 调用sendOut方法完成邮件发送
228 * @param smtp
229 * @param from
230 * @param to
231 * @param subject
232 * @param content
233 * @param username
234 * @param password
235 * @return boolean
236 */
237 public static boolean send(String smtp,String from,String to,String subject,String content,String username,String password) {
238 Mail theMail = new Mail(smtp);
239 theMail.setNeedAuth(true); //需要验证
240
241 if(!theMail.setSubject(subject)) return false;
242 if(!theMail.setBody(content)) return false;
243 if(!theMail.setTo(to)) return false;
244 if(!theMail.setFrom(from)) return false;
245 theMail.setNamePass(username,password);
246
247 if(!theMail.sendOut()) return false;
248 return true;
249 }
250
251 /**
252 * 调用sendOut方法完成邮件发送,带抄送
253 * @param smtp
254 * @param from
255 * @param to
256 * @param copyto
257 * @param subject
258 * @param content
259 * @param username
260 * @param password
261 * @return boolean
262 */
263 public static boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password) {
264 Mail theMail = new Mail(smtp);
265 theMail.setNeedAuth(true); //需要验证
266
267 if(!theMail.setSubject(subject)) return false;
268 if(!theMail.setBody(content)) return false;
269 if(!theMail.setTo(to)) return false;
270 if(!theMail.setCopyTo(copyto)) return false;
271 if(!theMail.setFrom(from)) return false;
272 theMail.setNamePass(username,password);
273
274 if(!theMail.sendOut()) return false;
275 return true;
276 }
277
278 /**
279 * 调用sendOut方法完成邮件发送,带附件
280 * @param smtp
281 * @param from
282 * @param to
283 * @param subject
284 * @param content
285 * @param username
286 * @param password
287 * @param filename 附件路径
288 * @return
289 */
290 public static boolean send(String smtp,String from,String to,String subject,String content,String username,String password,String filename) {
291 Mail theMail = new Mail(smtp);
292 theMail.setNeedAuth(true); //需要验证
293
294 if(!theMail.setSubject(subject)) return false;
295 if(!theMail.setBody(content)) return false;
296 if(!theMail.addFileAffix(filename)) return false;
297 if(!theMail.setTo(to)) return false;
298 if(!theMail.setFrom(from)) return false;
299 theMail.setNamePass(username,password);
300
301 if(!theMail.sendOut()) return false;
302 return true;
303 }
304
305 /**
306 * 调用sendOut方法完成邮件发送,带附件和抄送
307 * @param smtp
308 * @param from
309 * @param to
310 * @param copyto
311 * @param subject
312 * @param content
313 * @param username
314 * @param password
315 * @param filename
316 * @return
317 */
318 public static boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password,String filename) {
319 Mail theMail = new Mail(smtp);
320 theMail.setNeedAuth(true); //需要验证
321
322 if(!theMail.setSubject(subject)) return false;
323 if(!theMail.setBody(content)) return false;
324 if(!theMail.addFileAffix(filename)) return false;
325 if(!theMail.setTo(to)) return false;
326 if(!theMail.setCopyTo(copyto)) return false;
327 if(!theMail.setFrom(from)) return false;
328 theMail.setNamePass(username,password);
329
330 if(!theMail.sendOut()) return false;
331 return true;
332 }
333
334 }
测试代码如下:
1 public static void main(String[] args){
2 String smtp = "SMTP服务器";
3 String from = "发信人";
4 String to = "收信人";
5 String copyto = "抄送人";
6 String subject = "邮件主题";
7 String content = "邮件内容";
8 String username="用户名";
9 String password="密码";
10 String filename = "附件路径,如:F:\\笔记<a>\\struts2</a>与mvc.txt";
11 Mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password, filename);
12 }