java 实现邮箱发送邮件功能(端口:465、587)

2023-11-18

使用465端口对邮件进行ssl加密传输

 

package com.example.alysslEmail;

import java.security.Security;

import java.util.Date;

import java.util.Properties;

 

import javax.mail.Authenticator;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.PasswordAuthentication;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

 

/**

* javaMail的邮件工具类

* @author wangXgnaw

*

*/

public class MailUtil {

public static void main(String[] args) {

sendEmil("xxxxxxxxxx@qq.com", "邮件发送测试,成功!!"); 

}

 

/**

* 使用加密的方式,利用465端口进行传输邮件,开启ssl

* @param to 为收件人邮箱

* @param message 发送的消息

*/

public static void sendEmil(String to, String message) {

try {

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

//设置邮件会话参数

Properties props = new Properties();

//邮箱的发送服务器地址

props.setProperty("mail.smtp.host", "smtp.hkvastnet.com");

props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);

props.setProperty("mail.smtp.socketFactory.fallback", "false");

//邮箱发送服务器端口,这里设置为465端口

props.setProperty("mail.smtp.port", "465");

props.setProperty("mail.smtp.socketFactory.port", "465");

props.put("mail.smtp.auth", "true");

final String username = "xxxxxxxxx@qq.com"; //发送者邮箱用户名

final String password = "xxxxxxx"; //发送者邮箱密码或者邮箱授权码

//获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm

Session session = Session.getDefaultInstance(props, new Authenticator() {

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(username, password);

}

});

//通过会话,得到一个邮件,用于发送

Message msg = new MimeMessage(session);

//设置发件人

msg.setFrom(new InternetAddress("xxxxxxxx@qq.com")); //发件人邮箱

//设置收件人,to为收件人,cc为抄送,bcc为密送

msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));

msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, false));

msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));

msg.setSubject("邮件主题");

//设置邮件消息

msg.setText(message);

//设置发送的日期

msg.setSentDate(new Date());

//调用Transport的send方法去发送邮件

Transport.send(msg);

 

} catch (Exception e) {

e.printStackTrace();

}

 

}

}

 

使用465端口对邮件进行ssl加密传输 --- 带附件

 

