【JAVA】使用javax.mail发送邮件

本文主要解决以下问题:

1、如何用java实现邮件发送功能?

2、如何发送给多个人、抄送给多个人?

3、如何发送携带附件的邮件?


开始说正文。

首先,发送邮件肯定要有个发件人,所有要有发件人的用户名和密码;然后得有服务器给中转吧,不同的邮箱对应的服务器也不一样,所以有邮件服务器的概念;再然后就是邮件本身,要有主题、收件人、抄送、正文、附件等等。


发件人的邮箱好说,随随便便就能申请到,可是邮件服务器呢?这里列出一些常用的邮件服务器(感谢数据的整理者):


[plain]  view plain  copy
  1. sina.com:  
  2. POP3服务器地址:pop3.sina.com.cn(端口:110)  
  3. SMTP服务器地址:smtp.sina.com.cn(端口:25)   
  4.   
  5. sinaVIP:  
  6. POP3服务器:pop3.vip.sina.com (端口:110)  
  7. SMTP服务器:smtp.vip.sina.com (端口:25)  
  8.   
  9. sohu.com:  
  10. POP3服务器地址:pop3.sohu.com(端口:110)  
  11. SMTP服务器地址:smtp.sohu.com(端口:25)  
  12.   
  13. 126邮箱:  
  14. POP3服务器地址:pop.126.com(端口:110)  
  15. SMTP服务器地址:smtp.126.com(端口:25)  
  16.   
  17. 139邮箱:  
  18. POP3服务器地址:POP.139.com(端口:110)  
  19. SMTP服务器地址:SMTP.139.com(端口:25)  
  20.   
  21. 163.com:  
  22. POP3服务器地址:pop.163.com(端口:110)  
  23. SMTP服务器地址:smtp.163.com(端口:25)  
  24.   
  25. QQ邮箱   
  26. POP3服务器地址:pop.qq.com(端口:110)  
  27. SMTP服务器地址:smtp.qq.com (端口:25)  
  28.   
  29. QQ企业邮箱  
  30. POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)  
  31. SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)  
  32.   
  33. yahoo.com:  
  34. POP3服务器地址:pop.mail.yahoo.com  
  35. SMTP服务器地址:smtp.mail.yahoo.com  
  36.   
  37. yahoo.com.cn:  
  38. POP3服务器地址:pop.mail.yahoo.com.cn(端口:995)  
  39. SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587  
  40.   
  41. HotMail  
  42. POP3服务器地址:pop3.live.com (端口:995)  
  43. SMTP服务器地址:smtp.live.com (端口:587)  
  44.   
  45. gmail(google.com)  
  46. POP3服务器地址:pop.gmail.com(SSL启用 端口:995)  
  47. SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)  
  48.   
  49. 263.net:  
  50. POP3服务器地址:pop3.263.net(端口:110)  
  51. SMTP服务器地址:smtp.263.net(端口:25)  
  52.   
  53. 263.net.cn:  
  54. POP3服务器地址:pop.263.net.cn(端口:110)  
  55. SMTP服务器地址:smtp.263.net.cn(端口:25)  
  56.   
  57. x263.net:  
  58. POP3服务器地址:pop.x263.net(端口:110)  
  59. SMTP服务器地址:smtp.x263.net(端口:25)  
  60.   
  61. 21cn.com:  
  62. POP3服务器地址:pop.21cn.com(端口:110)  
  63. SMTP服务器地址:smtp.21cn.com(端口:25)  
  64.   
  65. Foxmail:  
  66. POP3服务器地址:POP.foxmail.com(端口:110)  
  67. SMTP服务器地址:SMTP.foxmail.com(端口:25)  
  68.   
  69. china.com:  
  70. POP3服务器地址:pop.china.com(端口:110)  
  71. SMTP服务器地址:smtp.china.com(端口:25)  
  72.   
  73. tom.com:  
  74. POP3服务器地址:pop.tom.com(端口:110)  
  75. SMTP服务器地址:smtp.tom.com(端口:25)  
  76.   
  77. etang.com:  
  78. POP3服务器地址:pop.etang.com  
  79. SMTP服务器地址:smtp.etang.com  

好嘞,有了这个之后就开始今天的正事,讲讲怎么用java发送邮件,首先上原理( 原文在此 )。

JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。

JavaMail可以到http://www.oracle.com/technetwork/java/javamail/index-138643.html进行下载,并将mail.jar添加到classpath即可。如果你使用的是JAVA EE SDK,则可以在C:\glassfishv3\glassfish\modules\mail.jar找到所需的jar包,同样需要添加的classpath。

JAVA邮件发送的大致过程是这样的的:

1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。
2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。
3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。
4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。
5、使用javax.mail.Transport工具类发送邮件。


接下来上干货

[java]  view plain  copy
  1. import java.util.Iterator;  
  2. import java.util.LinkedList;  
  3. import java.util.List;  
  4. import java.util.Properties;  
  5.   
  6. import javax.activation.DataHandler;  
  7. import javax.activation.FileDataSource;  
  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. import javax.mail.internet.MimeUtility;  
  18.   
  19. public class Email {  
  20.     private static String defaultSenderName = "";// 默认的发件人用户名,defaultEntity用得到  
  21.     private static String defaultSenderPass = "";// 默认的发件人密码,defaultEntity用得到  
  22.     private static String defaultSmtpHost = "";// 默认的邮件服务器地址,defaultEntity用得到  
  23.   
  24.     private String smtpHost; // 邮件服务器地址  
  25.     private String sendUserName; // 发件人的用户名  
  26.     private String sendUserPass; // 发件人密码  
  27.   
  28.     private MimeMessage mimeMsg; // 邮件对象  
  29.     private Session session;  
  30.     private Properties props;  
  31.     private Multipart mp;// 附件添加的组件  
  32.     private List<FileDataSource> files = new LinkedList<FileDataSource>();// 存放附件文件  
  33.   
  34.     private void init() {  
  35.         if (props == null) {  
  36.             props = System.getProperties();  
  37.         }  
  38.         props.put("mail.smtp.host", smtpHost);  
  39.         props.put("mail.smtp.auth""true"); // 需要身份验证  
  40.         session = Session.getDefaultInstance(props, null);  
  41.         // 置true可以在控制台(console)上看到发送邮件的过程  
  42.         session.setDebug(true);  
  43.         // 用session对象来创建并初始化邮件对象  
  44.         mimeMsg = new MimeMessage(session);  
  45.         // 生成附件组件的实例  
  46.         mp = new MimeMultipart();  
  47.     }  
  48.   
  49.     private Email(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject, String mailBody,  
  50.             List<String> attachments) {  
  51.         this.smtpHost = smtpHost;  
  52.         this.sendUserName = sendUserName;  
  53.         this.sendUserPass = sendUserPass;  
  54.   
  55.         init();  
  56.         setFrom(sendUserName);  
  57.         setTo(to);  
  58.         setCC(cc);  
  59.         setBody(mailBody);  
  60.         setSubject(mailSubject);  
  61.         if (attachments != null) {  
  62.             for (String attachment : attachments) {  
  63.                 addFileAffix(attachment);  
  64.             }  
  65.         }  
  66.   
  67.     }  
  68.   
  69.     /** 
  70.      * 邮件实体 
  71.      *  
  72.      * @param smtpHost 
  73.      *            邮件服务器地址 
  74.      * @param sendUserName 
  75.      *            发件邮件地址 
  76.      * @param sendUserPass 
  77.      *            发件邮箱密码 
  78.      * @param to 
  79.      *            收件人,多个邮箱地址以半角逗号分隔 
  80.      * @param cc 
  81.      *            抄送,多个邮箱地址以半角逗号分隔 
  82.      * @param mailSubject 
  83.      *            邮件主题 
  84.      * @param mailBody 
  85.      *            邮件正文 
  86.      * @param attachmentPath 
  87.      *            附件路径 
  88.      * @return 
  89.      */  
  90.     public static Email entity(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject, String mailBody,  
  91.             List<String> attachments) {  
  92.         return new Email(smtpHost, sendUserName, sendUserPass, to, cc, mailSubject, mailBody, attachments);  
  93.     }  
  94.   
  95.     /** 
  96.      * 默认邮件实体,用了默认的发送帐号和邮件服务器 
  97.      *  
  98.      * @param to 
  99.      *            收件人,多个邮箱地址以半角逗号分隔 
  100.      * @param cc 
  101.      *            抄送,多个邮箱地址以半角逗号分隔 
  102.      * @param subject 
  103.      *            邮件主题 
  104.      * @param body 
  105.      *            邮件正文 
  106.      * @param attachment 
  107.      *            附件全路径 
  108.      * @return 
  109.      */  
  110.     public static Email defaultEntity(String to, String cc, String subject, String body, List<String> attachments) {  
  111.         return new Email(defaultSmtpHost, defaultSenderName, defaultSenderPass, to, cc, subject, body, attachments);  
  112.     }  
  113.   
  114.     /** 
  115.      * 设置邮件主题 
  116.      *  
  117.      * @param mailSubject 
  118.      * @return 
  119.      */  
  120.     private boolean setSubject(String mailSubject) {  
  121.         try {  
  122.             mimeMsg.setSubject(mailSubject);  
  123.         } catch (Exception e) {  
  124.             return false;  
  125.         }  
  126.         return true;  
  127.     }  
  128.   
  129.     /** 
  130.      * 设置邮件内容,并设置其为文本格式或HTML文件格式,编码方式为UTF-8 
  131.      *  
  132.      * @param mailBody 
  133.      * @return 
  134.      */  
  135.     private boolean setBody(String mailBody) {  
  136.         try {  
  137.             BodyPart bp = new MimeBodyPart();  
  138.             bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>" + mailBody, "text/html;charset=UTF-8");  
  139.             // 在组件上添加邮件文本  
  140.             mp.addBodyPart(bp);  
  141.         } catch (Exception e) {  
  142.             System.err.println("设置邮件正文时发生错误!" + e);  
  143.             return false;  
  144.         }  
  145.         return true;  
  146.     }  
  147.   
  148.     /** 
  149.      * 添加一个附件 
  150.      *  
  151.      * @param filename 
  152.      *            邮件附件的地址,只能是本机地址而不能是网络地址,否则抛出异常 
  153.      * @return 
  154.      */  
  155.     public boolean addFileAffix(String filename) {  
  156.         try {  
  157.             if (filename != null && filename.length() > 0) {  
  158.                 BodyPart bp = new MimeBodyPart();  
  159.                 FileDataSource fileds = new FileDataSource(filename);  
  160.                 bp.setDataHandler(new DataHandler(fileds));  
  161.                 bp.setFileName(MimeUtility.encodeText(fileds.getName(), "utf-8"null)); // 解决附件名称乱码  
  162.                 mp.addBodyPart(bp);// 添加附件  
  163.                 files.add(fileds);  
  164.             }  
  165.         } catch (Exception e) {  
  166.             System.err.println("增加邮件附件:" + filename + "发生错误!" + e);  
  167.             return false;  
  168.         }  
  169.         return true;  
  170.     }  
  171.   
  172.     /** 
  173.      * 删除所有附件 
  174.      *  
  175.      * @return 
  176.      */  
  177.     public boolean delFileAffix() {  
  178.         try {  
  179.             FileDataSource fileds = null;  
  180.             for (Iterator<FileDataSource> it = files.iterator(); it.hasNext();) {  
  181.                 fileds = it.next();  
  182.                 if (fileds != null && fileds.getFile() != null) {  
  183.                     fileds.getFile().delete();  
  184.                 }  
  185.             }  
  186.         } catch (Exception e) {  
  187.             return false;  
  188.         }  
  189.         return true;  
  190.     }  
  191.   
  192.     /** 
  193.      * 设置发件人地址 
  194.      *  
  195.      * @param from 
  196.      *            发件人地址 
  197.      * @return 
  198.      */  
  199.     private boolean setFrom(String from) {  
  200.         try {  
  201.             mimeMsg.setFrom(new InternetAddress(from));  
  202.         } catch (Exception e) {  
  203.             return false;  
  204.         }  
  205.         return true;  
  206.     }  
  207.   
  208.     /** 
  209.      * 设置收件人地址 
  210.      *  
  211.      * @param to收件人的地址 
  212.      * @return 
  213.      */  
  214.     private boolean setTo(String to) {  
  215.         if (to == null)  
  216.             return false;  
  217.         try {  
  218.             mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));  
  219.         } catch (Exception e) {  
  220.             return false;  
  221.         }  
  222.         return true;  
  223.     }  
  224.   
  225.     /** 
  226.      * 设置抄送 
  227.      *  
  228.      * @param cc 
  229.      * @return 
  230.      */  
  231.     private boolean setCC(String cc) {  
  232.         if (cc == null) {  
  233.             return false;  
  234.         }  
  235.         try {  
  236.             mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));  
  237.         } catch (Exception e) {  
  238.             return false;  
  239.         }  
  240.         return true;  
  241.     }  
  242.   
  243.     /** 
  244.      * 发送邮件 
  245.      *  
  246.      * @return 
  247.      */  
  248.     public boolean send() throws Exception {  
  249.         mimeMsg.setContent(mp);  
  250.         mimeMsg.saveChanges();  
  251.         System.out.println("正在发送邮件....");  
  252.         Transport transport = session.getTransport("smtp");  
  253.         // 连接邮件服务器并进行身份验证  
  254.         transport.connect(smtpHost, sendUserName, sendUserPass);  
  255.         // 发送邮件  
  256.         transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));  
  257.         System.out.println("发送邮件成功!");  
  258.         transport.close();  
  259.         return true;  
  260.     }  
  261. }  



