因为公司内部办公系统(OA)需要增加一个发送邮件的功能,所以学习了这个感觉比较冷门的JavaMail

 

1、先上成功截图 :

2、准备事项:Java Mail虽然是官方写的,但是没有集成到jdk里面,所以需要自己下jar包

首先去官网下载,或者去CSDN 下(http://download.csdn.net/download/itsonglin/8632453)

ps:老版本的api似乎不支持开启加密,建议去官网下最新jar包

3、这里贴一个封装好了的工具类代码,可以直接copy不用看,使用这个就能很方便的使用 javamail 而不用了解什么是javamail

ps:以前在学校学东西都是一步步的稳打稳扎,现在工作就是会用就行,赶快把功能做出来 ,   唉,希望能有时间补起来

  1. import com.sun.mail.util.MailSSLSocketFactory;
  2.  
  3. import java.io.*;
  4. import java.security.GeneralSecurityException;
  5. import java.util.*;
  6.  
  7. import javax.activation.*;
  8. import javax.mail.*;
  9. import javax.mail.internet.*;
  10.  
  11. public class SendMail {
  12.  
  13. private String username = null;
  14. private String password = null;
  15. private Authenticator auth = null;
  16. private MimeMessage mimeMessage =null;
  17. private Properties pros = null;
  18. private Multipart multipart = null;
  19. private BodyPart bodypart= null;
  20. /**
  21. * 初始化账号密码并验证
  22. * 创建MimeMessage对象
  23. * 发送邮件必须的步骤:1
  24. * @param username
  25. * @param password
  26. */
  27. public SendMail(String username,String password){
  28. this.username = username;
  29. this.password = password;
  30. }
  31. /**
  32. * 设置email系统参数
  33. * 接收一个map集合key为string类型,值为String
  34. * 发送邮件必须的步骤:2
  35. * @param map
  36. */
  37. public void setPros(Map<String,String> map){
  38. pros = new Properties();
  39. for(Map.Entry<String,String> entry:map.entrySet()){
  40. pros.setProperty(entry.getKey(), entry.getValue());
  41. }
  42. }
  43. /**
  44. * 初始化MimeMessage对象
  45. * 发送邮件必须的步骤:3
  46. */
  47. public void initMessage(){
  48. this.auth = new Email_Autherticator();
  49. Session session = Session.getDefaultInstance(pros,auth);
  50. mimeMessage = new MimeMessage(session);
  51. }
  52. /**
  53. * 验证账号密码
  54. * 发送邮件必须的步骤
  55. * @author Administrator
  56. *
  57. */
  58. public class Email_Autherticator extends Authenticator
  59. {
  60. public PasswordAuthentication getPasswordAuthentication()
  61. {
  62. return new PasswordAuthentication(username, password);
  63. }
  64. }
  65. /**
  66. * 设置发送邮件的基本参数(去除繁琐的邮件设置)
  67. * @param sub 设置邮件主题
  68. * @param text 设置邮件文本内容
  69. * @param rec 设置邮件接收人
  70. * @throws MessagingException
  71. * @throws UnsupportedEncodingException
  72. */
  73. public void setDefaultMessagePros(String sub,String text,String rec) throws MessagingException, UnsupportedEncodingException{
  74. mimeMessage.setSubject(sub);
  75. mimeMessage.setText(text);
  76. mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(rec));
  77. mimeMessage.setSentDate(new Date());
  78. mimeMessage.setFrom(new InternetAddress(username,username));
  79. }
  80. /**
  81. * 设置主题
  82. * @param subject
  83. * @throws MessagingException
  84. */
  85. public void setSubject(String subject) throws MessagingException{
  86. mimeMessage.setSubject(subject);
  87. }
  88. /**
  89. * 设置日期
  90. * @param date
  91. * @throws MessagingException
  92. */
  93. public void setDate(Date date) throws MessagingException{
  94. mimeMessage.setSentDate(new Date());
  95. }
  96. /**
  97. * 设置邮件文本内容
  98. * @param text
  99. * @throws MessagingException
  100. */
  101. public void setText(String text) throws MessagingException{
  102. mimeMessage.setText(text);
  103. }
  104. /**
  105. * 设置邮件头部
  106. * @param arg0
  107. * @param arg1
  108. * @throws MessagingException
  109. */
  110. public void setHeader(String arg0,String arg1) throws MessagingException{
  111. mimeMessage.setHeader(arg0, arg1);
  112. }
  113. /**
  114. * 设置邮件接收人地址 <单人发送>
  115. * @param recipient
  116. * @throws MessagingException
  117. */
  118. public void setRecipient(String recipient) throws MessagingException{
  119. mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
  120. }
  121. /**
  122. * 设置邮件接收人地址 <多人发送>
  123. * @param list
  124. * @throws MessagingException
  125. * @throws AddressException
  126. */
  127. public String setRecipients(List<String> recs) throws AddressException, MessagingException{
  128. if(recs.isEmpty()){
  129. return "接收人地址为空!";
  130. }
  131. for(String str:recs){
  132. mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(str));
  133. }
  134. return "加入接收人地址成功!";
  135. }
  136. /**
  137. * 设置邮件接收人地址 <多人发送>
  138. * @param StringBuffer<parms,parms2,parms.....>
  139. * @throws MessagingException
  140. * @throws AddressException
  141. */
  142. @SuppressWarnings("static-access")
  143. public String setRecipients(StringBuffer sb) throws AddressException, MessagingException{
  144. if(sb==null||"".equals(sb)){
  145. return "字符串数据为空!";
  146. }
  147. Address []address = new InternetAddress().parse(sb.toString());
  148. mimeMessage.addRecipients(Message.RecipientType.TO, address);
  149. return "收件人加入成功";
  150. }
  151. /**
  152. * 设置邮件发送人的名字
  153. * @param from
  154. * @throws UnsupportedEncodingException
  155. * @throws MessagingException
  156. */
  157. public void setFrom(String from) throws UnsupportedEncodingException, MessagingException{
  158. mimeMessage.setFrom(new InternetAddress(username,from));
  159. }
  160. /**
  161. * 发送邮件<单人发送>
  162. * return 是否发送成功
  163. * @throws MessagingException
  164. */
  165. public String sendMessage() throws MessagingException{
  166. Transport.send(mimeMessage);
  167. return "success";
  168. }
  169. /**
  170. * 设置附件
  171. * @param file 发送文件的路径
  172. */
  173. public void setMultipart(String file) throws MessagingException, IOException{
  174. if(multipart==null){
  175. multipart = new MimeMultipart();
  176. }
  177. multipart.addBodyPart(writeFiles(file));
  178. mimeMessage.setContent(multipart);
  179. }
  180. /**
  181. * 设置附件<添加多附件>
  182. * @param fileList<接收List集合>
  183. * @throws MessagingException
  184. * @throws IOException
  185. */
  186. public void setMultiparts(List<String> fileList) throws MessagingException, IOException{
  187. if(multipart==null){
  188. multipart = new MimeMultipart();
  189. }
  190. for(String s:fileList){
  191. multipart.addBodyPart(writeFiles(s));
  192. }
  193. mimeMessage.setContent(multipart);
  194. }
  195. /**
  196. * 发送文本内容,设置编码方式
  197. * <方法与发送附件配套使用>
  198. * <发送普通的文本内容请使用setText()方法>
  199. * @param s
  200. * @param type
  201. * @throws MessagingException
  202. */
  203. public void setContent(String s,String type) throws MessagingException{
  204. if(multipart==null){
  205. multipart = new MimeMultipart();
  206. }
  207. bodypart = new MimeBodyPart();
  208. bodypart.setContent(s, type);
  209. multipart.addBodyPart(bodypart);
  210. mimeMessage.setContent(multipart);
  211. mimeMessage.saveChanges();
  212. }
  213. /**
  214. * 读取附件
  215. * @param filePath
  216. * @return
  217. * @throws IOException
  218. * @throws MessagingException
  219. */
  220. public BodyPart writeFiles(String filePath)throws IOException, MessagingException{
  221. File file = new File(filePath);
  222. if(!file.exists()){
  223. throw new IOException("文件不存在!请确定文件路径是否正确");
  224. }
  225. bodypart = new MimeBodyPart();
  226. DataSource dataSource = new FileDataSource(file);
  227. bodypart.setDataHandler(new DataHandler(dataSource));
  228. //文件名要加入编码,不然出现乱码
  229. bodypart.setFileName(MimeUtility.encodeText(file.getName()));
  230. return bodypart;
  231. }
  232.  
  233. /**
  234. * 使用SSL登录
  235. * @throws GeneralSecurityException
  236. */
  237. public void openSSL() throws GeneralSecurityException {
  238. MailSSLSocketFactory sf =new MailSSLSocketFactory();
  239. sf.setTrustAllHosts(true);
  240. pros.put("mail.smtp.ssl.enable", "true");
  241. pros.put("mail.smtp.ssl.socketFactory", sf);
  242. }
  243. }

