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实现封装的三步是_JAVA基础-封装

封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值(比如年龄是500). 无论是编译阶段还是运行阶段都不会报错或者给出提示, 此时与现实生活不符 为了避免上述错误的发生, 就需要对成员变量进行密封包装处理,来隐藏成员变量的细节以及保证成员变量数值的合…

java中广告维护轮播图怎么做_Banner广告轮播图

需求描述轮播图也是大部分app都有的效果&#xff0c;商品类跟新闻类的app是肯定会有的。轮播图的效果跟第一次启动时的引导页类似&#xff0c;不过轮播图在引导页的基础上多了几个功能:在第一页也能向左滑动,在最后一页也能向右滑动有个计时器&#xff0c;每隔一段时间滚动轮播…

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

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

oracle 数据抽取 java_oracle数据抽取步骤

oracle数据抽取步骤Database links:1、 在本地计算机上&#xff0c;新建一个连接远程数据库的连接&#xff0c;并记住这个连接的服务名(例如&#xff1a;jzfx_remote)&#xff1b;2、 返回远程数据库的GLOBAL_NAME&#xff1a;执行&#xff1a;SELECT * FROM GLOBA…

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

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

java修改原有txt文件_(转)Java创建txt文件并进行读、写、修改操作

Creation date: 2007-12-18 - 下午06:48:45 */ public class ReadWriteFile { public static BufferedReader bufread; //指定文件路径和名称 private static String path "D:/suncity.txt"; private static File filename new File(path); private static String …

java暂停另一个线程_如何从另一个线程终止或暂停Rust线程?

对于终止和挂起线程&#xff0c;您可以使用通道 .外部终止在工作循环的每次迭代中&#xff0c;我们检查是否有人通过渠道通知我们 . 如果是&#xff0c;或者如果通道的另一端超出范围&#xff0c;我们就会打破循环 .use std::io::{self, BufRead};use std::sync::mpsc::{self, …

java 7 jboss_JBoss7 入门指南

1、下载地址&#xff1a; http://www.jboss.org/jbossas/downloads &#xff0c;下载Certified Java EE 6 Full Profile版本。2、解压 jboss-as-7.1.1.Final.zip 到 D:\programs。3、设置环境变量如下&#xff1a;系统变量->新建->变量名&#xff1a;JAVA_HOME C:\Java以…

java实现bloom filter_Java BloomFilter.add方法代码示例

import org.apache.hadoop.util.bloom.BloomFilter; //导入方法依赖的package包/类Overridepublic int run(String[] args) throws Exception {if (args.length ! 4) {System.err.println("Usage: Trainer ");return 1;}// Parse command line argumentsPath inputFi…

java系统项目分为哪五大层次?控制层_业务_一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转...

表现层就是看到的东西&#xff0c;比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了&#xff0c;存东西用的&#xff0c;DAO层就是将访问数据库的代码&#xff0c;数据库层是数…

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

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

java怎么将程序保存在桌面_在Java桌面应用程序中保留数据的最佳方法是什么?...

我的桌面应用程序中有一大堆Java对象,我试图决定将文件作为文件系统的最佳方式.我曾经有过一些想法&#xff1a;>使用DataOutputStream滚动我自己的串行器&#xff1a;这将给我最大的控制文件中的内容,但是以微量管理为代价.>使用ObjectOutputStream及其各种相关类的直接…

JAVA实现inotify一样的功能_WPF实现INotifyPropertyChanged

我已经设置了一个属性并实现了INotifyPropertyChanged像这样......public event PropertyChangedEventHandler PropertyChanged;public FlowProcess LastSelectedFlowProcess{get { return _lastSelectedFlowProcess; }set{_lastSelectedFlowProcess value;Notify("LastS…

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

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

php 生成dbf,php 读取vfp 8.0,9.0所产生的dbf文件

VFP 9.0 PHP odbc求大神指导。。。由VFP8.0以上制造的DBF文件&#xff0c;自带的Tabel Type> autoinc field 或者Blob field&#xff0c;想通过PHP读取&#xff0c;不行吗&#xff1f;代码很简单如下》$add’c://BatMan//Daten//ladert2.DBF’;$e”Driver{Microsoft Visual …

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

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

java登陆密码验证失败,java用户名密码验证示例代码分享

类:NameII 权限:public方法:main 权限:public参数:name,password,denglu,i;参数介绍:name&#xff0c;数据类型 String &#xff0c;用来存储一个从 input 中获取的值&#xff0c;在本程序当中用作用户名的存放&#xff1b;password&#xff0c;数据类型 String &#xf…

php 五角星,php使用GD库画五角星_PHP教程

01 $width 500;02 $height 500;0304 $im imagecreatetruecolor($width, $height);0506 $red imagecolorallocate($im, 230, 0, 0);07 imagefill($im, 0, 0, $red);0809 $yellow imagecolorallocate($im, 255, 255, 0);1011 //设定画出五角星的五个顶点形成的 正五边形的边…

java的配置文件后缀,Java - 敏感配置文件位置

0x00 前言项目中常遇到Java站点&#xff0c;像SSM、springboot这些框架开发的通常一些配置文件都在固定的位置&#xff0c;当然还有Tomcat容器的配置文件。0x01 记录1.properies配置文件这个文件的作用很重要&#xff0c;通常是一个JavaWeb项目中的配置文件&#xff0c;以.prop…

apmserv 5.2.6 升级php,APMServ5.2.6 升级PHP版本 到高版本 5.3,5.4

Thursday, December 12, 2013 1:59 AM 17173606 php-5.3.28-Win32-VC9-x86.zipranhou 然后解压&#xff0c;得到一个新的目录&#xff1a;把原来APMServ目录中的PHP目录中的&#xff1a;ext &#xff0c; extras 两个目录复制过来&#xff0c;遇到重复文件&#xff0c;不要覆盖…