我自己写的一个封装的Email类,提供了两个静态的方法获取实体,send方法用来发送邮件,附上测试代码

[java]  view plain  copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.junit.Test;  
  5.   
  6. import smok.springmvc.model.Email;  
  7.   
  8. public class EmailTest {  
  9.   
  10.     @Test  
  11.     public void sendEmail() throws Exception {  
  12.         String userName = "[email protected]"// 发件人邮箱  
  13.         String password = "********"// 发件人密码  
  14.         String smtpHost = "smtp.qq.com"// 邮件服务器  
  15.   
  16.         String to = "[email protected]"// 收件人,多个收件人以半角逗号分隔  
  17.         String cc = "[email protected]"// 抄送,多个抄送以半角逗号分隔  
  18.         String subject = "这是邮件的主题"// 主题  
  19.         String body = "这是邮件的正文"// 正文,可以用html格式的哟  
  20.         List<String> attachments = Arrays.asList("D:\\tmp\\1.png""D:\\tmp\\2.png"); // 附件的路径,多个附件也不怕  
  21.   
  22.         Email email = Email.entity(smtpHost, userName, password, to, cc, subject, body, attachments);  
  23.   
  24.         email.send(); // 发送!  
  25.     }  
  26.   
  27. }  

直接粘代码可是会报错的,这里边依赖了几个包,我把pom也放上来