ps:代码来自http://blog.csdn.net/Coding_One/article/details/51354456

4、把代码copy到位后(记得加你的包名),直接可以使用这个工具类了,下面就贴我写的demo了

  1. public void sendMailTest() throws IOException, MessagingException {
  2. //首先创建一个sendMail对象,它是把发送邮件这件事情封装成对象,当然需要先告诉它你的用户名和密码
  3. SendMail sendMail=new SendMail("你的邮箱地址","你的邮箱密码");
  4.  
  5. //这个是告诉它一些配置信息,就像框架的配置文件
  6. Map<String,String> map=new HashMap<String, String>();
  7. map.put("mail.host","smtp.qq.com");//设置邮箱服务器的地址 我这里填的是qq邮箱的,假如你不知道你使用邮箱的服务器地址,百度下就好了,一般都是这样格式的,比如163就是smtp.163.com
  8. map.put("mail.smtp.auth", "true");//开启验证,不确认怎么发呢,对吧
  9. sendMail.setPros(map);//然后把你写好的信息告诉它
  10.  
  11. //初始化并验证下你密码对不对
  12. sendMail.initMessage();
  13.  
  14. sendMail.setSubject("这里填邮件的标题");
  15. sendMail.setText("这里填正文");
  16. sendMail.setRecipient("这个填你要发给谁");
  17. sendMail.setFrom("这个填你的昵称,告诉人家你是谁");
  18. //填了一堆乱七八糟的东西,终于可以发送拉
  19. sendMail.sendMessage();
  20. }

    这只是一个简单的demo,更多的群发,添加附件,添加多个附件等等,  工具类里面都有支持