package com.example.alysslEmail;

 

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

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 SendMailBySSL {

private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

private String smtpServer; // SMTP服务器地址

private String port; // 端口

private String username; // 登录SMTP服务器的用户名

private String password; // 登录SMTP服务器的密码

private List<String> recipients = new ArrayList<String>(); // 收件人地址集合

private String subject; // 邮件主题

private String content; // 邮件正文

private List<String> attachmentNames = new ArrayList<String>(); // 附件路径信息集合

public SendMailBySSL() {

}

public SendMailBySSL(String smtpServer, String port, String username,

String password, List<String> recipients, String subject,

String content, List<String> attachmentNames) {

this.smtpServer = smtpServer;

this.port = port;

this.username = username;

this.password = password;

this.recipients = recipients;

this.subject = subject;

this.content = content;

this.attachmentNames = attachmentNames;

}

public void setSmtpServer(String smtpServer) {

this.smtpServer = smtpServer;

}

public void setPort(String port) {

this.port = port;

}

public void setUsername(String username) {

this.username = username;

}

public void setPassword(String password) {

this.password = password;

}

public void setRecipients(List<String> recipients) {

this.recipients = recipients;

}

public void setSubject(String subject) {

this.subject = subject;

}

public void setContent(String content) {

this.content = content;

}

public void setAttachmentNames(List<String> attachmentNames) {

this.attachmentNames = attachmentNames;

}

/**

* 进行base64加密,防止中文乱码

* */

public String changeEncode(String str) {

try {

str = MimeUtility.encodeText(new String(str.getBytes(), "UTF-8"),

"UTF-8", "B"); // "B"代表Base64

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return str;

}

/**

* 正式发邮件

* */

public boolean sendMail() {

Properties properties = new Properties();

properties.put("mail.smtp.host", smtpServer);

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

properties.put("mail.smtp.socketFactory.class", SSL_FACTORY); //使用JSSE的SSL socketfactory来取代默认的socketfactory

properties.put("mail.smtp.socketFactory.fallback", "false"); // 只处理SSL的连接,对于非SSL的连接不做处理

properties.put("mail.smtp.port", port);

properties.put("mail.smtp.socketFactory.port", port);

Session session = Session.getInstance(properties);

session.setDebug(true);

MimeMessage message = new MimeMessage(session);

try {

// 发件人

Address address = new InternetAddress(username);

message.setFrom(address);

// 收件人

for (String recipient : recipients) {

System.out.println("收件人:" + recipient);

Address toAddress = new InternetAddress(recipient);

message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO 发送单个

// message.addRecipient(MimeMessage.RecipientType.TO, toAddress); //发送多个,

/**

* TO:代表有健的主要接收者。 CC:代表有健的抄送接收者。 BCC:代表邮件的暗送接收者。

* */

}

// 主题

message.setSubject(changeEncode(subject));

// 时间

message.setSentDate(new Date());

Multipart multipart = new MimeMultipart();

// 添加文本

BodyPart text = new MimeBodyPart();

text.setText(content);

multipart.addBodyPart(text);

// 添加附件

for (String fileName : attachmentNames) {

BodyPart adjunct = new MimeBodyPart();

FileDataSource fileDataSource = new FileDataSource(fileName);

adjunct.setDataHandler(new DataHandler(fileDataSource));

adjunct.setFileName(changeEncode(fileDataSource.getName()));

multipart.addBodyPart(adjunct);

}

// 清空收件人集合,附件集合

recipients.clear();

attachmentNames.clear();

message.setContent(multipart);

message.saveChanges();

} catch (Exception e) {

e.printStackTrace();

return false;

}

try {

Transport transport = session.getTransport("smtp");

transport.connect(smtpServer, username, password);

transport.sendMessage(message, message.getAllRecipients());

transport.close();

} catch (Exception e) {

e.printStackTrace();

return false;

}

return true;

}

public static void main(String[] args) {

List<String> recipients = new ArrayList<String>();

// recipients.add("xxxxxxxx@qq.com");

recipients.add("xxxxxxxx@qq.com"); //收件人

String subject = "这封邮件是为了测试SMTP的SSL加密传输";

String content = "这是这封邮件的正文";

List<String> attachmentNames = new ArrayList<String>();

attachmentNames.add("C://Users//48732//Desktop//新建文本文档 (2).txt");

SendMailBySSL sendMailBySSL = new SendMailBySSL("xxxxxxxxxx", "465",

"xxxxxxx@qq.com", "xxxxxxxx", recipients, subject, content,

attachmentNames);

sendMailBySSL.sendMail();

}

}

 

 

使用587端口对邮件进行ssl加密传输

 

package com.example;

 

import java.io.File;

import java.util.Properties;

import javax.mail.MessagingException;

import javax.mail.internet.MimeMessage;

import org.springframework.core.io.FileSystemResource;

import org.springframework.mail.MailException;

import org.springframework.mail.SimpleMailMessage;

import org.springframework.mail.javamail.JavaMailSenderImpl;

import org.springframework.mail.javamail.MimeMessageHelper;

 

public class MailUtil {

private static final String HOST = "smtp.qq.com";

private static final String SMTP = "smtp";

private static final String USERNAME = "xxxxxxxxxx@qq.com"; //发送者

private static final String PASSWORD = "rnwasrxlaxepdccb";

private static final int PORT = 587;//587/465

private static final String DEFAULTENCODING = "UTF-8";

private static final String RECEIVEUSERNAME="xxxxxxxxxx@qq.com"; //收件人

private static JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();

private static Properties prop = new Properties();

static{

// 设定mail server

senderImpl.setHost(HOST);

senderImpl.setProtocol(SMTP);

senderImpl.setUsername(USERNAME);

senderImpl.setPassword(PASSWORD);

senderImpl.setPort(PORT);

senderImpl.setDefaultEncoding(DEFAULTENCODING);

// 设定properties

prop.put("mail.smtp.auth", "true");

prop.put("mail.smtp.timeout", "90000");

//设置调试模式可以在控制台查看发送过程

prop.put("mail.debug", "true");

senderImpl.setJavaMailProperties(prop);

}

public static void main(String args[]) {

// 设置收件人,寄件人 用数组发送多个邮件

// String[] array = new String[] {"88888@qq.com","666666@qq.com","999999999@qq.com",USERNAME};

/**

* array 收件人数组 群发邮件时,使用数组多次发送

*/

String[] array = new String[] {RECEIVEUSERNAME};

String subject = "Cherish内嵌图片、音乐的邮件";

// StringBuffer sb = new StringBuffer();

// try {

// URL url = new URL("http://www.imooc.com/");//http://android-studio.org/

//

// URLConnection conn = url.openConnection();

// InputStream is = conn.getInputStream();

//

// BufferedReader reader = new BufferedReader(new InputStreamReader(is));

//

// String string = null;

// while ((string = reader.readLine()) != null) {

// sb.append(string);

// }

//

// //System.out.println(sb.toString());

//

// } catch (Exception e) {

// e.printStackTrace();

// }

//

// boolean result = htmlMail(array, subject, sb.toString());

String filePath = "C:/Users/48732/Desktop/bq.png";

String html = "<html><head>"+

"</head><body>"+

"<audio src='http://m10.music.126.net/20160422225433/25b43b999bcdaf3425b9194514340596/ymusic/8c94/b9af/69e3/7ebe35b8e00154120822550b21b0c9c5.mp3' autoplay='autoplay' controls='controls' loop='-1'>测试</audio>"+

"<h1>Hello,Nice to meet you!</h1>"+

"<span style='color:red;font-size:20px;'>发送邮件成功!!!</span>"+

"<img src='cid:javaxmail.png'>"+

"</body></html>";

boolean result = inlineFileMail(array, subject, html, filePath);

// boolean result = singleMail(RECEIVEUSERNAME, "主题", "内容");

if (result) {

System.out.println("发送邮件成功。。。。");

}

}

/**

* 发送简单邮件

* @param to 收件人邮箱

* @param subject 主题

* @param content 内容

* @return

*/

public static boolean singleMail(String to, String subject, String content){

String[] array = new String[] {to};

return singleMail(array, subject, content);

}

/**

* 发送简单文本邮件

* @param to 收件人邮箱数组

* @param subject 主题

* @param content 内容

* @return

*/

public static boolean singleMail(String[] to, String subject, String content){

boolean result = true;

SimpleMailMessage mailMessage = new SimpleMailMessage();

// 设置收件人,寄件人 用数组发送多个邮件

mailMessage.setTo(to);

mailMessage.setFrom(USERNAME); //发件人

mailMessage.setSubject(subject);

mailMessage.setText(content);

// 发送邮件

try {

senderImpl.send(mailMessage);

} catch (MailException e) {

e.printStackTrace();

result = false;

}

return result;

}

/**

* 发送html邮件

* @param to 收件人

* @param subject 主题

* @param html html代码

* @return

*/

public static boolean htmlMail(String[] to, String subject, String html){

boolean result = true;

MimeMessage mailMessage = senderImpl.createMimeMessage();

MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage);

try {

// 设置收件人,寄件人 用数组发送多个邮件

messageHelper.setTo(to);

messageHelper.setFrom(USERNAME);

messageHelper.setSubject(subject);

// true 表示启动HTML格式的邮件

messageHelper.setText(html, true);

// 发送邮件

senderImpl.send(mailMessage);

} catch (MessagingException e) {

result = false;

e.printStackTrace();

}

return result;

}

/**

* 发送内嵌图片的邮件 (cid:资源名)

* @param to 收件人邮箱

* @param subject 主题

* @param html html代码

* @param imgPath 图片路径

* @return

*/

public static boolean inlineFileMail(String[] to, String subject, String html, String filePath){

boolean result = true;

MimeMessage mailMessage = senderImpl.createMimeMessage();

try {

//设置true开启嵌入图片的功能

MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true);

// 设置收件人,寄件人 用数组发送多个邮件

messageHelper.setTo(to);

messageHelper.setFrom(USERNAME);

messageHelper.setSubject(subject);

// true 表示启动HTML格式的邮件

messageHelper.setText(html, true);

FileSystemResource file = new FileSystemResource(new File(filePath));

messageHelper.addInline(file.getFilename(), file);

// 发送邮件

senderImpl.send(mailMessage);

} catch (MessagingException e) {

result = false;

e.printStackTrace();

}

return result;

}

