邮箱相关协议介绍:

参考博客:https://blog.csdn.net/suhuaiqiang_janlay/article/details/78765613

简单邮件发送案例:

import org.junit.Test;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;public class MailTest {@Testpublic void sendMail() throws Exception{//Session的配置Properties prop = new Properties();prop.setProperty("mail.debug","true");//开启邮箱debug过程prop.setProperty("mail.host", "smtp.qq.com");//邮箱域名prop.setProperty("mail.smtp.port","25");//端口prop.setProperty("mail.transport.protocol", "smtp");//邮箱协议prop.setProperty("mail.smtp.auth", "true");//邮箱认证状态//获取sessionSession session = Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("邮箱账号","邮箱密码 是开启smtp时候的授权码");}});//创建message对象Message message = new MimeMessage(session);//指明邮件的发件人 跟上面邮箱认证账号保持一致message.setFrom(new InternetAddress("邮箱账号"));//指明邮件的收件人 多个收件人逗号隔开message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("收件人"));//邮件的标题message.setSubject("测试发邮件标题");//邮件的文本内容message.setContent("邮件内容", "text/html;charset=UTF-8");//设置信件头的发送日期message.setSentDate(new Date());//发送邮件 该方法内部关闭了资源,不用手动关闭了Transport.send(message);}
}

参考一些博客,整理写了一个MailUtil

mail.properties

# 是否开启debug调试
mail.debug=false
# 发送服务器是否需要身份验证
mail.smtp.auth=true
# 邮件发送端口
mail.smtp.port=25
# 邮件服务器主机名
mail.host=
# 发送邮件协议名称
mail.transport.protocol=smtp# 发送邮件的昵称
mail.nick=测试昵称# 发送邮件用户名
mail.user=# 发送邮件邮箱密码此处是授权码
mail.pass=# 发送邮件发件人
mail.from=# 发送邮件收件人
mail.to=

MailConfig实体

/*** 邮箱配置信息对象* @author fdh*/
public class EmailConfig {/**是否开启debug调试*/private String debug;/**发送服务器是否需要身份验证*/private String auth;/**发送邮件端口*/private String port;/**邮件服务器主机名*/private String host;/**发送邮件协议名称*/private String protocol;/**发送邮件用户名*/private String user;/**发送邮件邮箱密码*/private String pass;/**发送邮件的发件人昵称*/private String nick;/**发送邮件发件人*/private String from;/**发送邮件的收件人*/private String to;public String getDebug() {return debug;}public void setDebug(String debug) {this.debug = debug;}public String getAuth() {return auth;}public void setAuth(String auth) {this.auth = auth;}public String getPort() {return port;}public void setPort(String port) {this.port = port;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}public String getProtocol() {return protocol;}public void setProtocol(String protocol) {this.protocol = protocol;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}public String getNick() {return nick;}public void setNick(String nick) {this.nick = nick;}public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}
}

MailUtil