---------------------------------------------一个 我还没完 的分割线---------------------------------------------

 有个重要的事情就是,如果使用qq邮箱,密码不填你的qq密码,而是填所谓的授权码(需要在qq邮箱里面申请,设置-账户-开启SMTP服务)

然后还要开启ssl ,代码如下:

  1. //使用ssl登录
  2. sendMail.openSSL();

这个加哪都可以(除了发送之后。。),最好放在:

然后就可以用循环骚扰你的基友了             嘿嘿嘿

本demo只要加上开启ssl和使用授权码就可以使用,非常简单!

本文禁止一切形式转载!

一分钟学会JavaMail(假)__手动滑稽的更多相关文章

  1. 5分钟学会使用Less预编译器

    5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...

  2. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

  3. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  4. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  5. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  6. 50分钟学会Laravel 50个小技巧

    50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09 ...

  7. 10分钟学会Linux

    10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...

  8. PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

    这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...

  9. 30分钟学会使用Spring Web Services基础开发

    时隔一年终于又推出了一篇30分钟系列,上一篇<30分钟学会反向Ajax>是2016年7月的事情了.时光荏苒,岁月穿梭.虽然一直还在从事Java方面的开发工作,但是私下其实更喜欢使用C++. ...

随机推荐

  1. git push origin与git push -u origin master的区别

    $ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支. 如果当前分支只有一个追踪分支,那么主机名都可以省略. $ git push 如果当前分支与多个主机存在追 ...

  2. 【20190228】JavaScript-获取子元素

    在写JavaScript的时候发现了一个获取子节点的坑,如以下的html结构 <div id="parent"> <div>1</div> &l ...

  3. ABP大型项目实战(1) - 目录

    前面我写了<如何用ABP框架快速完成项目>系列文章,讲述了如何用ABP快速完成项目.   然后我收到很多反馈,其中一个被经常问到的问题就是,“看了你的课程,发现ABP的优势是快速开发,那么 ...

  4. Arcgis for Javascript 对接iServer发布的Mapserver服务

    测试说明 webgis开发流程一般是: 数据处理 ---发布服务---SDK开发.除了开源的服务以外,一般各GIS厂商都是自己的服务自己的SDK才能对接. SuperMap  iServer 提供了将 ...

  5. Redis保证事务一致性,以及常用的数据结构

    reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...

  6. nginx配置静态项目

    当nignx可以加载下面的这个service时 server { listen 8085;  server_name 1.192.60.82; location / { root /etc/nginx ...

  7. TreeView 节点拖拽

    public Form1() { InitializeComponent(); treeView1.AllowDrop = true; treeView1.ItemDrag += new ItemDr ...

  8. python实例七

    https://www.cnblogs.com/evablogs/p/6791548.html 题目:将一个列表的数据复制到另一个列表中. 程序分析:打算利用for循环和append函数来复制到另一个 ...

  9. 进程命令(taskkill)

    taskkill 命令: // 描述: 结束一个或多个任务或流程. // 语法: taskkill [/s <computer> [/u [<Domain>\]<User ...

  10. LeetCode算法题-Design HashSet(Java实现)

    这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...