2019独角兽企业重金招聘Python工程师标准>>>

昨天正好要用邮件发送的功能,顺便看了下具体的实现,网上的版本很多,下面是我自己觉得高可用的一个版本,非常好用,并进行总结,优化了,大家可以拿来直接使用哦。

Java使用时添加相应的lib包:mail-1.4.7.jar,其他版本的也行。总的来说,需要实现三个类(但是,为了代码结构的严谨性,我们还是写完整些吧),大家可以放在一个package包下,方便管理和使用。

好了,闲话不多说,见代码吧。

(一)邮件内容实体类(大部分版本都差不多,有的参数未用到)

package com.yoki.util.mail;import java.util.Properties;public class MailSenderInfo
{// 发送邮件的服务器的IP和端口private String mailServerHost;private String mailServerPort = "25";// 邮件发送者的地址private String fromAddress;// 邮件接收者的地址private String toAddress;// 登陆邮件发送服务器的用户名和密码private String userName;private String password;// 是否需要身份验证private boolean validate = false;// 邮件主题private String subject;// 邮件的文本内容private String content;// 邮件附件的文件名private String[] attachFileNames;/**   * 获得邮件会话属性   */public Properties getProperties(){Properties p = new Properties();p.put("mail.smtp.host", this.mailServerHost);p.put("mail.smtp.port", this.mailServerPort);p.put("mail.smtp.auth", (this.validate) ? "true" : "false");return p; }public String getMailServerHost() {return this.mailServerHost; }public void setMailServerHost(String mailServerHost) {this.mailServerHost = mailServerHost; }public String getMailServerPort() {return this.mailServerPort; }public void setMailServerPort(String mailServerPort) {this.mailServerPort = mailServerPort; }public boolean isValidate() {return this.validate; }public void setValidate(boolean validate) {this.validate = validate; }public String[] getAttachFileNames() {return this.attachFileNames; }public void setAttachFileNames(String[] fileNames) {this.attachFileNames = fileNames; }public String getFromAddress() {return this.fromAddress; }public void setFromAddress(String fromAddress) {this.fromAddress = fromAddress; }public String getPassword() {return this.password; }public void setPassword(String password) {this.password = password; }public String getToAddress() {return this.toAddress; }public void setToAddress(String toAddress) {this.toAddress = toAddress; }public String getUserName() {return this.userName; }public void setUserName(String userName) {this.userName = userName; }public String getSubject() {return this.subject; }public void setSubject(String subject) {this.subject = subject; }public String getContent() {return this.content; }public void setContent(String textContent) {this.content = textContent;}
}

(二)发送邮件时的身份验证器

package com.yoki.util.mail;import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;public class MailAuthenticator extends Authenticator {/** 用户账号 */private String userName = null;/** 用户口令 */private String password = null;/*** @param userName* @param password*/public MailAuthenticator(String userName, String password) {this.userName = userName;this.password = password;}/*** 身份验证* @return*/protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(userName, password);}}

(三)邮件发送器