import com.dongao.core.base.EmailConfig;
import org.apache.commons.lang3.StringUtils;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import javax.mail.Message.RecipientType;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.List;
import java.util.Properties;/*** Mail发送工具类** 发件人只能从配置文件中设置* smtp协议的方式发送邮件** RecipientType类的枚举值,分别有"TO"、"CC"以及"BCC",分别代表"收件"、"抄送"以及"暗送"** @author fdh*/
public class EmailUtil {/**创建session的配置*/private static Properties sessionProp;/**从配置文件中读取到的配置对象*/private static EmailConfig email;private static Session session;//邮箱设置的几个相关常量private static final String MAIL_DEBUG = "mail.debug";private static final String MAIL_SMTP_AUTH = "mail.smtp.auth";private static final String MAIL_SMTP_PORT = "mail.smtp.port";private static final String MAIL_HOST = "mail.host";private static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol";/*** Session.getInstance();获取配置文件中读取 mail.user 和 mail.pass* Session.getDefaultInstance();自己实现认证*/private static final String MAIL_USER = "mail.user";private static final String MAIL_PASS = "mail.pass";static {InputStream is = EmailUtil.class.getClassLoader().getResourceAsStream("config/mail/mail.properties");InputStreamReader isr = null;try {isr = new InputStreamReader(is, "UTF-8");sessionProp = new Properties();Properties prop = new Properties();email = new EmailConfig();prop.load(isr);//设置邮箱debug模式String debug = prop.getProperty("mail.debug");if(StringUtils.isNotBlank(debug)){email.setDebug(debug.trim());}//设置邮箱身份验证String auth = prop.getProperty("mail.smtp.auth");if(StringUtils.isNotBlank(auth)){email.setAuth(auth.trim());}//设置邮箱发送端口String port = prop.getProperty("mail.smtp.port");if(StringUtils.isNotBlank(auth)){email.setPort(port.trim());}//设置邮件服务器主机名String host = prop.getProperty("mail.host");if(StringUtils.isNotBlank(host)){email.setHost(host.trim());}//设置邮件协议名称String protocol = prop.getProperty("mail.transport.protocol");if(StringUtils.isNotBlank(protocol)){email.setProtocol(protocol.trim());}//设置邮箱的用户名String user = prop.getProperty("mail.user");if(StringUtils.isNotBlank(user)){email.setUser(user.trim());}//设置邮箱的密码String pass = prop.getProperty("mail.pass");if(StringUtils.isNotBlank(pass)){email.setPass(pass.trim());}//设置邮箱发件人昵称String nick = prop.getProperty("mail.nick");if(StringUtils.isNotBlank(nick)){email.setNick(nick.trim());}//设置发送邮件的发送人String from = prop.getProperty("mail.from");if(StringUtils.isNotBlank(from)){email.setFrom(from.trim());}//设置发送邮件的收件人String to = prop.getProperty("mail.to");if(StringUtils.isNotBlank(to)){email.setTo(to.trim());}sessionProp.setProperty(MAIL_DEBUG,email.getDebug());sessionProp.setProperty(MAIL_SMTP_AUTH,email.getAuth());sessionProp.setProperty(MAIL_HOST, email.getHost());sessionProp.setProperty(MAIL_SMTP_PORT,email.getPort());sessionProp.setProperty(MAIL_TRANSPORT_PROTOCOL,email.getProtocol());//sessionProp.setProperty(MAIL_USER,email.getUser());//sessionProp.setProperty(MAIL_PASS, email.getPass());//创建session同时认证邮箱 密码是授权码不是邮箱的密码,类比于第三方客户端登录时候用的密码session = Session.getDefaultInstance(sessionProp, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(email.getUser(),email.getPass());}});} catch (Exception e) {throw new RuntimeException("邮箱初始化失败:",e);}}/*** 校验邮件* (校验标题、校验内容非空性)** @param subject 邮件标题* @param content 邮件正文* @param fileList 邮件附件* void*/private static void checkEmail(String subject, String content, List<File> fileList){if(StringUtils.isEmpty(subject)){throw new RuntimeException("邮件标题不能为空!");}if(StringUtils.isEmpty(content) && (fileList==null || fileList.size()==0)){throw new RuntimeException("邮件内容不能为空!");}}/*** 构建Message对象** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param fileList 附件* @return 邮箱对象* @throws Exception*/private static Message createMessage(String subject, String content, String to, String nick, List<File> fileList){//校验标题正文checkEmail(subject, content, fileList);//邮件内容Message msg = new MimeMessage(session);try {Multipart mp = createMultipart(content, fileList);if(StringUtils.isEmpty(nick)){msg.setFrom(new InternetAddress(email.getFrom()));}else{//编码解决中文乱码String nickName = MimeUtility.encodeText(nick,"UTF-8",null);msg.setFrom(new InternetAddress(nickName+" <"+email.getFrom()+">"));}msg.setSubject(subject);msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));//Multipart加入到信件msg.setContent(mp);//设置信件头的发送日期msg.setSentDate(new Date());} catch (Exception e) {throw new RuntimeException("构建Message对象异常",e);}return msg;}/*** 构建附有抄送、暗送Message对象** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param cc 抄送人(多个抄送人用英文逗号隔开)* @param bcc 暗送人(多个暗送人用英文逗号隔开)* @param fileList 附件* @return Message对象*/private static Message createMessageCcAndBcc(String subject, String content, String to, String nick, String cc, String bcc, List<File> fileList){Message msg = createMessage(subject, content, to, nick, fileList);try {if(StringUtils.isNotBlank(cc)){msg.setRecipients(RecipientType.CC, InternetAddress.parse(cc));}if(StringUtils.isNotBlank(bcc)){msg.setRecipients(RecipientType.BCC, InternetAddress.parse(bcc));}} catch (Exception e) {throw new RuntimeException("构建附有抄送、暗送Message对象异常:",e);}return msg;}/*** 构建附件对象** @param content 邮件正文内容* @param fileList 附件* @return 邮件内容对象* Multipart*/private static Multipart createMultipart(String content, List<File> fileList){//邮件内容Multipart mp = new MimeMultipart();MimeBodyPart mbp = new MimeBodyPart();try {mbp.setContent(content, "text/html;charset=UTF-8");mp.addBodyPart(mbp);if(fileList!=null && fileList.size()>0){//附件FileDataSource fds;for(File file : fileList){mbp=new MimeBodyPart();//得到数据源fds = new FileDataSource(file);//得到附件本身并至入BodyPartmbp.setDataHandler(new DataHandler(fds));//设置文件名到BodyPartmbp.setFileName(MimeUtility.encodeText(file.getName(),"UTF-8",null));mp.addBodyPart(mbp);}}} catch (Exception e) {throw new RuntimeException("构建附件对象异常",e);}return mp;}/*** 通用发送邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)*/public static void sendEmail(String subject, String content, String to, String nick, String cc, String bcc, List<File> fileList){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessageCcAndBcc(subject, content, to, nick, cc, bcc, fileList);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("通用发送邮件异常:",e);}}/*** 发送邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)*/public static void sendEmail(String subject,String content,String to){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessage(subject, content, to, email.getNick(),null);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("发送邮件异常:",e);}}/*** 发送带有昵称的邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param nick 发件人昵称 (优先级 入参 > 配置文件)*/public static void sendEmailWithNick(String subject,String content,String to,String nick){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessage(subject, content, to, nick,null);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("发送带有昵称的邮件异常:",e);}}/*** 发送带有附件的邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param fileList 附件*/public static void sendEmailWithAttachment(String subject,String content,String to,List<File> fileList){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessage(subject, content, to,email.getNick(), fileList);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("发送带有附件的邮件异常:",e);}}/*** 发送带有抄送人的邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param cc 抄送人(多个收件人用英文逗号隔开)* @param fileList 附件*/public static void sendEmailWithCc(String subject, String content, String to, String cc, List<File> fileList){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessageCcAndBcc(subject, content, to, email.getNick(), cc, null, fileList);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("发送带有昵称和附件的邮件异常:",e);}}/*** 发送带有暗送人的邮件** @param subject 邮件标题* @param content 邮件内容* @param to 收件人(多个收件人用英文逗号隔开)* @param bcc 暗送人(多个收件人用英文逗号隔开)* @param fileList 附件*/public static void sendEmailWithBcc(String subject, String content, String to, String bcc, List<File> fileList){if(StringUtils.isEmpty(to)){to = email.getTo();}Message msg = createMessageCcAndBcc(subject, content, to, email.getNick(), null, bcc, fileList);try {Transport.send(msg);} catch (MessagingException e) {throw new RuntimeException("发送带有暗送人的邮件异常:",e);}}
}