[html]  view plain  copy
  1. <span style="white-space:pre">    </span><dependency>  
  2.         <groupId>javax.mail</groupId>  
  3.         <artifactId>javax.mail-api</artifactId>  
  4.         <version>1.5.2</version>  
  5.         <type>jar</type>  
  6.         <scope>compile</scope>  
  7.     </dependency>  
  8.     <dependency>  
  9.         <groupId>com.sun.mail</groupId>  
  10.         <artifactId>smtp</artifactId>  
  11.         <version>1.5.2</version>  
  12.         <type>jar</type>  
  13.         <scope>compile</scope>  
  14.     </dependency>  
  15.     <dependency>  
  16.         <groupId>com.sun.mail</groupId>  
  17.         <artifactId>mailapi</artifactId>  
  18.         <version>1.5.2</version>  
  19.         <type>jar</type>  
  20.         <scope>compile</scope>  
  21.     </dependency>  
  22.   
  23.     <dependency>  
  24.         <groupId>junit</groupId>  
  25.         <artifactId>junit</artifactId>  
  26.         <version>4.9</version>  
  27.         <scope>test</scope>  
  28.     </dependency>  


到这里应该已经解决了开头提到的三个问题了

1、发送邮件,ok

2、发送给多个人,只有以半角逗号分隔收件人就可以了,抄送也是一样的方式

3、发送附件,只要有文件的全路径,发送多个文件也没问题呀~


总算是把发邮件这个事情搞定了,以后遇到cover不到的情况再来补充。

猜你喜欢

转载自blog.csdn.net/sivanl/article/details/80459228