/**

* 发送带附件的邮件

* @param to

* @param subject

* @param html

* @param filePath

* @return

*/

public static boolean attachedFileMail(String[] to, String subject, String html, String filePath){

boolean result = true;

MimeMessage mailMessage = senderImpl.createMimeMessage();

try {

// multipart模式 为true时发送附件 可以设置html格式

MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true,"utf-8");

// 设置收件人,寄件人 用数组发送多个邮件

messageHelper.setTo(to);

messageHelper.setFrom(USERNAME);

messageHelper.setSubject(subject);

// true 表示启动HTML格式的邮件

messageHelper.setText(html, true);

FileSystemResource file = new FileSystemResource(new File(filePath));

// 这里的方法调用和插入图片是不同的。

messageHelper.addAttachment(file.getFilename(), file);

// 发送邮件

senderImpl.send(mailMessage);

} catch (MessagingException e) {

result = false;

e.printStackTrace();

}

return result;

}

}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 实现邮箱发送邮件功能(端口:465、587) 的相关文章

随机推荐

  • console错误合集

    handlers i call is not a function 从报错的handlers i call 入手查找原因 这个错误是 调用相关的生命周期钩子函数引起来的错误 查看你的页面相关 生命周期钩子函数 是否有 声明了未定义方法 或是
  • 程序员的小浪漫----烟火

    多代码 慎读 预览 完整项目预览 预览地址 属性设计 烟花状态 烟花应有三个状态 升空 等待炸裂 炸裂后 烟花 发射点 x y 爆炸点 xEnd yEnd 升空后等待炸裂时间 wait 炸裂后微粒个数 count 烟花半径 radius 烟
  • 数据产品经理基础之写好报表需求文档

    今天业务部门向我提了个需求 想要在BI上实现一份日报表 并提供了一份日报表的excel文档样例 我为了 敏捷开发 没写需求文档 直接把excel扔给了开发 结果就导致一系列后遗症 首先是开发在写sql的过程频繁确认需求 xxx字段是什么意思
  • 白盒测试相关的一些知识

    在白盒测试中 可以使用各种测试方法进行测试 下面这篇文章 可能比较枯燥 如果不乐意读 可以先收藏 如果在你的工作中真遇到白盒测试的话 可以回过头再来看看 还是值得读一读 一般来说 白盒测试时要考虑以下5个问题 1 测试中尽量先用自动化工具来
  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • JVM面试FAQ分析

    JVM面试FAQ分析 1 入门部分 1 1为什么要学习JVM 1 2 你了解哪些JVM产品 1 3 JVM的构成有哪几部分 2 类加载部分 2 1 你知道哪些类加载器 2 2 什么是双亲委派类加载模型 2 3 双亲委派方式加载类有什么优势
  • AdaBoost算法

    参考 https www bilibili com video BV1ix411i7yp p 26 机器学习技法 之 聚合模型 Aggregation Model 士杰的博客 CSDN博客 聚合模型
  • Java当中解析ini文件对应到JavaBean当中

    目录 1 ini文件简介 2 ini文件 3 ini解析工具类 4 示例运行结果 1 ini文件简介 ini 文件是Initialization File的缩写 即初始化文件 是windows的系统配置文件所采用的存储格式 统管window
  • 使用Nginx做反向代理超时的问题

    使用Nginx做反向代理时 当被代理服务器没有在指定时间内创建连接 接受请求或返回响应时 Nginx就会断开连接 并返回给客户端 504 Gateway Time out 错误 关于Nginx做反向代理超时 可以通过proxy connec
  • java判断是否为金额

    金额验证 public static boolean isNumber String str java util regex Pattern pattern java util regex Pattern compile 1 9 1 d 0
  • VsCode 常用好用插件/配置+开发Vue 必装的插件

    一 VsCode 常用好用插件 1 实时刷新网页的插件 LiveServer 2 open in browser 支持快捷键与鼠标右键快速在浏览器中打开html文件 支持自定义打开指定的浏览器 包括 Firefox Chrome Opera
  • vue3+tsx+element-plus封装组件总结

    最近在做vue3 plan tsx element plus的项目 tsx在我这里是用来做组件的 以往的开发方式是sfc 就是vue页面的写法
  • java socket 阻塞模式_关于socket的Accept阻塞模式的退出方法分析

    众所周知 socket的Accept会阻塞当前线程 如果子程序 或者类在被回收时 没有正确的中止socket 则会引发一些异常 我说下常用的一些处理方法 1 强行中断线程 这种方法我觉得是最差的 因为强行中断正在执行的线程 可能会引发一些意
  • 基于51单片机实现8位数码管显示表白数字(Proteus仿真)

    wechat 嵌入式工程师成长日记 具体功能实现 8位数码管从左往右显示 5201314 并且不闪烁 使用器件 若干电阻 4只LED红灯 8位数码管 总线 排阻 NPN三极管 AT89C51芯片 Proteus仿真原理图 WeChat 愿随
  • Unity 将图片做成预制体

    Unity 将图片做成预制体 刚导入Assets的图片是无法直接拖入场景中的 若我们想要将图片变成预制体 需要做一点转化 方法如下 选中想要转成预制体的图片 更改如下图 然后就可以将图片拖入场景中 进而拖进Assets里面制成预制体啦
  • 【如何卸载Alitum Designer10】

    我由于装了AD20 所以想要卸载掉AD10 但是无论是用电脑管家还是电脑的控制面板里面都无法卸载AD10 百度了下 亲测方法可行 故在此分享一下 找到D Program Files x86 Altium AD 10 System Insta
  • interview2-框架篇

    一 Spring篇 1 Spring 1 Bean线程安全问题 不是线程安全的 Spring框架中有一个 Scope注解 默认的值就是singleton 单例的 因为一般在spring的bean的中都是注入无状态的对象 没有线程安全问题 如
  • PCL alpha shapes平面点云边界特征提取(C++详细过程版)

    边界提取 一 概述 二 代码实现 三 结果展示 一 概述 AlphaShape边界提取算法在PCL里有现成的调用函数 具体算法原理和实现代码见 PCL alpha shapes平面点云边界特征提取 为充分了解AlphaShape算法实现的每
  • MySQL性能调优的10个方法

    1 选择合适的存储引擎 InnoDB 除非你的数据表使用来做只读或者全文检索 相信现在提到全文检索 没人会用 MYSQL 了 你应该默认选择 InnoDB 你自己在测试的时候可能会发现 MyISAM 比 InnoDB 速度快 这是因为 My
  • java 实现邮箱发送邮件功能(端口:465、587)

    使用465端口对邮件进行ssl加密传输 package com example alysslEmail import java security Security import java util Date import java util