JavaMail实现邮件的发送

  1. 云栖社区>
  2. 博客>
  3. 正文

JavaMail实现邮件的发送

技术小阿哥 2017-11-27 11:04:00 浏览1038
展开阅读全文

1、引入相关的Jar包:

activation.jar、cos.jar、mail.jar


  1. <dependency> 
  2.         <groupId>com.alibaba.external</groupId> 
  3.         <artifactId>java.activation</artifactId> 
  4.         <version>1.1</version> 
  5.     </dependency> 
  6.     <dependency> 
  7.         <groupId>com.alibaba.external</groupId> 
  8.         <artifactId>java.mail</artifactId> 
  9.         <version>1.4.3</version> 
  10.     </dependency> 
  11.     <dependency> 
  12.         <groupId>com.alibaba.external</groupId> 
  13.         <artifactId>java.servlet</artifactId> 
  14.         <version>2.5</version> 
  15.     </dependency> 

2、相关的发送代码


  1. import java.io.IOException; 
  2. import java.io.PrintWriter; 
  3. import java.util.Date; 
  4. import java.util.Properties; 
  5.  
  6. import javax.mail.Address; 
  7. import javax.mail.Message; 
  8. import javax.mail.Session; 
  9. import javax.mail.Transport; 
  10. import javax.mail.internet.InternetAddress; 
  11. import javax.mail.internet.MimeMessage; 
  12. import javax.servlet.ServletException; 
  13. import javax.servlet.http.HttpServlet; 
  14. import javax.servlet.http.HttpServletRequest; 
  15. import javax.servlet.http.HttpServletResponse; 
  16.  
  17. public class SEND extends HttpServlet { 
  18.  
  19.     public SEND() { 
  20.         super(); 
  21.     } 
  22.  
  23.     public void doPost(HttpServletRequest request, HttpServletResponse response) 
  24.             throws ServletException, IOException { 
  25.  
  26.         response.setContentType("text/html"); 
  27.         PrintWriter out = response.getWriter(); 
  28.         request.setCharacterEncoding("gb2312"); 
  29.         String from = request.getParameter("from"); 
  30.         String to = request.getParameter("to"); 
  31.         String subject = request.getParameter("subject"); 
  32.         String context = request.getParameter("context"); 
  33.         // 确定要发送的邮件服务器的地址 
  34.         String mailserver = "d9e307714c5044f"
  35.         // 设置邮件的传输协议 
  36.         try { 
  37.             Properties prop = System.getProperties(); 
  38.             prop.put("mail.smtp.host", mailserver); 
  39.             // 建立邮件发送的连接 
  40.             Session session = Session.getDefaultInstance(prop, null); 
  41.             // 创建发送的信息的载体 
  42.             Message msg = new MimeMessage(session); 
  43.             // 设置相关的邮件属性 
  44.             msg.setFrom(new InternetAddress(from)); 
  45.             // 点到点的发送 
  46.             msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
  47.             /* 
  48.              * //群发 msg.setRecipients(Message.RecipientType.TO, new 
  49.              * InternetAddress[]{new InternetAddress(to),new 
  50.              * InternetAddress(to)}); //借助循环的标准发送 
  51.              */ 
  52.             msg.setSubject(subject); 
  53.             msg.setSentDate(new Date()); 
  54.             msg.setText(context); 
  55.             // 发送 
  56.             Transport.send(msg); 
  57.         } catch (Exception e) { 
  58.  
  59.         } 
  60.  
  61.         out.print("send ok"); 
  62.         out.flush(); 
  63.         out.close(); 
  64.     } 
  65.  

cmainserver下载:http://www.onlinedown.net/softdown/9044_2.htm 

 安装好了之后,执行如下步骤:开始->控制面板->管理工具->Internet 信息服务, 在启动的“Internet 信息服务”下面,找到“默认站点”, 右键点击“新建”->“虚拟目录”, 随便取个别名(比如mail), 在“目录”处浏览到cmainserver安装目录下面的webmail(比如:D:\ProgramFiles\CMailServer\webmail)。 在启动之后,即可通过http访问mail的网站了。

3、使用JavaMail在邮件中发送图片 

本例参考:http://topic.csdn.net/t/20051012/09/4320650.html

带附件的参考:http://www.blogjava.net/sunfruit/archive/2006/10/24/77086.html

图片的保存与显示,参考:http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html

javax.mail总结:http://lgcjar.javaeye.com/blog/511127


  1. package com.alibaba.annotation.client; 
  2.  
  3. import java.util.Properties; 
  4. import java.util.Date; 
  5. import javax.mail.*; 
  6. import javax.mail.internet.*; 
  7. import javax.activation.*; 
  8.  
  9. public class Test { 
  10.  
  11.     /** 
  12.      * @param args 
  13.      */ 
  14.     public static void main(String[] args) throws Exception { 
  15.         sendhtml(args); 
  16.     } 
  17.  
  18.     public static void sendhtml(String[] argv) throws Exception { 
  19.  
  20.         String to = "q123456789@163.com "
  21.         String subject = "null "
  22.         String from = "abcdef@163.com "
  23.         String cc = null
  24.         String bcc = null
  25.         String mailhost = "smtp.163.com "
  26.         boolean debug = false
  27.         String username = "abcdef "
  28.         String password = "123456 "
  29.         Properties props = System.getProperties(); 
  30.         props.put("mail.smtp.auth ""true "); 
  31.         SMTPAuth auth = new SMTPAuth(username, password); 
  32.         // could use Session.getTransport() and Transport.connect() 
  33.         // assume we 're using SMTP 
  34.         if (mailhost != null
  35.             props.put("mail.smtp.host ", mailhost); 
  36.  
  37.         // Get a Session object 
  38.         Session session = Session.getDefaultInstance(props, auth); 
  39.         if (debug) 
  40.             session.setDebug(true); 
  41.  
  42.         // construct the message 
  43.         Message msg = new MimeMessage(session); 
  44.         if (from != null
  45.             msg.setFrom(new InternetAddress(from)); 
  46.         else 
  47.             msg.setFrom(); 
  48.  
  49.         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, 
  50.                 false)); 
  51.         if (cc != null
  52.             msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse( 
  53.                     cc, false)); 
  54.         if (bcc != null
  55.             msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse( 
  56.                     bcc, false)); 
  57.  
  58.         msg.setSubject(subject); 
  59.  
  60.         MimeBodyPart mbp1 = new MimeBodyPart(); 
  61.         String html = " <!DOCTYPE   HTML   PUBLIC   \"-//W3C//DTD   HTML   4.0   Transitional//EN\"> " 
  62.                 + " <html> " 
  63.                 + " <head> <title> </title> </head> " 
  64.                 + " <body> " 
  65.                 + " <b>   see   the   following   jpg   :   it   is   a   car! </b> <br> " 
  66.                 + " <a   href=http://www.a.com/a.jsp> hello </a> <br> " 
  67.                 + " <IMG   SRC=cid:7e2a34e1.jpg   width=80%   height=60%> <br> " 
  68.                 + " <b>   end   of   jpg </b> " + " </body> " + " </html> "
  69.  
  70.         mbp1.setContent(html, "text/html "); 
  71.  
  72.         FileDataSource fds = new FileDataSource("c:/7e2a34e1.jpg "); 
  73.         MimeBodyPart mbp2 = new MimeBodyPart(); 
  74.         mbp2.setFileName(fds.getName()); 
  75.         mbp2.setText("This   is   a   beautiful   car   ! "); 
  76.         mbp2.setDataHandler(new DataHandler(fds)); 
  77.         //mbp2.setHeader("Content-ID ", fds.getName()); 
  78.         mbp2.setHeader( "Content-ID ",   " < "   +   fds.getName()   +   "> ");  
  79.         MimeMultipart mp = new MimeMultipart("related ");// alternative 
  80.         mp.addBodyPart(mbp1); 
  81.         mp.addBodyPart(mbp2); 
  82.         msg.setContent(mp); 
  83.  
  84.         msg.setSentDate(new Date()); 
  85.         Transport.send(msg); 
  86.         System.out.println(mp.getCount()); 
  87.         System.out.println("\nMail   was   sent   successfully. "); 
  88.  
  89.     } 
  90.  
  91. class SMTPAuth extends javax.mail.Authenticator { 
  92.     private String user, password; 
  93.  
  94.     public SMTPAuth(String u, String p) { 
  95.         user = u; 
  96.         password = p; 
  97.     } 
  98.  
  99.     public void getuserinfo(String getuser, String getpassword) { 
  100.         user = getuser; 
  101.         password = getpassword; 
  102.     } 
  103.  
  104.     protected javax.mail.PasswordAuthentication getPasswordAuthentication() { 
  105.         return new javax.mail.PasswordAuthentication(user, password); 
  106.     } 
  107.  

【注意】

1、经测试通过的程序


  1. package com.company.demoes; 
  2.  
  3. import java.util.Properties; 
  4.  
  5. import javax.activation.DataHandler; 
  6. import javax.activation.FileDataSource; 
  7. import javax.mail.BodyPart; 
  8. import javax.mail.Multipart; 
  9. import javax.mail.Session; 
  10. import javax.mail.Transport; 
  11. import javax.mail.internet.InternetAddress; 
  12. import javax.mail.internet.MimeBodyPart; 
  13. import javax.mail.internet.MimeMessage; 
  14. import javax.mail.internet.MimeMultipart; 
  15.  
  16. /** 
  17.  * 本程序用java来实现Email的发送,所用到的协议为:SMTP,端口号为25;<br> 
  18.  * 方法:用Socket进行实现,打开客户端的Socket,并连接上服务器:<br> 
  19.  * 如:Socket sockClient = new Socket("smtp.qq.com",23);<br> 
  20.  * 这表示发件方连接的是QQ邮箱的服务器,端口号为23 
  21.  *  
  22.  */ 
  23. public class Email { 
  24.     /** 
  25.      * 整个MIME邮件对象 
  26.      */ 
  27.     private MimeMessage mimeMsg; 
  28.     /** 
  29.      * 专门用来发送邮件的Session会话 
  30.      */ 
  31.     private Session session; 
  32.     /** 
  33.      * 封装邮件发送时的一些配置信息的一个属性对象 
  34.      */ 
  35.     private Properties props; 
  36.     /** 
  37.      * 发件人的用户名 
  38.      */ 
  39.     private String username; 
  40.     /** 
  41.      * 发件人的密码 
  42.      */ 
  43.     private String password; 
  44.     /** 
  45.      * 用来实现附件添加的组件 
  46.      */ 
  47.     private Multipart mp; 
  48.  
  49.     /** 
  50.      * 发送参数初始化,有的服务器不需要用户验证,所以这里对用户名和密码进行初始化"" 
  51.      *  
  52.      * @param smtp 
  53.      *            SMTP服务器的地址,比如要用QQ邮箱,哪么应为:"smtp.qq.com",163为: "smtp.163.com" 
  54.      */ 
  55.     public Email(String smtp) { 
  56.         username = ""
  57.         password = ""
  58.         // 设置邮件服务器 
  59.         setSmtpHost(smtp); 
  60.         // 创建邮件 
  61.         createMimeMessage(); 
  62.     } 
  63.  
  64.     /** 
  65.      * 设置发送邮件的主机(JavaMail需要Properties来创建一个session对象。 
  66.      * 它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机); 
  67.      *  
  68.      * @param hostName 
  69.      */ 
  70.     public void setSmtpHost(String hostName) { 
  71.         System.out.println("设置系统属性:mail.smtp.host = " + hostName); 
  72.         if (props == null
  73.             props = System.getProperties(); 
  74.         props.put("mail.smtp.host", hostName); 
  75.     } 
  76.  
  77.     /** 
  78.      * (这个Session类代表JavaMail 中的一个邮件session. 每一个基于 
  79.      * JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, 
  80.      * Session对象需要知道用来处理邮件的SMTP 服务器。 
  81.      */ 
  82.     public boolean createMimeMessage() { 
  83.         try { 
  84.             System.out.println("准备获取邮件会话对象!"); 
  85.             // 用props对象来创建并初始化session对象 
  86.             session = Session.getDefaultInstance(props, null); 
  87.         } catch (Exception e) { 
  88.             System.err.println("获取邮件会话对象时发生错误!" + e); 
  89.             return false
  90.         } 
  91.         System.out.println("准备创建MIME邮件对象!"); 
  92.         try { 
  93.             // 用session对象来创建并初始化邮件对象 
  94.             mimeMsg = new MimeMessage(session); 
  95.             // 生成附件组件的实例 
  96.             mp = new MimeMultipart(); 
  97.         } catch (Exception e) { 
  98.             System.err.println("创建MIME邮件对象失败!" + e); 
  99.             return false
  100.         } 
  101.         return true
  102.     } 
  103.  
  104.     /** 
  105.      * 设置SMTP的身份认证 
  106.      */ 
  107.     public void setNeedAuth(boolean need) { 
  108.         System.out.println("设置smtp身份认证:mail.smtp.auth = " + need); 
  109.         if (props == null) { 
  110.             props = System.getProperties(); 
  111.         } 
  112.         if (need) 
  113.             props.put("mail.smtp.auth""true"); 
  114.         else 
  115.             props.put("mail.smtp.auth""false"); 
  116.     } 
  117.  
  118.     /** 
  119.      * 进行用户身份验证时,设置用户名和密码 
  120.      */ 
  121.     public void setNamePass(String name, String pass) { 
  122.         System.out.println("程序得到用户名与密码"); 
  123.         username = name; 
  124.         password = pass; 
  125.     } 
  126.  
  127.     /** 
  128.      * 设置邮件主题 
  129.      *  
  130.      * @param mailSubject 
  131.      * @return 
  132.      */ 
  133.     public boolean setSubject(String mailSubject) { 
  134.         System.out.println("设置邮件主题!"); 
  135.         try { 
  136.             mimeMsg.setSubject(mailSubject); 
  137.         } catch (Exception e) { 
  138.             System.err.println("设置邮件主题发生错误!"); 
  139.             return false
  140.         } 
  141.         return true
  142.     } 
  143.  
  144.     /** 
  145.      * 设置邮件内容,并设置其为文本格式或HTML文件格式,编码方式为UTF-8 
  146.      *  
  147.      * @param mailBody 
  148.      * @return 
  149.      */ 
  150.     public boolean setBody(String mailBody) { 
  151.         try { 
  152.             System.out.println("设置邮件体格式"); 
  153.             BodyPart bp = new MimeBodyPart(); 
  154.             bp.setContent( 
  155.                     "<meta http-equiv=Content-Type content=text/html; charset=UTF-8>" 
  156.                             + mailBody, "text/html;charset=UTF-8"); 
  157.             // 在组件上添加邮件文本 
  158.             mp.addBodyPart(bp); 
  159.         } catch (Exception e) { 
  160.             System.err.println("设置邮件正文时发生错误!" + e); 
  161.             return false
  162.         } 
  163.         return true
  164.     } 
  165.  
  166.     /** 
  167.      * 增加发送附件 
  168.      *  
  169.      * @param filename 
  170.      *            邮件附件的地址,只能是本机地址而不能是网络地址,否则抛出异常 
  171.      * @return 
  172.      */ 
  173.     public boolean addFileAffix(String filename) { 
  174.         System.out.println("增加邮件附件:" + filename); 
  175.         try { 
  176.             BodyPart bp = new MimeBodyPart(); 
  177.             FileDataSource fileds = new FileDataSource(filename); 
  178.             bp.setDataHandler(new DataHandler(fileds)); 
  179.             // 发送的附件前加上一个用户名的前缀 
  180.             bp.setFileName(fileds.getName()); 
  181.             // 添加附件 
  182.             mp.addBodyPart(bp); 
  183.         } catch (Exception e) { 
  184.             System.err.println("增加邮件附件:" + filename + "发生错误!" + e); 
  185.             return false
  186.         } 
  187.         return true
  188.     } 
  189.  
  190.     /** 
  191.      * 设置发件人地址 
  192.      *  
  193.      * @param from 
  194.      *            发件人地址 
  195.      * @return 
  196.      */ 
  197.     public boolean setFrom(String from) { 
  198.         System.out.println("设置发信人!"); 
  199.         try { 
  200.             mimeMsg.setFrom(new InternetAddress(from)); 
  201.         } catch (Exception e) { 
  202.             return false
  203.         } 
  204.         return true
  205.     } 
  206.  
  207.     /** 
  208.      * 设置收件人地址 
  209.      *  
  210.      * @param to 
  211.      *            收件人的地址 
  212.      * @return 
  213.      */ 
  214.     public boolean setTo(String to) { 
  215.         System.out.println("设置收信人"); 
  216.         if (to == null
  217.             return false
  218.         try { 
  219.             mimeMsg.setRecipients(javax.mail.Message.RecipientType.TO, 
  220.                     InternetAddress.parse(to)); 
  221.         } catch (Exception e) { 
  222.             return false
  223.         } 
  224.         return true
  225.     } 
  226.  
  227.     /** 
  228.      * 发送附件 
  229.      *  
  230.      * @param copyto 
  231.      * @return 
  232.      */ 
  233.     public boolean setCopyTo(String copyto) { 
  234.         System.out.println("发送附件到"); 
  235.         if (copyto == null
  236.             return false
  237.         try { 
  238.             mimeMsg.setRecipients(javax.mail.Message.RecipientType.CC, 
  239.                     InternetAddress.parse(copyto)); 
  240.         } catch (Exception e) { 
  241.             return false
  242.         } 
  243.         return true
  244.     } 
  245.  
  246.     /** 
  247.      * 发送邮件 
  248.      *  
  249.      * @return 
  250.      */ 
  251.     public boolean sendout() { 
  252.         try { 
  253.             mimeMsg.setContent(mp); 
  254.             mimeMsg.saveChanges(); 
  255.             System.out.println("正在发送邮件...."); 
  256.             Session mailSession = Session.getInstance(props, null); 
  257.             Transport transport = mailSession.getTransport("smtp"); 
  258.             // 真正的连接邮件服务器并进行身份验证 
  259.             transport.connect((String) props.get("mail.smtp.host"), username, 
  260.                     password); 
  261.             // 发送邮件 
  262.             transport.sendMessage(mimeMsg, 
  263.                     mimeMsg.getRecipients(javax.mail.Message.RecipientType.TO)); 
  264.             System.out.println("发送邮件成功!"); 
  265.             transport.close(); 
  266.         } catch (Exception e) { 
  267.             System.err.println("邮件发送失败!" + e.getMessage()); 
  268.             e.printStackTrace(); 
  269.             return false
  270.         } 
  271.         return true
  272.     } 
  273.  
  274.     public static void main(String[] args) { 
  275.         /** 
  276.          *  
  277.          ************* 切切注意******** 
  278.          *  
  279.          * 注意 用此程序发邮件必须邮箱支持smtp服务 在2006年以后申请的163邮箱是不支持的 我知道sina邮箱 sohu邮箱 qq邮箱支持 
  280.          * 但是sina和qq邮箱需要手工设置开启此功能 所以在测试时最好使用这三个邮箱 sina邮箱的smtp设置方法如下 登录sina邮箱 
  281.          * 依次点击 邮箱设置--->帐户--->POP/SMTP设置 将开启复选框选中 然后保存 
  282.          *  
  283.          ************* 切切注意******** 
  284.          */ 
  285.         Email themail = new Email("smtp.sina.com");// 这里以新浪邮箱为例子 
  286.         String mailbody = "hello!!!"// 邮件内容 
  287.         themail.setNeedAuth(true); 
  288.         themail.setSubject("JAVA发邮件的测试");// 邮件主题 
  289.         themail.setBody(mailbody);// 邮件正文 
  290.         themail.setTo("****@qq.com");// 收件人地址 
  291.         themail.setFrom("tjwkj@sina.com");// 发件人地址 
  292.         themail.addFileAffix("d:\\temp\\aop.docx");// 附件文件路径,例如:C:/222.jpg,*注;"/"的写法; 
  293.                                                         // 如果没有可以不写 
  294.         themail.setNamePass("****@sina.com""****");// 发件人地址和密码 
  295.                                                                 // **改为相应邮箱密码 
  296.         themail.sendout(); 
  297.     } 

 本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/408390,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注