转:邮件实现详解(四)--JavaMail 发送(带图片和附件)
补:附录中总结了一些遇到的问题与解决方案
1. Java Mail API 简介
JavaMail,它支持一些常用的邮件协议,如SMTP,POP3,IMAP,还有MIME等。
新建Maven工程,加入依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
Java Mail API按照功能可以划分为如下三大类:
① 创建和解析邮件的API
② 发送邮件的API
③ 接收邮件的API
三种类型的API在Java Mail中有多个类组成,主要的四个核心类:
① Message类:javax.mail.Message类是创建和解析邮件的核心API
通常使用它的子类javax.mail.internet.MimeMessage类。它的实例表示一个电子邮件。
② Transport类: javax.mail.Transport类是发送邮件的核心API,它的实例是实现了某个邮件发送协议的邮件发送对象。
③ Store类: javax.mail.Store类是接收邮件的核心API,它的实例是实现了某个邮件接收协议的邮件接收对象。
④ Session类: javax.mail.Session类用于定义整个应用程序所需的环境信息,以及手机客户端与邮件服务器建立网络连接的会话信息
邮件服务器的主机名、端口号、采用的邮件发送和接收协议。
Session对象根据这些信息构建用于邮件发送的Transport和Store对象,以及为客户端创建Message对象提供信息支持。
一句话:Message是卫星,Transport是火箭,卫星和火箭的构建都需要Session的帮助。
2. Java Mail 发送简单的纯文本邮件实现示例
public class SendMail {
//发件人地址:建MimeMessage实例使用
private static String senderAddress = "*****@163.com";
///收件人地址:建MimeMessage实例使用
private static String receiverAddress = "*****@qq.com";
//发件人账户:建Transport实例使用
private static String senderAccout = "*****@163.com";
//发件人账户密码:建Transport实例使用(注:QQ邮箱有独立的支持第三方发邮件的登录密码)
private static String senderPassword = "*****";
public static void main(String[] args) throws Exception {
Properties props = new Properties();
//加载类路径下的properties文件
props.load(SendMail.class.getResourceAsStream("/mail.properties"));
//根据props生成整个环境所需要的环境信息Session对象
Session session = Session.getInstance(props);
//在控制台设置打印调试信息
session.setDebug(true);
//前面说了,session是生产卫星和火箭的重要信息,下面创建邮件的实例对象
Message msg = getMimeMessage(session);
//前面说了,session是生产卫星和火箭的重要信息,下面创建邮件传输对象
Transport transport = session.getTransport();
//设置发件人的账户名密码
transport.connect(senderAccout, senderPassword);
//发送邮件
transport.sendMessage(msg, msg.getAllRecipients());
//关闭邮件连接
transport.close();
}
public static MimeMessage getMimeMessage(Session session) throws Exception {
//前面说了,session是生产卫星和火箭的重要信息
//创建一封邮件的实例对象
MimeMessage msg = new MimeMessage(session);
//设置发件人地址
msg.setSender(new InternetAddress(senderAddress));
/*
* 设置收件人地址
* MimeMessage.RecipientType.TO:发送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiverAddress));
//设置邮件主题
msg.setSubject("JAVA Mail SendTest", "UTF-8");
//设置邮件正文
msg.setContent("First Java Mail,<br/>这是一封通过Java实现的电子邮件", "text/html;charset=utf-8");
//设置邮件发送时间,默认立即发送
msg.setSentDate(new Date());
//返回编辑好的邮件实例(卫星)
return msg;
}
}
mail.properties文件:
#user authentication
mail.smtp.auth=true
#transport protocol
mail.transport.protocol=smtp
#SMTP HOST of sender
mail.smtp.host=smtp.163.com
#port 465 not 25(out-time)
mail.smtp.port=465
#important -> a new SMTP based on SSL
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
3. Java Mail 发送带图片+文件的邮件实现示例
public class SendPicFileTest {
//发件人地址
private static String senderAddress = "*****@163.com";
//收件人地址
private static String recipientAddress = "*****@qq.com";
//发件人账户名
private static String senderAccount = "*****@163.com";
//发件人账户密码
private static String senderPassword = "*****";
public static void main(String[] args) throws Exception {
//1. 加载smtp配置文件
Properties props = new Properties();
props.load(SendPicFileTest.class.getResourceAsStream("/mail.properties"));
//2. 生成Session
Session session = Session.getInstance(props);
session.setDebug(true);
//3. 生成Transport
Transport transport = session.getTransport();
transport.connect(senderAccount, senderPassword);
//4. 生成要发送的邮件实例
MimeMessage msg = getMimeMessage(session);
//5. 发送邮件
transport.sendMessage(msg, msg.getAllRecipients());
//6. 关闭邮件链接
transport.close();
}
public static MimeMessage getMimeMessage(Session session) throws Exception {
MimeMessage msg = new MimeMessage(session);
msg.setSubject("Java Mail Pic&Files", "utf-8");
msg.setSender(new InternetAddress(senderAddress));
msg.setRecipients(MimeMessage.RecipientType.TO, recipientAddress);
//创建图片节点
MimeBodyPart image = new MimeBodyPart();
//读取文件
DataHandler dh = new DataHandler(new FileDataSource(new File(SendPicFileTest.class.getClassLoader().getResource("mail.png").getPath())));
//将图片数据添加到“节点”
image.setDataHandler(dh);
//为节点设置一个唯一的编号(在文本“节点”将引用该ID)
image.setContentID("mailPic");
//创建文本节点
MimeBodyPart text = new MimeBodyPart();
//加入文本内容
text.setContent("<a href='https://blog.csdn.net/Juwenzhe_HEBUT'>你好,点击进入我的博客链接</a><br>", "text/html;charset=utf-8");
//设置文本+图片的节点的关系,将文本和图片整合成一个节点
MimeMultipart mm_text_image = new MimeMultipart();
mm_text_image.addBodyPart(text);
mm_text_image.addBodyPart(image);
mm_text_image.setSubType("related");//关联关系
//将文本+图片的混合节点,封装成普通的节点
MimeBodyPart text_image = new MimeBodyPart();
text_image.setContent(mm_text_image);
//以上完成了图文内容的封装
//下面,添加附件
//创建附件节点
MimeBodyPart attachment = new MimeBodyPart();
//读取本地文件
DataHandler dh2 = new DataHandler(new FileDataSource(new File(SendPicFileTest.class.getClassLoader().get Resource("jsontest.txt").getPath())));
//把本地文件添加到附件节点
attachment.setDataHandler(dh2);
//设置附件名(加编码)
attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
//将图文+附件生成一个大节点
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text_image);
mm.addBodyPart(attachment);
mm.setSubType("mixed");//混合关系
//将最终的混合节点作为邮件的内容添加到邮件对象
msg.setContent(mm);
return msg;
}
}
[ Java Mail 接收邮件实现示例 用的很少,参考转载的大佬博客 ]
转载:邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件
补充:遇到的问题与解决方案 -->
1. Maven项目中读取src/main/resources目录下的配置文件的方法
2. 554 DT:SPM 163 smtp3解决方案 、http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
3. 获取src/main/resources下文件的绝对路径
4. tcmime.6751.6880.18849.bin文件的产生原因:邮件的附件或者图片没有使用或者为空白时,系统随机分配的附件,不是病毒。
5. 关于使用Java Mail进行邮件发送,抛出Could not connect to SMTP host: xx@xxx.com, port: 25的异常可能 、https://blog.csdn.net/qq_21647977/article/details/77743808
6. Could not connect to SMTP host: smtp.***.com, port: 465, response: -1