一、前言
参考博客:
http://blog.csdn.net/xietansheng/article/details/51722660
http://www.cnblogs.com/HigginCui/p/5764509.html
关于JavaMail实现带附件的收发邮件网上的例子很多,自己兴趣来了,自己也动手尝试了一番。
其中问题大部分在代码注释中,这里也就不过多描述了,直接上代码作为记录,方便以后查阅。
二、工程目录
三、工程代码
1、Mail.java
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.xie.util; import java.util.ArrayList; import java.util.List; /** * 表示邮件类,你需要设置:账户名和密码、收件人、抄送(可选)、暗送(可选)、主题、内容,以及附件(可选) * * 在创建了Mail对象之后 * 可以调用它的setSubject()、setContent(),设置主题和正文 * 也可以调用setFrom()和 addToAddress(),设置发件人,和添加收件人。 * 也可以调用addAttch()添加附件 * 创建AttachBean:new AttachBean(new File("..."), "fileName"); */ public class Mail { private String from; //发件人 private StringBuilder toAddress = new StringBuilder(); //收件人 private StringBuilder ccAddress = new StringBuilder(); //抄送 private StringBuilder bccAddress = new StringBuilder(); //暗送 private String subject;//主题 private String content;//正文 // 附件列表 private List<AttachBean> attachList = new ArrayList<AttachBean>(); public Mail() {} public Mail(String from, String to) { this(from, to, null, null); } public Mail(String from, String to, String subject, String content) { this.from = from; this.toAddress.append(to); this.subject = subject; this.content = content; } /** * 返回发件人 * @return */ public void setFrom(String from) { this.from = from; } /** * 返回发件人 * @return */ public String getFrom() { return from; } /** * 返回主题 */ public String getSubject() { return subject; } /** * 设置主题 */ public void setSubject(String subject) { this.subject = subject; } /** * 获取主题内容 */ public String getContent() { return content; } /** * 设置主题内容 * @param content */ public void setContent(String content) { this.content = content; } /** * 获取收件人 * @return */ public String getToAddress() { return toAddress.toString(); } /** * 获取抄送 * @return */ public String getCcAddress() { return ccAddress.toString(); } /** * 获取暗送 * @return */ public String getBccAddress() { return bccAddress.toString(); } /** * 添加收件人,可以是多个收件人 * @param to */ public void addToAddress(String to) { if(this.toAddress.length() > 0) { this.toAddress.append(","); } this.toAddress.append(to); } /** * 添加抄送人,可以是多个抄送人 * @param cc */ public void addCcAddress(String cc) { if(this.ccAddress.length() > 0) { this.ccAddress.append(","); } this.ccAddress.append(cc); } /** * 添加暗送人,可以是多个暗送人 * @param bcc */ public void addBccAddress(String bcc) { if(this.bccAddress.length() > 0) { this.bccAddress.append(","); } this.bccAddress.append(bcc); } /** * 添加附件,可以添加多个附件 * @param attachBean */ public void addAttach(AttachBean attachBean) { this.attachList.add(attachBean); } /** * 获取所有附件 * @return */ public List<AttachBean> getAttachs() { return this.attachList; } }
2、AttachBean.java
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.xie.util; import java.io.File; /** * 发送附件用 */ public class AttachBean { private String cid; private File file; private String fileName; public AttachBean() { } public AttachBean(File file, String fileName) { super(); this.file = file; this.fileName = fileName; } public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
3、MailUtils.java
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.xie.util; import java.io.IOException; import java.util.List; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; /** * 邮件工具类 */ public class MailUtils { public static Session createSession(String host, final String username, final String password, String smtpPort) { Properties prop = new Properties(); prop.setProperty("mail.host", host); // 指定主机 prop.setProperty("mail.smtp.auth", "true"); // 指定验证为true // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, // 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助, // QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看) if(!"".equals(smtpPort) && smtpPort!=null){ prop.setProperty("mail.smtp.port", smtpPort); prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); prop.setProperty("mail.smtp.socketFactory.fallback", "false"); prop.setProperty("mail.smtp.socketFactory.port", smtpPort); } // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }; // 获取session对象 return Session.getInstance(prop, auth); } /** * 发送指定的邮件 * * @param mail */ public static void send(Session session, final Mail mail) throws MessagingException, IOException { MimeMessage msg = new MimeMessage(session);// 创建邮件对象 msg.setFrom(new InternetAddress(mail.getFrom()));// 设置发件人 msg.addRecipients(RecipientType.TO, mail.getToAddress());// 设置收件人 // 设置抄送 String cc = mail.getCcAddress(); if (!cc.isEmpty()) { msg.addRecipients(RecipientType.CC, cc); } // 设置暗送 String bcc = mail.getBccAddress(); if (!bcc.isEmpty()) { msg.addRecipients(RecipientType.BCC, bcc); } msg.setSubject(mail.getSubject());// 设置主题 MimeMultipart parts = new MimeMultipart();// 创建部件集对象 MimeBodyPart part = new MimeBodyPart();// 创建一个部件 part.setContent(mail.getContent(), "text/html;charset=utf-8");// 设置邮件文本内容 parts.addBodyPart(part);// 把部件添加到部件集中 /// // 添加附件 List<AttachBean> attachBeanList = mail.getAttachs();// 获取所有附件 if (attachBeanList != null) { for (AttachBean attach : attachBeanList) { MimeBodyPart attachPart = new MimeBodyPart();// 创建一个部件 attachPart.attachFile(attach.getFile());// 设置附件文件 attachPart.setFileName(MimeUtility.encodeText(attach .getFileName()));// 设置附件文件名 String cid = attach.getCid(); if(cid != null) { attachPart.setContentID(cid); } parts.addBodyPart(attachPart); } } msg.setContent(parts);// 给邮件设置内容 Transport.send(msg);// 发邮件 } }
4、MailUtilsTest.java测试类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.xie.main; import java.io.File; import java.io.IOException; import javax.mail.MessagingException; import javax.mail.Session; import org.junit.Test; import com.xie.util.AttachBean; import com.xie.util.Mail; import com.xie.util.MailUtils; /** * @filename MailUtilsTest.java * @author xiehongwei * @date 2017-7-19 下午4:54:32 * */ public class MailUtilsTest { @Test public void sendMail() throws MessagingException, IOException{ /** * 1.登录邮件服务器 * MailUtils.createSession(服务器地址,登录名,密码,端口); * 服务器地址: 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com * (网易163邮箱的 SMTP 服务器地址为: smtp.163.com) * 登录名: qq号或者其他邮箱账号,不需要@后面的部分 * 密码: 一般为授权码(PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码,并非我们邮箱登录密码, * 开启SMTP服务的时候会给我们一个授权码的) * 端口: SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, * 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助, * QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看) * * 2.创建邮件对象 * from: 发件人(邮箱: xxx@qq.com、xxx@163.com) * to: 收件人(邮箱: xxx@qq.com、xxx@163.com) * subject: 主题(随意) * content: 正文(随意) * * 3.发邮件 * 需要第1步得到的session 以及 第2步的邮件对象 */ // Session session=MailUtils.createSession("smtp.qq.com", "aaa", "pwd", "465"); // Mail mail=new Mail("aaa@qq.com","bbb@qq.com","测试邮件标题啊","来自qq发送的邮件内容啊"); Session session=MailUtils.createSession("smtp.163.com", "xxx", "pwd", ""); Mail mail=new Mail("xxx@163.com","aaa@qq.com,bbb@qq.com","测试邮件标题啊","来自163发送的邮件内容啊"); // 添加附件 AttachBean attachBean1 = new AttachBean(new File("src/com/xie/file/测试word.doc"), "测试word.doc"); AttachBean attachBean2 = new AttachBean(new File("src/com/xie/file/atx830.png"), "atx830.png"); mail.addAttach(attachBean1); mail.addAttach(attachBean2); //发送 MailUtils.send(session, mail); } }