package com.yoki.util.mail;import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
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 MailSender
{/*** 以文本格式发送邮件* @param mailInfo 待发送邮件的信息*/public boolean sendTextMail(MailSenderInfo mailInfo)throws Exception{// 判断是否需要身份认证MyAuthenticator authenticator = null;Properties props = mailInfo.getProperties();if (mailInfo.isValidate()){// 如果需要身份认证,则创建一个密码验证器authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession sendMailSession = Session.getInstance(props, authenticator);// 根据session创建一个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from = new InternetAddress(mailInfo.getFromAddress());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(mailInfo.getToAddress());mailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();MimeBodyPart mbpContent = new MimeBodyPart();// 设置邮件消息的主要内容String mailContent = mailInfo.getContent();mbpContent.setText(mailContent);mainPart.addBodyPart(mbpContent);// 添加附件if (mailInfo.getAttachFileNames().length != 0){String[] arrayOfString;int j = (arrayOfString = mailInfo.getAttachFileNames()).length; for (int i = 0; i < j; ++i) { String attachFile = arrayOfString[i];MimeBodyPart mbpart = new MimeBodyPart();FileDataSource fds = new FileDataSource(attachFile); // 得到数据源mbpart.setDataHandler(new DataHandler(fds));   // 得到附件本身并放入BodyPartmbpart.setFileName(MimeUtility.encodeText(fds.getName()));  // 得到文件名并编码(防止中文文件名乱码)同样放入BodyPartmainPart.addBodyPart(mbpart);}}mailMessage.setContent(mainPart);// 发送邮件Transport.send(mailMessage);logBefore(this.logger, "发送成功!");return true;}/*** 以HTML格式发送邮件* @param mailInfo 待发送邮件的信息*/public boolean sendHtmlMail(MailSenderInfo mailInfo)throws Exception{// 判断是否需要身份认证MyAuthenticator authenticator = null;Properties pro = mailInfo.getProperties();// 如果需要身份认证,则创建一个密码验证器if (mailInfo.isValidate()) {authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession sendMailSession = Session.getDefaultInstance(pro, authenticator);// 根据session创建一个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from = new InternetAddress(mailInfo.getFromAddress());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(mailInfo.getToAddress());// Message.RecipientType.TO属性表示接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();// 创建一个包含HTML内容的MimeBodyPartBodyPart html = new MimeBodyPart();// 设置HTML内容html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");mainPart.addBodyPart(html);// 添加附件if (mailInfo.getAttachFileNames().length != 0) {String[] arrayOfString;int j = (arrayOfString = mailInfo.getAttachFileNames()).length; for (int i = 0; i < j; ++i) { String attachFile = arrayOfString[i];html = new MimeBodyPart();FileDataSource fds = new FileDataSource(attachFile); // 得到数据源html.setDataHandler(new DataHandler(fds));   // 得到附件本身并放入BodyParthtml.setFileName(MimeUtility.encodeText(fds.getName()));  // 得到文件名并编码(防止中文文件名乱码)同样放入BodyPartmainPart.addBodyPart(html);}}// 将MimeMultipart对象设置为邮件内容mailMessage.setContent(mainPart);// 发送邮件Transport.send(mailMessage);logBefore(this.logger, "发送成功!");return true;}/***@param SMTP 邮件服务器*@param PORT 端口*@param EMAIL 发送方邮箱账号*@param PAW 发送方邮箱密码*@param toEMAIL 接收方邮箱账号*@param TITLE  标题*@param CONTENT 内容*@param FJ 附件*@param TYPE  1:文本格式;2:HTML格式*/public static void sendEmail(String SMTP, String PORT, String EMAIL, String PAW, String toEMAIL, String TITLE, String CONTENT, String[] FJ, String TYPE)throws Exception{// 设置邮件信息MailSenderInfo mailInfo = new MailSenderInfo();mailInfo.setMailServerHost(SMTP);mailInfo.setMailServerPort(PORT);mailInfo.setValidate(true);mailInfo.setUserName(EMAIL);mailInfo.setPassword(PAW);mailInfo.setFromAddress(EMAIL);mailInfo.setToAddress(toEMAIL);mailInfo.setSubject(TITLE);mailInfo.setContent(CONTENT);mailInfo.setAttachFileNames(FJ);// 发送邮件MailSender sms = new MailSender();if ("1".equals(TYPE))sms.sendTextMail(mailInfo);elsesms.sendHtmlMail(mailInfo);}public static void main(String[] args){MailSenderInfo mailInfo = new MailSenderInfo();mailInfo.setMailServerHost("smtp.qq.com");mailInfo.setMailServerPort("25");mailInfo.setValidate(true);mailInfo.setUserName("1@qq.com");mailInfo.setPassword("123");mailInfo.setFromAddress("1@qq.com");mailInfo.setToAddress("3@qq.com");mailInfo.setSubject("设置邮箱标题");mailInfo.setContent("设置邮箱内容");MailSender sms = new MailSender();// sms.sendTextMail(mailInfo);//发送文体格式// sms.sendHtmlMail(mailInfo);//发送HTML格式}
}

(四)本来可以直接按照上面main中的形式进行邮件的发送,但是如果在你的代码中多处都使用了邮件发送,那么这样写是不是太过繁杂了,一点都不简洁。为了方便管理,减少代码的修改,首先,我们需要新建一个配置文件,如:EMAIL.txt,目录可以是WebRoot下,内容:

发件服务器地址,yoki,端口,yoki,发送邮箱,yoki,密码

示例:

smtp.qiye.163.com,yoki,25,yoki,1@hh.com,yoki,123

其中,yoki只是一个分割字符串,后面读取文件时用到,大家自行定义。关于发件服务器地址怎么查看,这个我用的是Foxmail客户端,其他的自行百度,如下所示:

(五)有了EMAIL配置文件后,最好写个类用来存放文件路径,方便直接使用

package com.yoki.util;public class MyConst{//邮箱服务器配置文件路径public static final String EMAIL = "config/EMAIL.txt";
}

(六)完成以上操作后,只需新建一个调用发送邮件的类即可,这里的方法包括:统一的发送邮件的格式;文本文件读取;邮箱验证,如下所示:

package com.yoki.util;import java.util.Map;
import java.util.HashMap;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import com.yoki.util.MyConst;
import com.yoki.util.mail.MailSender;public class Common{/***EMAIL 对方邮箱,多个用;分隔开*TITLE 标题*CONTENT 内容*TYPE 1=纯文本 2=带标签*FJ 附件*/public static Map<String, Object> sendEmail(String EMAIL, String TITLE, String CONTENT, String[] FJ, String TYPE) throws Exception {Map map = new HashMap();String msg = "ok";  // 发送状态String strEMAIL = readTxtFile(MyConst.EMAIL);  // 读取邮件配置if ((strEMAIL != null) && (!("".equals(strEMAIL)))) {String[] strEM = strEMAIL.split(",yoki,");if (strEM.length == 4) {EMAIL = EMAIL.replaceAll(";", ";");EMAIL = EMAIL.replaceAll(" ", "");String[] arrTITLE = EMAIL.split(";");zcount = arrTITLE.length;try {for (int i = 0; i < arrTITLE.length; ++i) {if (checkEmail(arrTITLE[i])) { // 邮箱格式不对就跳过MailSender.sendEmail(strEM[0], strEM[1], strEM[2], strEM[3], arrTITLE[i], TITLE, CONTENT, FJ, TYPE); // 调用发送邮件函数++count;}}msg = "ok";} catch (Exception e) {logger.error(e.toString(), e);}} else {msg = "error";}} else {msg = "error";}map.put("msg", msg);return map;}/***读取txt的单行内容*fileP 文件路径*/public static String readTxtFile(String fileP){try{String filePath = String.valueOf(Thread.currentThread().getContextClassLoader().getResource("")) + "../../";filePath = filePath.replaceAll("file:/", "");filePath = filePath.replaceAll("%20", " ");filePath = filePath.trim() + fileP.trim();if (filePath.indexOf(":") != 1)filePath = File.separator + filePath;String encoding = "utf-8";File file = new File(filePath);if ((file.isFile()) && (file.exists())) {  // 判断文件是否存在InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);  // 考虑到编码格式BufferedReader bufferedReader = new BufferedReader(read);String lineTxt = null;while ((lineTxt = bufferedReader.readLine()) != null){return lineTxt;}read.close();}elseSystem.out.println("找不到指定的文件,查看此路径是否正确:" + filePath);}catch (Exception e){System.out.println("读取文件内容出错");}return "";}/***验证邮箱*/public static boolean checkEmail(String email){boolean flag = false;try{String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";Pattern regex = Pattern.compile(check);Matcher matcher = regex.matcher(email);flag = matcher.matches();}catch(Exception e){flag = false;}return flag;}
}

(七)好了,所有的准备工作都完成了,下面就是调用了,让我们看看如何方便的调用吧

System.out.println("--------  开始发送邮件任务  ---------");
String[] fj = {"D:\\doc\\模板1.xls"};
Common.sendEmail("123@qq.com","附件发送测试","本次发送的是测试文件,请接收!",fj,"2");
System.out.println("--------  结束发送邮件任务  ---------");

这里,附件可以有多个,用逗号分开即可。

以上就是一个超级方便、简洁的邮件发送,是不是很简单啊,调用只要两行代码就搞定了,哈哈 O(∩_∩)O。

转载于:https://my.oschina.net/u/3747963/blog/1786247

Java邮件发送:带附件 or 不带附件 is nothing相关推荐

  1. java自带发送邮件,成都汇智动力-java邮件发送只需要java自带的mailjar

    原标题:成都汇智动力-java邮件发送只需要java自带的mailjar java邮件发送只需要java自带的mailjar Email email = emailService.queryEmail ...

  2. Java邮件发送 附件名变.dat问题

    问题: 发送带中文邮件名时收到的文件与发送的文件不同 例如: 发送"Java邮件发送附件名变.dat问题.xlsx", 收到的却是"ATT_000781.dat" ...

  3. java编写两邮件传输,JAVA邮件发送(文字+图片+附件)【源码】

    介绍: 电子邮件协议 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP.其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMT ...

  4. Java邮件发送QQ邮箱带附件

    添加依赖 <!-- https://mvnrepository.com/artifact/javax.mail/mail --><dependency><groupId& ...

  5. java 邮件发送文字,图片,和文件

    获取QQ邮箱权限16位授权码 进入QQ邮箱进入设置 进入账户 开启POP3/SMTP 服务 开启之后会生成16位权限码 这个需要记好,前期工作准备完毕,直接进入代码阶段 发送邮件 package at ...

  6. java 邮件发送_Java 基于JavaMail的邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  7. 内网java发送邮件_基于JavaMail的Java邮件发送:简单邮件发送

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  8. JAVA 邮件发送工具类

    1.封装邮件接收地址MODEL和邮件信息MODEL package com.sicdt.jnzxgzc.common.mail.model;import java.io.Serializable; / ...

  9. java邮件发送api文件,JavaMail API 发送一个HTML电子邮件

    下面是一个例子,从你的机器发送HTML格式电子邮件.这里通过使用JangoSMPT服务器的邮件发送到我们的目标电子邮件地址. 这个例子非常相似,发送简单的电子邮件,除非,这里我们使用的是使用setCo ...

  10. java发送邮件354_基于SMTP的JAVA邮件发送程序

    这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的. 本文分两部分,第一部分是SMTP命令介绍(这个 ...

最新文章

  1. Duwamish配置持久化学习笔记
  2. 走上这条路,也许是缘份
  3. python fortran混合编程_python调用fortran模块
  4. spring的定时任务schedule
  5. 上海应用技术大学计算机专业分数线,上海应用技术大学2016年上海市各专业录取分数线...
  6. 《阿里巴巴中国总裁叶朋:B2B从1.0向2.0的升级》阅读整理
  7. Day6 数据清洗(2)
  8. 【ArcGIS|空间分析】在范围内平均生成点 | 面要素内均匀且规定个数来均匀生成点
  9. 恒生电子:收购Summit中国区业务
  10. AltiumDesigner(三):PCB导出Gerber文件及各个Gerber文件说明
  11. H5页面原生gps 定位获取经纬度
  12. Factory IO v2.5.2 Crack by Xacker
  13. 谷露猎头系统3.0新功能:Mapping模块,助你轻松画出动态组织架构图
  14. 交换机与路由器与猫的区别与联系
  15. 用“掩码位图“,制作类似.png的“透明图片“①
  16. CentOS_anydesk
  17. Linux运维工程师笔试题系列6(30题)
  18. 细思极恐!使用 AI 控制你的浏览器
  19. UE4 通过按键升降电梯
  20. 杨家海 清华大学 研究员,博导

热门文章

  1. 二维码资料 目录 1. 二维码QR Code 1 2. 发展历程 1 3. 特点 2 4. 存储 3 5. 分类 3 5.1.1. 按原理分 3 6. 区别 与条码区别 5 7. 什么是码制?
  2. 远程服务器返回错误 (411) 所需的长度。
  3. paip.验证码识别---除噪算法-中值滤波
  4. 阿里云祝顺民:云网络的十年“修路”历程
  5. 从原子操作走向模板部署,详解云上资源自动化部署新模式
  6. 开放、创新、合作,共赢多样性计算新时代
  7. 机器学习笔记(二十九):决策树、信息熵
  8. 【TSP】基于matlab遗传算法求解31城市旅行商问题【含Matlab源码 1150期】
  9. 【优化求解】基于matalb遗传算法求解岛屿物资补给优化问题【含Matlab源码 172期】
  10. 鸿蒙升级最佳时间,鸿蒙升级时间确定,17款华为优先,荣耀或成遗珠!