Java Mail(发邮件)相关推荐

  1. 关于java mail 发邮件的问题总结(转)

    今天项目中有需要用到java mail发送邮件的功能,在网上找到相关代码,代码如下: import java.io.IOException; import java.util.Properties; ...

  2. Spring Java Mail发邮件

    今天测试了下spring的发邮件的功能 下上代码 在说遇到的问题 首先在applicationContext.xml配置邮件信息 <bean id="mailSender" ...

  3. 关于使用Java Mail 发邮件,连接超时问题

    异常信息 send mail err:Mail server connection failed; nested exception is com.sun.mail.util.MailConnectE ...

  4. java mail 收发邮件

    java mail 收发邮件 1.发件 2.收件 1.发件 package base.util; /* Some SMTP servers require a username and passwor ...

  5. 如何用java实现发邮件功能

    如何用java实现发邮件功能 前言 前置条件 邮件服务器 电子邮件协议 JavaMail 实现 参考 前言 今天突然心学来潮,想用Java来实现发邮件的功能,想想这个在实际中还是蛮有用的,比如我举几个 ...

  6. Java实现发邮件功能---网易邮箱

    目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...

  7. java velocity 邮件_邮件集成java mail + 读取邮件模板

    项目做异地登录提醒功能,通过java mail发送邮件.读取邮件模板sendMail.vm文件. 1.邮件发送 import java.io.StringWriter; import java.uti ...

  8. 邮件集成java mail + 读取邮件模板

    项目做异地登录提醒功能,通过java mail发送邮件.读取邮件模板sendMail.vm文件. 1.邮件发送 import java.io.StringWriter; import java.uti ...

  9. 用Java自动发邮件

    1.新建一个Java工程,SendMail. 2.引入三个jar. 在工程中新建文件夹lib,拷入三个jar,在properties->java build path->librarys导 ...

最新文章

  1. Python设计模式-策略模式
  2. 看看高手做的ARM开发板
  3. 2345王牌浏览器网页加载慢怎么办 网页加载慢解决
  4. 数据科学入门与实战:Matplotlib绘图Series
  5. C# ComboBox自动完成功能的例子
  6. maven命令mvn package指定jar包名称
  7. Antd Mobile Design输入框组件InputItem错误显示方式封装
  8. python分数序列求和_Python练习题 019:求分数序列之和
  9. 【【★★★★★★CSS兼容IE6,IE7,FF的技巧 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★】】...
  10. dm连接mysql_DM数据库JDBC连接
  11. Windows任务管理器中的内存
  12. 三自由度机器人轨迹规划(两旋转+移动)
  13. “我的恩典是够你用的”(哥林多后书十二章9节)
  14. 小猿圈IT自学分享-自学编程需要克服的困难
  15. ctf-攻防世界-crypto:幂数加密
  16. 深度学习CNN模型预测电影评论中的情感问题
  17. 2018推荐的android手机,2018年7月份Android手机性价比排行榜
  18. Linux添加SSH Key到Github账户
  19. Android Studio底部导航
  20. SSL握手过程实例抓包分析

热门文章

  1. 下载安装Java运行环境
  2. 京东商品关联版式,如何设置手机和电脑都显示?
  3. 如何在Linux下安装chrome浏览器
  4. 【navicat】定时清除数据库备份,并保留最近7天
  5. 解决图片按顺序加载问题
  6. 【资源分享】如何画出论文中漂亮的图?
  7. InputStream和FileInputStream
  8. android单元测试教程,Android单元测试-Junit
  9. 1D卷积网络HAR(人体活动识别)实践
  10. 决策树、装袋、提升和随机森林的对比理解