使用JavaMail发送邮件

一、背景

  我们在实际开发中,常常会遇到需要使用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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

PostgreSQL的.NET驱动程序Npgsql中参数对象的一个Bug

最近将公司的项目从SqlServer移植到PostgreSQL数据库上来,在调用数据库的存储过程(自定义函数)的时候,发现一个奇怪的问题,老是报函数无法找到。 ...

2967
来自专栏我叫刘半仙

原荐Spring AOP是什么?你都拿它做什么?

         对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利。无论你是对...

3174
来自专栏用户2442861的专栏

使用Spring JDBCTemplate简化JDBC的操作

http://www.cnblogs.com/lichenwei/p/3902294.html

1431
来自专栏五毛程序员

五毛的cocos2d-x学习笔记07-计时器、数据读写、文件读写

2525
来自专栏hrscy

Alamofire 上传图片入门教程(下)

在 ViewController 的 extension 里面,uploadImage(_:progress:completion:) 的下面添加如下的代码:

2692
来自专栏数据结构与算法

1031 质数环

1031 质数环  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解 题目描述 Description 一个大小为N(...

2826
来自专栏大内老A

.NET的资源并不限于.resx文件,你可以采用任意存储形式[下篇]

在《上篇》中我们谈到ResourceManager在默认的情况下只能提供对内嵌于程序集的.resources资源文件的存取。为了实现对独立二进制.resourc...

1976
来自专栏Java学习网

Java Web Response对象的27个方法及状态码

response表示HttpServletResponse对象,主要将JSP容器处理后的结果传回到客户端。 ? 网络配图 1、void addCookie(...

4297
来自专栏xingoo, 一个梦想做发明家的程序员

【Spring开发】—— AOP之方法级拦截

前言: 前面介绍了Spring的核心模块以及相关的依赖注入等概念。这篇讲解一下spring的另一个重点,AOP面向切面编程。   说道AOP不得不提到几...

2108
来自专栏ACM小冰成长之路

HDU-5933-ArcSoft's Office Rearrangement

ACM模版 描述 ? 题解 给定 NN 个数要求划分为 KK 份,一共有两种操作,一种是将相邻两数合并,一种是将一个数拆开两部分。 很明显的贪心模拟,这场比赛好...

2226

扫码关注云+社区

领取腾讯云代金券