您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】Java发送网易邮件图文教程
不忘初心 2019-04-12 围观() 评论() 点赞() 【JAVA开发】
简介:前面说过了Java发送QQ邮件,本文来看一下Java实现网易邮件的发送,老规矩,还是需要去设置中开启IMAP/SMTP服务推荐使用客户端,没安装也无所谓,毕竟只
前面说过了Java发送QQ邮件,本文来看一下Java实现网易邮件的发送,老规矩,还是需要去设置中开启IMAP/SMTP服务
推荐使用客户端,没安装也无所谓,毕竟只是建议,直接点击确定
默认一般都是关闭,直接点击开启
为了安全,一样需要密保
不过这个就有意思了,QQ邮箱是自动生成的一串字符,网易邮箱这个授权码竟然是自己填的
只能是字母和数字
规矩贼多,也不能和登录密码一样
上面的步骤都成功了之后,就可以看到有启用记录了,这里我很是纳闷,为什么我都启用了,这选项竟然还是关闭。。。
不过好像并不影响,我直接用代码测试了一波,可以发送成功
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;
/**
* 发送网易邮件工具类,可发送纯文本、富文本、附件格式的邮件
* Created by wolffy on 2019/4/10
*/
@Slf4j
public class NeteaseMailUtil {
/**
* 发送者邮箱
*/
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.163.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;
}
/**
* 发送纯文本类型的网易邮件
*
* @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@163.com"), new InternetAddress("xxx@163.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/163_email.eml"));
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为邮箱开通SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送网易邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送富文本类型的网易邮件
*
* @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);// 密码为邮箱开通SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送网易邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带图片的邮件,此种方式需要对文本内容详细规划,不能直接拷贝一段html来发送(本质上来说还是发送附件:sendFileEmail(),附件就是图片,只不过图片不以附件的方式展示出来),
* 如果不想要上传那图片,只是想引用一下其他地方(比如OSS)的图片,可使用sendRichEmail()方法,在html文本中使用img标签进行图片引入
* <p>
* 具体表现为:
* <p>
* 文本中用到的图片,都需要以附件的方式上传到服务器,但是并不以附件的方式展示出来,而是需要指定一个唯一的ContentID,然后直接在文本中使用<img src='cid:图片名'>进行引用
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容(富文本),尽量包含图片在内
* @param imgPath 图片路径,会以Base64的形式上传到邮箱,多张可以改变方法参数,用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@163.com"), new InternetAddress("xxx@163.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);// 密码为邮箱开通SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送网易邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带附件的邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容
* @param filePath 附件路径,会以Base64的形式上传到邮箱(多个附件需要改写此方法,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);// 密码为邮箱开通SMTP服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送网易邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
public static void main(String[] args) {
sendTextEmail("111111111@163.com", "aaa", "ccccc");
sendImgEmail( "111111111@163.com", "test-image-1", "大风起兮云飞扬,威加海内兮归故乡,<img src='cid:intresting.jpg'>苟利国家生死以,起因祸福趋避之。", "/Users/felix/Desktop/intresting.jpg");
sendRichEmail("111111111@163.com", "test-image-2", "大风起兮云飞扬,威加海内兮归故乡,<img src='https://cdn.jiweichengzhu.com/files/jwcz/image/20190410/3cfdb6ff-14d0-4030-b8eb-7fb4ddb03957.jpg'>苟利国家生死以,起因祸福趋避之。");
sendFileEmail("111111111@163.com", "test-file", "测试附件来喽", "/Users/felix/Desktop/intresting.jpg");
}
}
发送结果如下,依旧是250:
看到这个250,就代表发送成功了!!!
不知道是否在我的机器上个例,我在浏览器中登录网易邮箱,打开cid方式发送的邮件时,会有一个闪烁的过程,第一次打开时,图片是以附件的方式呈现的,大概1s之后它才会跳到正文中展示,并且隐藏了附件,后面再次打开邮件则没有这个问题了;在邮箱客户端上一切正常,也没有这个问题。
看完文章,有任何疑问,请加入群聊一起交流!!!
很赞哦! ()
下一篇:Java发送新浪邮件图文教程
相关文章
- IntelliJ IDEA 2024.2发布之后强推新UI,如何恢复老的经典UI界面
- Uninstall hasn't detected folder of intelli] lDEA installation. Probablyuninstall.exe was moved from the installation folder.
- 公众号CPS变现新宠:微赚淘客查券返利机器人,开启智能省钱赚钱新时代
- 高返利优惠券公众号推荐
- 返利公众号可信吗安全吗?返利机器人哪个佣金高?
- 唯品会购物返利公众号大揭秘:哪些真正好用的返利公众号?
- 饿了么优惠券免费领取:哪些公众号值得推荐?
- 哪些有用可靠的微信公众号能领淘宝优惠券?
- 微信返利最高的微信号推荐——让你的购物更加实惠!
- 微信返利最高的微信号推荐
标签云
猜你喜欢
- 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
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们