概述
- 首先在pow文件中引入javax.mail.glassfish
<!-- 邮件 -->
<dependency>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.mail.glassfish</artifactId>
<version>1.4.1.v201005082020</version>
</dependency>
- 写一个发送邮箱工具类
package com.example.demo;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;
/**
* @author aq
* @version V1.0.0
* @Description: 发送邮件工具类
* @date 2019/11/27 10:49
*/
public class EmailUtil {
/**
* 邮箱配置
*/
//邮箱的协议;有很多 POP3,SMTP,IMAP,在这里使用 SMTP协议
private static final String protocol = "smtp";
//qq邮箱使用smtp协议的地址
private static final String host = "smtp.qq.com";
//qq邮箱smtp的端口号有两个 465和587
private static final String port = "465";
//邮箱是否需要授权
private static final String auth = "true";
//此邮箱只针对经过安全认证的邮箱有效
private static final String fallback = "false";
//发送人邮箱账号
private static final String user = "换成自己的邮箱";
//发送人授权码
private static final String password = "换成自己的授权码";
//设置调试信息在控制台打印出来
private static final boolean debug=false;
/**
* main方法修改配置后直接运行即可
* @param args
*/
public static void main(String[] args) {
//换成自己要发送的邮箱(多人发送用逗号隔开)
String emails = "953692187@qq.com,1332755269@qq.com,18943142789@163.com";
//换成自己要发送的主题
String subject = "您好你的验证码是";
//换成自己要发送的内容("支持html语言")
String content = "<img src='http://blog.tbaqkj.com/attachment/20191124/826b2295bd104cbd8175dd268d6e1e75.png' />";
//换成自己要上传的附件(多个附件用逗号隔开,注意路径一定要对,否则会抛异常)
String fileNames = "D://test.png,D://test.txt";
EmailUtil.sendMail(emails, subject, content, fileNames);
}
/**
* 发送邮件带附件
*
* @param emails 收件人列表
* @param subject 主题
* @param content 内容
* @param filenames 附件(当附件为null时默认不发送邮件)
*/
public static void sendMail(String emails, String subject, String content, String filenames) {
//通过Properties属性将邮箱的地址、协议、端口号写入,然后放到session中
Properties props = new Properties();
//邮箱的协议;有很多 POP3,SMTP,IMAP,在这里使用 SMTP协议
props.setProperty("mail.transport.protocol", protocol);
//qq邮箱使用smtp协议的地址
props.setProperty("mail.smtp.host", host);
//qq邮箱smtp的端口号有两个 465和587
props.setProperty("mail.smtp.port", port);
//邮箱是否需要授权
props.setProperty("mail.smtp.auth", auth);
//若是163邮箱则已经结束了,若是qq邮箱需要SSL安全认证
//java针对qq的安全认证是通过 javax.net.ssl.SSLSocketFactory全类名的抽象类来实现的
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//此邮箱只针对经过安全认证的邮箱有效
props.setProperty("mail.smtp.socketFactory.fallback", fallback);
//安全认证的端口号,一边和邮箱的端口号一致
props.setProperty("mail.smtp.socketFactory.port", port);
Session session = Session.getInstance(props);
//设置调试信息在控制台打印出来
session.setDebug(debug);
/**
* 以逗号形式拆分字符串
*/
String[] receives = emails.split(",");
try {
//创建邮件
// MimeMessage message = getMimeMessage(session , "3608938672@qq.com" ,"953692538@qq.com" , "3608938672@qq.com" ,"3608938672@qq.com");
MimeMessage message = getMimeMessage(session, user, receives, subject, content, filenames);
//建立连接对象
Transport transport = session.getTransport();
//发送邮件的人的用户名和密码,其中密码为授权码
transport.connect(user, password);
System.out.println("开始发送邮件");
long startTime = System.currentTimeMillis();
transport.sendMessage(message, message.getAllRecipients());
long endTime = System.currentTimeMillis();
System.out.println("发送邮件成功,共消耗" + (endTime - startTime) + "毫秒");
//关闭连接
transport.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* MimeMessage是Message的子类,Message是所有电子邮件的超类;
* 标准的Java Mail API中有一个Message的子类:MimeMessage,它可用于电子邮件和Usenet新闻消息。除此之外,其他厂商可以自由扩展Message来满足自身需求
*
* @param session Session:对象
* @param send 邮件的发送者
* @param receives 多个邮件的接收者
* @param subject 主题
* @param content 内容
* @return
* @throws Exception
*/
public static MimeMessage getMimeMessage(Session session, String send, String[] receives, String subject, String content, String filenames) throws Exception {
// 混合关系
// 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
MimeMultipart mm = new MimeMultipart();
//1.创建一封邮件的实例对象
MimeMessage msg = new MimeMessage(session);
//2.设置发件人地址
msg.setFrom(new InternetAddress(send));
/**
* 3.设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
* MimeMessage.RecipientType.TO:发送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
InternetAddress[] internetAddresses = new InternetAddress[receives.length];
for (int i = 0; i < receives.length; i++) {
System.out.println("邮箱"+(i+1)+":"+receives[i]);
internetAddresses[i] = new InternetAddress(receives[i]);
}
System.out.println("共有"+receives.length+"封邮件");
msg.setRecipients(MimeMessage.RecipientType.TO, internetAddresses);
// msg.setRecipient(MimeMessage.RecipientType.CC,new InternetAddress(cReceive));
// msg.setRecipient(MimeMessage.RecipientType.BCC,new InternetAddress(bcReceive));
//4.设置邮件主题
msg.setSubject(subject, "UTF-8");
// // 5. 创建图片"节点"
// MimeBodyPart image = new MimeBodyPart();
// // 读取本地文件
// DataHandler dataHandler = new DataHandler(new FileDataSource("D://test.png"));
// // 将图片数据添加到"节点"
// image.setDataHandler(dataHandler);
// // 为"节点"设置一个唯一编号(在文本"节点"将引用该ID),若需要增加好多图片则用ID来区分
// image.setContentID("mailPic");
// 6. 创建文本"节点",MimeBodyPart表示的是一个单节点
MimeBodyPart text = new MimeBodyPart();
// 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
text.setContent(content, "text/html;charset=UTF-8");
// 7. (文本+图片)设置 文本 和 图片"节点"的关系(将 文本 和 图片"节点"合成一个混合"节点"), MimeMultipart表示的是一个符合节点
MimeMultipart mm_text_image = new MimeMultipart();
mm_text_image.addBodyPart(text);
// mm_text_image.addBodyPart(image);
// 关联关系
mm_text_image.setSubType("related");
// 8. 将 文本+图片 的混合"节点"封装成一个普通"节点"
// 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
// 上面的 mailTestPic 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
MimeBodyPart text_image = new MimeBodyPart();
text_image.setContent(mm_text_image);
mm.addBodyPart(text_image);
// 如果有多个附件,可以创建多个多次添加
// 9. 创建附件"节点"
if (filenames!=null && !"".equals(filenames)) {
String[] filenameArray = filenames.split(",");
for (int i = 0; i < filenameArray.length; i++) {
MimeBodyPart attachment = new MimeBodyPart();
// 读取本地文件
DataHandler dataHandler2 = new DataHandler(new FileDataSource(filenameArray[i]));
// 将附件数据添加到"节点"
attachment.setDataHandler(dataHandler2);
// 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dataHandler2.getName()));
mm.addBodyPart(attachment);
}
}
// mm.setSubType("mixed");
// 11. 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
msg.setContent(mm);
//设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
return msg;
}
}
放到项目里直接运行即可
最后
以上就是爱撒娇人生为你收集整理的java 发送邮件的全部内容,希望文章能够帮你解决java 发送邮件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复