本文主要解决以下问题:

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

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

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

开始说正文。

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

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

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

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

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

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

[html] view plaincopy
  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. <dependency>
  23. <groupId>junit</groupId>
  24. <artifactId>junit</artifactId>
  25. <version>4.9</version>
  26. <scope>test</scope>
  27. </dependency>

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

1、发送邮件,ok

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

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

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

【JAVA】使用javax.mail发送邮件相关推荐

  1. java mail 发件人昵称,Java使用javax.mail发送邮件 解决收件人、发件人名字乱码问题...

    /** * 格式化 Name 的地址 * @param name 名字 * @param email Email地址 * @return 格式化的地址 */ public static String ...

  2. java发送邮件到qq邮箱_Java利用javax.mail发送邮件至QQ邮箱

    javax.mail去哪里下载就不要说了吧.以下是利用javax.mail发送邮件的代码.public static void sendMail(String fromMail,String user ...

  3. 使用javax.mail发送邮件

    文章目录 一.发邮件流程 二.关于邮件协议和端口 三.开启邮件协议和端口 3.1. QQ邮箱 3.2. 163邮箱 四.实战发送邮件 4.1. 引入依赖 4.2. 方法重写 4.3. 发送邮件核心类工 ...

  4. java使用javax.mail包发送电子邮件:设置账号、密码、主题、文本、附件

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 docker/kubernetes入门视频教程 全栈工程师开发手册 (作者:栾鹏) java ...

  5. 使用 javax.mail 发送邮件

    发邮件在 java web 项目中是一个常用功能,之前在项目中刚好用到了邮件发送功能,现在用博客进行记录,方便以后查阅.这篇文章简单介绍使用 javax.mail 发送邮件的步骤,并提供封装好的邮件发 ...

  6. java import javax.mail.*报错原因

    java import javax.mail.*报错原因:缺少收发邮件的jar包 下载地址: http://www.oracle.com/technetwork/java/javamail/javam ...

  7. Java使用javax.mail.jar发送邮件并同意发送附件

    因为Java在开发网页上占有绝大优势.所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必定,网络安全一再安全我们须要把账号的安全级别提到更高.因此这些对于开发者也就成了必须掌握的技能!我一 ...

  8. Java使用javax.mail.jar发送邮件并允许发送附件

    由于Java在开发网页上占有绝大优势,所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必然,网络安全一再安全我们需要把账号的安全级别提到更高!因此这些对于开发人员也就成了必须掌握的技能!我 ...

  9. 使用javax.mail发送邮件详解

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

最新文章

  1. Git Bash修改默认路径
  2. Python函数内置函数
  3. C#创建Oracle中的几何对象:点、线、面
  4. Spring Boot JPA的查询语句
  5. Java Collections BinarySearch()方法与示例
  6. 数据分析流程和特征工程
  7. mysql ---- 约束
  8. 不用for loop循环一个读取一个文件
  9. less css 视频教程
  10. Unity手游优化总概
  11. 2019中原银行java实习面试
  12. [ZT]狄马:老子与美国南北战争
  13. 门店定位怎么在地图上显示_怎样让自己的店地理位置显示在高德地图上
  14. 电脑管理android手机版下载失败怎么办,腾讯手机管家PC版轻松解决Android文件管理难题...
  15. 【C语言刷LeetCode】883. 三维形体投影面积(E)
  16. 读书郎平板中android,读书郎学生平板电脑怎么用 使用方法详解【图文】
  17. c语言如何将一个16进制转为2进制,[求助]如何实现16进制转2进制
  18. [工作效率提升]焦虑性失眠的应对方法
  19. PART 2.2 风控建模前数据预处理清洗
  20. Swan学院社团招新

热门文章

  1. 从.caffemodel/.caffemodel.h5提取Caffe模型的参数
  2. javascript中mouseenter与mouseover的异同
  3. 【JS】去除“确认重新提交表单”
  4. 图形验证码的两种实现方式
  5. 有关于中通公司需要提交的面试题答案
  6. 如何将PDF转换为PPT?2个免费好用的pdf转ppt工具
  7. 虚幻四蓝图实战(人物切换汽车控制)
  8. python什么意思v_vpython是什么
  9. 利用validation对Java接口入参进行基础校验
  10. 360路由器v2刷第三方固件_己亥年网件R6220路由器刷openwrt固件的方法(亲测可用)...