一、前言

参考博客: 

http://blog.csdn.net/xietansheng/article/details/51722660

http://www.cnblogs.com/HigginCui/p/5764509.html

关于JavaMail实现带附件的收发邮件网上的例子很多,自己兴趣来了,自己也动手尝试了一番。

其中问题大部分在代码注释中,这里也就不过多描述了,直接上代码作为记录,方便以后查阅。

二、工程目录

三、工程代码

  1、Mail.java

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

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

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测试类

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); } }

最新文章

  1. 5天揭秘js高级技术-第一天
  2. ubuntu 14.04 下通过apt-get 安装jdk
  3. 零值初始化&amp;字符串常数作为函数模板参数
  4. 工作当中实际运用(1)——tab选项卡
  5. tomcat通过socket连接MySQL,不再占用服务端口【linux】
  6. python3学习笔记目录
  7. SQLServer User and Login Tips
  8. Asp.Net_Web身份验证
  9. 【转】MySQL GRANT REVOKE用法
  10. SQL Server2005使用CTE实现递归
  11. slf4j+log4j的使用
  12. 小程序 wx.getRecorderManager 录音 to 语音识别
  13. 微信小程序 登录流程规范解读
  14. 【Thinkphp 5】 如何引入extend拓展文件
  15. 关于 &quot;java中常量定义在interface中好还是定义在class中好&quot; 的一些思考
  16. CF 219D 树形DP
  17. 导入大数据量sql时候超时的问题
  18. 关于windows内存的一些简单看法
  19. &lt;script type=&quot;text/x-template&quot;&gt; 模板
  20. Docker For Mac没有docker0网桥

热门文章

  1. 安装多个jdk环境7、8、11等,并且切换默认使用版本
  2. redis分布式锁在springboot中的实现
  3. webpack 之loader
  4. markdown文本编辑学习笔记2
  5. jdk8-》allMatch、anyMatch、max、min函数
  6. error C2825: &#39;_Iter&#39;: 当后面跟“::”时必须为类或命名空间 -- 原因可能是参数错误或者自定义函数名和库函数名冲突
  7. cookie 与 session区别
  8. Oracle 11g安装 —— Oracle Database 11g Release2 for Windows(x64)
  9. centos 7安装jdk8
  10. JavaScript对象之get/set方法