java实现extended smtp_java实现发送邮件(SMTP)

1.pom引入包

javax.mail

mail

1.4.7

2.Email实体类

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.experimental.Accessors;

import java.util.List;

import java.util.Map;

/**

* @ClassName: Email

* @author: mxy

* @Description: Email的实体类

*/

@Data

@EqualsAndHashCode

@Accessors(chain = true)

public class Email {

/**

* 接收人列表 元素如"10*****787@qq.com"

*/

private List toList;

/**

* (可不填)抄送人列表 元素如"10*****787@qq.com"

*/

private List ccList;

/**

* (可不填)密送人列表 元素如"10*****787@qq.com"

*/

private List bccList;

/**

* (可不填)发送者昵称

*/

private String fromName;

/**

* 发送人(邮箱账号)

*/

private String from;

/**

* 密码(腾讯邮箱为16位授权码)

*/

private String password;

/**

* 邮件主机地址

*/

private String host;

/**

* (可不填)发信端口 默认465

*/

private String port="465";

/**

* 正文

*/

private String text;

/**

* 主题

*/

private String subject;

/**

* (可不填)附件

*/

private List fileList;

/**

* (可不填)要插入的图片 正文需写成html语言,如

* String text = "

HTML+附件+内嵌图片的邮件测试!!!

"

* +"点击跳转"

* +"

LOGO图标

"

* +"%5C%22cid:logo%5C%22";

* Map imagesMap = new HashMap<>();

* imagesMap.put("logo","D:\\asf_logo_wide.gif");

*/

private Map imagesMap;

3.SendEmailUtils类(SMTP)

将email中的所需属性值注入,调用sendSmtpEmail(email)即可,返回值为Boolean.

import com.bonc.industry.email.pojo.Email;

import com.sun.mail.util.MailSSLSocketFactory;

import lombok.extern.slf4j.Slf4j;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.*;

import javax.mail.internet.*;

import java.security.GeneralSecurityException;

import java.util.Date;

import java.util.Map;

import java.util.Properties;

/**

* @ClassName:sendEmail

* @author:mxy

* @Description: 发送邮件的工具类

*/

@Slf4j

public class SendEmailUtils {

//发送的主要类:涉及到"登录邮箱"-"组装邮件"-"发送".

public static Boolean sendSmtpEmail(Email email){

try {

Properties properties = getProperties(email);

//发送人名称(为空则默认为发送账户)

Session session = getSession(properties, email);

session.setDebug(true);

//创建email

MimeMessage message = getMimeMessage(email, session);

Transport.send(message);

return true;

}catch (Exception e){

log.error("发送失败:"+e.toString());

return false;

}

}

private static MimeMessage getMimeMessage(Email email, Session session) throws Exception {

MimeMessage message = new MimeMessage(session);

// 设置邮件的属性

// 设置发件人

if (!email.getFromName().isEmpty()) {

// 自定义发件人昵称

message.setFrom(new InternetAddress(MimeUtility.encodeText(email.getFromName()) + " "));

} else {

message.setFrom(new InternetAddress(email.getFrom()));

}

// 一对多发送:

// 构建一个群发地址数组(1对多)

InternetAddress[] adr = new InternetAddress[email.getToList().size()];

for (int i = 0; i < adr.length; i++) {

adr[i] = new InternetAddress(email.getToList().get(i));

}

// Message的setRecipients方法支持群发。 收件人

message.setRecipients(Message.RecipientType.TO, adr);

// 设置密送人

if (null!=email.getBccList()&&email.getBccList().size()>0) {

InternetAddress[] internetAddressBCC = new InternetAddress[email.getBccList().size()];

for (int i = 0; i < internetAddressBCC.length; i++) {

internetAddressBCC[i] = new InternetAddress(email.getBccList().get(i));

}

message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);

}

// 设置抄送人

if (null!=email.getCcList()&&email.getCcList().size()>0) {

InternetAddress[] internetAddressCC = new InternetAddress[email.getCcList().size()];

for (int i = 0; i < internetAddressCC.length; i++) {

internetAddressCC[i] = new InternetAddress(email.getCcList().get(i));

}

message.setRecipients(Message.RecipientType.CC, internetAddressCC);

}

/*

* JavaMail API不限制信息只为文本,任何形式的信息都可能作MimeMessage的一部分.

* 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的. JavaMail

* API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.

*/

// 设置发生日期

message.setSentDate(new Date());

// 设置邮件的主题

message.setSubject(email.getSubject());

//创建用于组合邮件正文和附件的MimeMultipart对象

MimeMultipart mimeMultipart = new MimeMultipart("mixed");

// 创建邮件的正文

message.setText(email.getText(), "text/html;charset=gb2312");

// 设置HTML内容

MimeBodyPart content = createContent(email.getText(), email.getImagesMap());

mimeMultipart.addBodyPart(content);

// 创建附件

if(null!=email.getFileList()&&email.getFileList().size()>0){

for (String filePath:email.getFileList()){

MimeBodyPart attachmentPart = createAttachment(filePath);

mimeMultipart.addBodyPart(attachmentPart);

}

}

message.setContent(mimeMultipart);

message.saveChanges(); // 保存修改

return message;

}

public static MimeBodyPart createContent(String body, Map imagesMap) throws Exception {

/* 创建代表组合MIME消息的MimeMultipart对象和该对象保存到的MimeBodyPart对象 */

MimeBodyPart content = new MimeBodyPart();

// 创建一个MimeMultipart对象

MimeMultipart multipart = new MimeMultipart();

if (!body.isEmpty()) {

// 创建一个表示HTML正文的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中

MimeBodyPart htmlBodyPart = new MimeBodyPart();

htmlBodyPart.setContent(body, "text/html;charset=UTF-8");

multipart.addBodyPart(htmlBodyPart);

}

if (imagesMap != null && !imagesMap.isEmpty()) {

for (Map.Entry entry: imagesMap.entrySet()) {

/* 创建一个表示图片的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中 */

MimeBodyPart pictureBodyPart = new MimeBodyPart();

// FileDataSource用于读取文件数据,并返回代表数据的输入输出流和数据的MIME类型

FileDataSource fileDataSource = new FileDataSource(entry.getValue());

// DataHandler类用于封装FileDataSource对象,并为应用程序提供访问数据的接口

pictureBodyPart.setDataHandler(new DataHandler(fileDataSource));

pictureBodyPart.setContentID(entry.getKey());

multipart.addBodyPart(pictureBodyPart);

}

}

// 将MimeMultipart对象保存到MimeBodyPart对象中

content.setContent(multipart);

return content;

}

/**

* 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的

* getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail

* 中的这种设计是使用了策略模式(Strategy

*/

public static Session getSession(Properties properties, Email email) {

return Session.getInstance(properties, new Authenticator() {

@Override

protected PasswordAuthentication getPasswordAuthentication() {

//设置发送帐号密码

return new PasswordAuthentication(

email.getFrom(), email.getPassword());

}

});

}

/**

* JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.

* @param email

* @return

* @throws GeneralSecurityException

*/

public static Properties getProperties(Email email) throws GeneralSecurityException {

Properties properties = new Properties();

// 设置发送主机

properties.setProperty("mail.host", email.getHost());

// 设置smtp方式

properties.setProperty("mail.transport.protocol", "smtp");

//设置发送端口

properties.setProperty("mail.smtp.port", email.getPort());

// 使用smtp身份验证

properties.setProperty("mail.smtp.auth", "true");

//QQ存在一个特性设置SSL加密

MailSSLSocketFactory sf = new MailSSLSocketFactory();

sf.setTrustAllHosts(true);

properties.put("mail.smtp.ssl.enable", "true");

properties.put("mail.smtp.ssl.socketFactory", sf);

return properties;

}

/**

* 创建保存附件的MimeBodyPart对象,并且加入附件内容和相应的信息

* @param filepath

* @return

* @throws MessagingException

*/

public static MimeBodyPart createAttachment(String filepath) throws Exception{

MimeBodyPart attachmentPart = new MimeBodyPart();

FileDataSource fds = new FileDataSource(filepath);

attachmentPart.setDataHandler(new DataHandler(fds));

attachmentPart.setFileName(MimeUtility.encodeText(fds.getName()));

return attachmentPart;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java addcallback函数_java中怎么使用callback函数?

UYOU在很多场景&#xff0c;作为开发都会想到&#xff0c;在执行完毕一个任务的时候&#xff0c;能执行一个callback函数是多么好的事情。现在模拟一下这个情景&#xff1a;定义三个类。分别是主函数类。callback函数的接口类。业务处理类。在业务处理类中&#xff0c;处理完业…

在java中的交换方法有哪些_java中交换两个变量的值有哪几种方法,交换两个变量a和b的值...

java中交换两个变量的值有哪几种方法在Java中&#xff0c;有哪些方法可以交换两个变量的值&#xff0c;方法&#xff1a;1.定义临时变量2.没有必要定义临时变量3.使用位运算符(学习视频分享&#xff1a;java课程)代码示例&#xff1a;公共类SwapTest {公共静态void main(String…

opc客户端读取数据品质是bad_听说看了这篇文章就彻底搞懂了什么是OPC(上)

从2000年初以来&#xff0c;我们就一直在使用OPC软件互操作性标准&#xff0c;而那些正准备踏入和想要踏入工业自动化领域的人们却对这些含义感到困惑。所以在本中&#xff0c;我将系统地为你梳理OPC知识。OPC首字母缩写词代表什么&#xff1f;问一个OPC老手&#xff0c;他们或…

php导入json文件_[php]导入超大json文件

前言在之前的文章《做一个twitter的插件玩玩》中&#xff0c;我做了一个批量删除推文(转发推文)的工具&#xff0c;该工具能够删除前3200条推文&#xff0c;但因为总数太多(4.3万条)&#xff0c;api接口不支持获取所有的推文&#xff0c;所以我采用了下载的方式&#xff0c;直接…

linux怎样写java代码,linux 怎么写java

linux 怎么写java一、环境安装由于使用 yum 或者 apt-get 命令 安装 openjdk 可能存在类库不全&#xff0c;从而导致用户在安装后运行相关工具时可能报错的问题&#xff0c;所以此处我们推荐采用手动解压安装的方式来安装 JDK。具体步骤如下&#xff1a;1.下载 JDK进入Oracle官…

超级好用的一个php上传图片类(随机名_缩略图_加水印),超级好用的一个php上传图片类(随机名,缩略图,加水印)...

Upimages.class.php php上传类复制代码 代码如下:class UpImages {var $annexFolder "upload";//附件存放点&#xff0c;默认为&#xff1a;annexvar $smallFolder "small";//缩略图存放路径&#xff0c;注&#xff1a;必须是放在 $annexFolder下的子目录…

matlab读取data格式,ReadData3D 各种格式图像的读取,包括医学 效果很好 matlab 272万源代码下载- www.pudn.com...

文件名称: ReadData3D下载 收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 51 KB上传时间: 2017-03-29下载次数: 0提 供 者: 李忠宽详细说明&#xff1a;各种格式图像的读取&#xff0c;包括医学图像的读取&#xff0c;效果很好-Various formats of image reading, inclu…

mysql vs2008,vs2008 使用mysql

近期转到研发岗&#xff0c;需要用到mysql、vs2008&#xff1b;之前由于没有做过&#xff0c;写下这篇文章记录下这周所学的东西&#xff01;先安装好相关软件安装时间比较久耐心等待......安装完毕之后打开vs&#xff0c;Tools -> opptions ->设置完毕之后&#xff0c;点…

matlab pretty什么用,matlab如何使输出结果更美观(symdisp函数——pretty函数升级版)...

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x& t7 n0 d: a# m0 O( y- Lmatlab中有些计算结果比较长&#xff0c;直接查看有些困难&#xff0c;下面介绍pretty和symdisp函数优化输出结果&#xff0c;使结果更为直观。- …

php 遮罩层,Jquery实现遮罩层的方法

本文实例讲述了Jquery实现遮罩层的方法。分享给大家供大家参考。具体如下&#xff1a;1、假设#main为页面body中的最外层Div标签2、背景被遮罩后&#xff0c;显示的弹出窗(默认是不显示的&#xff0c;所包含的CSS这里就不贴了)&#xff1a;xAttention!3、在script.js中定义遮罩…

nhinx php 调优,高流量站点NGINX与PHP-fpm配置优化

本文由LinuxProbe.Com团队成员岳国帅整理发布&#xff0c;原文来自&#xff1a;黑白。导读使用Nginx搭配PHP已有7年的经历&#xff0c;这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。以下正是这方面的一些提示和建议&#xff1a;1. 将TCP切换为UNIX域套接字1. 将…

php rinit,PHP执行原理

一&#xff1a;PHP简介&#xff1a;PHP&#xff1a;Hypertext Preprocessor 也就是“超文本预处理器”&#xff0c;是一种通用的开源脚本语言。语法吸收了C语言&#xff0c;Java和Perl的特点&#xff0c;使用广泛&#xff0c;主要适用于Web开发领域。二&#xff1a;PHP的设计理…

linux 查看握手时间,实战:tcpdump抓包分析三次握手四次挥手

本文档以实战的形式介绍tcpdump抓包分析三次握手四次挥手的过程。执行tcpdump命令tcpdump -n -i ens32 host 192.168.10.10 and 42.186.113.26 >> /tmp/tcpdump.txtping game.campus.163.comcurl http://game.campus.163.comcurl http://game.campus.163.com结束后&#…

linux 高级i o函数,高级I/O函数

对于socket&#xff0c;最基本的输入输出函数就是&#xff0c;read和write。它们最基本&#xff0c;同样功能也是最少的。Unix中有几个函数是read/write的变种&#xff0c;在基本的输入输出功能上&#xff0c;还增加了一些非常使用的功能和特性&#xff0c;它们是&#xff1a;r…

安装linux必不可少的一个分区,安装linux系统对硬盘分区时,必须有的两种分区类型是什么?...

安装Linux系统对硬盘分区时&#xff0c;必须有两种分区类型&#xff1a; 根分区和交换分区。根分区就是root分区&#xff0c;所有的东西都在这个分区内。 /swap分区是交换分区&#xff0c;是一定磁盘空间(分区或文件)&#xff0c;用于将部分内存中的数据换下来&#xff0c;以腾…

ubuntu和linux服务器,Linux服务器系统CentOS和Ubuntu Server如何选择? | 偶乃秋辰

在秋辰看来&#xff0c;目前最优秀的服务器系统就是Linux&#xff0c;但是Linux并不能说是一套完整的操作系统&#xff0c;准确的说它只是系统的内核&#xff0c;否则也不会有那么多的发行版如&#xff1a;Red Hat、CentOS、Debian、Ubuntu、Fedora等。其实Linux发行版系统很多…

linux 黑屏后死机,如何修复各种各样的黑屏死机

每次我们打开这些设备&#xff0c;我们都希望我们生活中的科技能发挥作用。当他们不能工作时&#xff0c;会让我们非常沮丧&#xff0c;尤其是当我们不知道如何解决问题时。所谓的“死亡黑屏”在操作系统之间很常见&#xff0c;当您打开机器&#xff0c;但屏幕空白。有时监视器…

cmd文件 c语言的段,对于TMS320F2812的CMD文件的理解

1.COFF格式要谈CMD文件&#xff0c;首先不可避免的要谈下COFF格式&#xff0c;COFF格式是通用目标文件格式(Common Object FileFormat)的缩写&#xff0c;它是一种流行的二进制可执行文件格式&#xff0c;在DSP里二进制可执行文件包括库文件(.lib)、目标文件(.obj)和最终可执行…

android点击事件的优先级,Android事件体系全面总结+实践分析,系列篇

前言在这一个月里&#xff0c;我利用闲余的时间看了下最近Android职业发展这块该怎么选择&#xff1f;这个问题各位大神的回答都非常透彻&#xff0c;相信对大家或多或少都在一定程度上有很大的帮助&#xff0c;今天在这里写这篇文章更多的是想以我开发十年的工作经历&#xff…

android各组件翻译,Android App框架指南(译文)

该系列文章是对Android推出的架构组件相关文章&#xff0c;按作者自己理解来翻译的&#xff0c;同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方&#xff0c;或者理解错误的地方&#xff0c;请不吝指教。源自Android官方Guide to app architecturel princ…