您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】Java发送QQ邮件图文教程
不忘初心 2019-04-11 围观() 评论() 点赞() 【JAVA开发】
简介:Java发送邮件,可以使用com.sun.mail包下面的javax.mail实现,通过SMTP服务进行发送邮件,市面上的邮箱种类很多,如:QQ、新浪、网易,本
Java发送邮件,可以使用com.sun.mail包下面的javax.mail实现,发送、抄送、暗送,这些功能都有相应的API,功能非常的强大,通过SMTP服务进行邮件发送,市面上的邮箱很多种类,如:QQ、新浪、网易等,本文中我们来看一下如何用Java代码发送QQ邮件。
1、邮箱一般都有保护机制,默认SMTP是不开启的,所以需要先去邮箱设置中开启SMTP;
2、不是随便都能发送邮件的,需要在邮箱中拿到授权码才可以进行发送;
进入到发送者的QQ邮箱中,在设置中开启SMTP服务
为了安全,还需要校验密保
密保短信发送完毕之后,点击右下角的“我已发送”,就可以看到授权码了
本来还想着授权码要不要记录下来,好方便下次使用,结果看到了下面那一行提示信息之后,设计的还是挺贴心的,可多个授权码一起使用,忘记了也没关系,再申请一个就好了。
拿到授权码之后,就可以开始写代码了
package com.wolffy.reader.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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 java.util.Properties;
/**
* 发送QQ邮件工具类,可发送纯文本、富文本、附件格式的邮件
* Created by wolffy on 2019/4/10
*/
@Slf4j
public class QQMailUtil {
/**
* 发送者邮箱
*/
private static final String sender = "发送者邮箱";
/**
* SMTP授权码
*/
private static final String password = "开启SMTP时拿到的授权码";
private static Properties properties() {
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 连接协议
properties.put("mail.smtp.host", "smtp.qq.com");// 主机名,必须要
properties.put("mail.smtp.port", 465);// 端口号,写不写无所谓,不确定的情况下,可以不写
properties.put("mail.smtp.auth", "true");// 是否鉴权,必须要
properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接,一般都使用
properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息,其中就包含了port
return properties;
}
/**
* 发送纯文本类型的QQ邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容
*/
public static void sendTextEmail(String receiver, String subject, String content) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
// 多个收件人
// message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@qq.com"), new InternetAddress("xxx@qq.com")});
// 一个收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));// 发送
// message.setRecipient(Message.RecipientType.CC, new InternetAddress(receiver));// 抄送
// message.setRecipient(Message.RecipientType.BCC, new InternetAddress(receiver));// 暗送
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
message.setText(content);
// setText等同于如下写法,将mimeType封装起来了,提供出一个简单的API
// MimeBodyPart textPart = new MimeBodyPart();
// textPart.setContent(content, "text/plain;charset=UTF-8");
// MimeMultipart multipart = new MimeMultipart();
// multipart.addBodyPart(textPart);
// message.setContent(multipart);
// 将创建好的邮件写入到磁盘盘以文件的形式进行保存
// message.saveChanges();
// message.writeTo(new FileOutputStream("/Users/felix/Desktop/qq_email.eml"));
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为QQ邮箱开通的SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送QQ邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送富文本类型的QQ邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容,一段html
*/
public static void sendRichEmail(String receiver, String subject, String content) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为QQ邮箱开通的SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送QQ邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带图片的QQ邮件,此种方式需要对文本内容详细规划,不能直接拷贝一段html来发送(本质上来说还是发送带附件的邮件:sendFileEmail(),附件就是图片,只不过图片不以附件的方式展示出来),
* 如果不想要上传那图片,只是想引用一下其他地方(比如OSS)的图片,可使用sendRichEmail()方法,在html文本中使用img标签进行图片引入
* <p>
* 具体表现为:
* <p>
* 文本中用到的图片,都需要以附件的方式上传到服务器,但是并不以附件的方式展示出来,而是需要指定一个唯一的ContentID,然后直接在文本中使用<img src='cid:图片名'>进行引用
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容(富文本),尽量包含图片在内
* @param imgPath 图片路径,会以Base64的形式上传到QQ邮箱,多张可以改变方法参数,用list或者字符串解析,然后循环指定ContentID再在文本中引用
*/
public static void sendImgEmail(String receiver, String subject, String content, String imgPath) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
// 多个收件人
// message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@qq.com"), new InternetAddress("xxx@qq.com")});
// 一个收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 准备图片数据,必须将图片传上去,才可以在正文中访问,说实话,cid一一对应的写法真麻烦
// 如果是网络图片,可以直接在富文本中写好路径,这样就无需上传了,见sendRichEmail()方法
// 单张图片
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(imgPath));
imagePart.setDataHandler(handler);
// 取个别名,在内容中引用,引用格式:<img src='cid:图片别名'>
// 图片上传了未引用,或者引用的时候别把名字写错了,这两种情况会形成附件形式的邮件,而且附件还是未转码的格式(.bin结尾)
imagePart.setContentID(handler.getName());
// 多张图片
// for (int i = 0; i < 10; i++) {
// MimeBodyPart imagePart = new MimeBodyPart();
// DataHandler handler = new DataHandler(new FileDataSource("/Users/felix/Desktop/xxx.jpg"));
// imagePart.setDataHandler(handler);
// imagePart.setContentID("xxx" + i + ".jpg");// 取个别名,在内容中引用
// }
multipart.addBodyPart(imagePart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为QQ邮箱开通的SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送QQ邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带附件的QQ邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容
* @param filePath 附件路径,会以Base64的形式上传到QQ邮箱(多个附件需要改写此方法,filePath需要传递多个进来)
*/
public static void sendFileEmail(String receiver, String subject, String content, String filePath) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 单个附件
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(filePath));
imagePart.setDataHandler(handler);
imagePart.setFileName(handler.getName());// 注意这里:不再需要setContentId了
multipart.addBodyPart(imagePart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为QQ邮箱开通的SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送QQ邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
public static void main(String[] args) {
sendTextEmail("111111111@qq.com", "aaa", "ccccc");
sendImgEmail( "111111111@qq.com", "test-image-1", "大风起兮云飞扬,威加海内兮归故乡,<img src='cid:intresting.jpg'>苟利国家生死以,起因祸福趋避之。", "/Users/felix/Desktop/intresting.jpg");
sendRichEmail("111111111@qq.com", "test-image-2", "大风起兮云飞扬,威加海内兮归故乡,<img src='https://cdn.jiweichengzhu.com/files/jwcz/image/20190410/3cfdb6ff-14d0-4030-b8eb-7fb4ddb03957.jpg'>苟利国家生死以,起因祸福趋避之。");
sendFileEmail("111111111@qq.com", "test-file", "测试附件来喽", "/Users/felix/Desktop/intresting.jpg");
}
}
运行代码,日志输出如下:
发送成功的状态码是250,,,是想笑死我,好继承我的支付宝吗?
上图是邮箱中收到的测试邮件,基本上没失败,都能收到!
关于代码中注释的描述,如果没有指定contentId或者cid引用别名写错了的话,就会看到下面这种场景:
所以说,我觉着cid这种方式并不太好用,一不小心哪里就写错了,还不如一段html来得直接!
看完文章,有任何疑问,请加入群聊一起交流!!!
很赞哦! ()
上一篇:分享几个常用的Java工具类
相关文章
标签云
猜你喜欢
- IntelliJ IDEA 2019.2已经可以利用补丁永久破解激活了
- IntelliJ IDEA 2019.3利用补丁永久破解激活教程
- IntelliJ IDEA高版本最灵活的永久破解激活方法(含插件激活,时长你说了算)
- Jetbrains全家桶基于ja-netfilter的最新破解激活详细图文教程
- IntelliJ IDEA 2022.1永久破解激活教程(亲测可用,持续更新)
- 分享几个正版 IntelliJ IDEA 激活码(破解码、注册码),亲测可用,持续更新
- ja-netfilter到底需不需要mymap,2021.3.2版本激活失效?
- 如何激活idea2022.1及以上版本中的插件(亲测可用)
- 【史上最全】IntelliJ IDEA最新2022.1版本安装和激活视频教学(含插件)
- IntelliJ IDEA 2022.2 版本最新2099年永久激活方法,亲测可用,也可以开启新UI了。
站点信息
- 网站程序:spring + freemarker
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们