Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

作者头像
IT可乐
发布于 2018-01-04 07:14:40
发布于 2018-01-04 07:14:40
3.5K00
代码可运行
举报
文章被收录于专栏:IT可乐IT可乐
运行总次数:0
代码可运行

  好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。我们这里所讲的就是利用 JavaMail 完成邮件的发送和接收功能。

  PS:本篇博客源码下载链接:https://github.com/YSOcean/cnblogs

1、JavaMail 介绍

  JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

  JavaMail 下载地址: https://github.com/javaee/javamail/releases

  下载这个版本的JavaMail,包含了SMTP, IMAP, 和 POP3 协议的实现。

2、JavaMail API

  JavaMail API 按照功能可以划分为如下三大类:

  ①、创建和解析邮件的API

  ②、发送邮件的API

  ③、接收邮件的API

  以上三种类型的API在JavaMail 中由多个类组成,但是主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。

  ①、Message 类:javax.mail.Message 类是创建和解析邮件的核心 API,这是一个抽象类,通常使用它的子类javax.mail.internet.MimeMessage 类。它的实例对象表示一份电子邮件。客户端程序发送邮件时,首先使用创建邮件的 JavaMail API 创建出封装了邮件数据的 Message 对象,然后把这个对象传递给邮件发送API(Transport 类) 发送。客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message 类的实例中,客户端程序在使用邮件解析API从这个对象中解析收到的邮件数据。

  ②、Transport 类:javax.mail.Transport 类是发送邮件的核心API 类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如 SMTP 协议,客户端程序创建好 Message 对象后,只需要使用邮件发送API 得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调用它的发送方法,就可以把邮件发送给指定的 SMTP 服务器

  ③、Store 类:javax.mail.Store 类是接收邮件的核心 API 类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如 POP3 协议,客户端程序接收邮件时,只需要使用邮件接收 API 得到 Store 对象,然后调用 Store 对象的接收方法,就可以从指定的 POP3 服务器获得邮件数据,并把这些邮件数据封装到表示邮件的 Message 对象中。

  ④、Session 类:javax.mail.Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,例如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session 对象根据这些信息构建用于邮件收发的 Transport 和 Store 对象,以及为客户端创建 Message 对象时提供信息支持。

3、使用 JavaMail 发送简单的纯文本邮件

  在理解下面通过代码实现邮件的发送时,我们可以将邮件发送假想为火箭运载这卫星发送。其中Message 是卫星,Transport 是火箭,而卫星和火箭的构建都需要 Session 的帮助,这样的关系更加便于记忆。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ys.mail;

import java.io.ObjectInputStream.GetField;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.text.html.MinimalHTMLWriter;

public class SendMailText {
	//发件人地址
	public static String senderAddress = "xxx@163.com";
	//收件人地址
	public static String recipientAddress = "xxx@qq.com";
	//发件人账户名
	public static String senderAccount = "xxx";
	//发件人账户密码
	public static String senderPassword = "xxx";
	
	public static void main(String[] args) throws Exception {
		//1、连接邮件服务器的参数配置
		Properties props = new Properties();
		//设置用户的认证方式
		props.setProperty("mail.smtp.auth", "true");
		//设置传输协议
		props.setProperty("mail.transport.protocol", "smtp");
		//设置发件人的SMTP服务器地址
		props.setProperty("mail.smtp.host", "smtp.163.com");
		//2、创建定义整个应用程序所需的环境信息的 Session 对象
		Session session = Session.getInstance(props);
		//设置调试信息在控制台打印出来
		session.setDebug(true);
		//3、创建邮件的实例对象
		Message msg = getMimeMessage(session);
		//4、根据session对象获取邮件传输对象Transport
		Transport transport = session.getTransport();
		//设置发件人的账户名和密码
		transport.connect(senderAccount, senderPassword);
		//发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
		transport.sendMessage(msg,msg.getAllRecipients());
		
		//如果只想发送给指定的人,可以如下写法
		//transport.sendMessage(msg, new Address[]{new InternetAddress("xxx@qq.com")});
		
		//5、关闭邮件连接
		transport.close();
	}
	
	/**
	 * 获得创建一封邮件的实例对象
	 * @param session
	 * @return
	 * @throws MessagingException 
	 * @throws AddressException 
	 */
	public static MimeMessage getMimeMessage(Session session) throws Exception{
		//创建一封邮件的实例对象
		MimeMessage msg = new MimeMessage(session);
		//设置发件人地址
		msg.setFrom(new InternetAddress(senderAddress));
		/**
		 * 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
		 * MimeMessage.RecipientType.TO:发送
		 * MimeMessage.RecipientType.CC:抄送
		 * MimeMessage.RecipientType.BCC:密送
		 */
		msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(recipientAddress));
		//设置邮件主题
		msg.setSubject("邮件主题","UTF-8");
		//设置邮件正文
		msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
		//设置邮件的发送时间,默认立即发送
		msg.setSentDate(new Date());
		
		return msg;
	}

}

  上述的代码有详细的注释,大家不懂得可以留言。注意:大家自己在运行时请将收件人,发件人等信息更改成自己的。

  执行完上述代码,然后我们查看收件箱:

  那么一封简单的纯文本文件就发送完毕了。

4、邮件发送问题

  ①、发件人的邮箱账户名和密码:有的邮箱设置了独立密码,还有的必须用授权码登录(qq邮箱),这在 手工体验smtp和pop3协议 这篇博客中有介绍。

  ②、发件人的SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

  ③、有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试。

  ④、本实例使用的是JavaMail1.6版本,支持的JDK必须是jdk1.7版本!!!

5、使用 JavaMail 接收邮件

  由于接收邮件的用处不多,这里我们就简单的给出一个实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ys.mail;

import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;

public class RecipientMail {
	//收件人地址
	public static String recipientAddress = "xxx@163.com";
	//收件人账户名
	public static String recipientAccount = "xxx";
	//收件人账户密码
	public static String recipientPassword = "xxx";
	
	public static void main(String[] args) throws Exception {
		//1、连接邮件服务器的参数配置
		Properties props = new Properties();
		//设置传输协议
		props.setProperty("mail.store.protocol", "pop3");
		//设置收件人的POP3服务器
		props.setProperty("mail.pop3.host", "pop3.163.com");
		//2、创建定义整个应用程序所需的环境信息的 Session 对象
		Session session = Session.getInstance(props);
		//设置调试信息在控制台打印出来
		//session.setDebug(true);
		
		Store store = session.getStore("pop3");
		//连接收件人POP3服务器
		store.connect("pop3.163.com", recipientAccount, recipientPassword);
		//获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
		Folder folder = store.getFolder("inbox");
		//设置对邮件账户的访问权限
		folder.open(Folder.READ_WRITE);
		
		//得到邮件账户的所有邮件信息
		Message [] messages = folder.getMessages();
		for(int i = 0 ; i < messages.length ; i++){
			//获得邮件主题
			String subject = messages[i].getSubject();
			//获得邮件发件人
			Address[] from = messages[i].getFrom();
			//获取邮件内容(包含邮件内容的html代码)
			String content = (String) messages[i].getContent();
		}
		
		//关闭邮件夹对象
		folder.close();
		//关闭连接对象
		store.close();
	}

}

6、使用 JavaMail 发送带图片、附件的邮件

  我们先看项目结构,在src目录下包含图片和附件:

  然后看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ys.mail;

import java.util.Date;
import java.util.Properties;

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.AddressException;
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 SendMailText_Picture_Enclosure {
	//发件人地址
	public static String senderAddress = "xxx@163.com";
	//收件人地址
	public static String recipientAddress = "xxx@qq.com";
	//发件人账户名
	public static String senderAccount = "xxx";
	//发件人账户密码
	public static String senderPassword = "xxx";
	
	public static void main(String[] args) throws Exception {
		//1、连接邮件服务器的参数配置
		Properties props = new Properties();
		//设置用户的认证方式
		props.setProperty("mail.smtp.auth", "true");
		//设置传输协议
		props.setProperty("mail.transport.protocol", "smtp");
		//设置发件人的SMTP服务器地址
		props.setProperty("mail.smtp.host", "smtp.163.com");
		//2、创建定义整个应用程序所需的环境信息的 Session 对象
		Session session = Session.getInstance(props);
		//设置调试信息在控制台打印出来
		session.setDebug(true);
		//3、创建邮件的实例对象
		Message msg = getMimeMessage(session);
		//4、根据session对象获取邮件传输对象Transport
		Transport transport = session.getTransport();
		//设置发件人的账户名和密码
		transport.connect(senderAccount, senderPassword);
		//发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
		transport.sendMessage(msg,msg.getAllRecipients());
		
		//5、关闭邮件连接
		transport.close();
	}
	
	/**
	 * 获得创建一封邮件的实例对象
	 * @param session
	 * @return
	 * @throws MessagingException 
	 * @throws AddressException 
	 */
	public static MimeMessage getMimeMessage(Session session) throws Exception{
		//1.创建一封邮件的实例对象
		MimeMessage msg = new MimeMessage(session);
		//2.设置发件人地址
		msg.setFrom(new InternetAddress(senderAddress));
		/**
		 * 3.设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
		 * MimeMessage.RecipientType.TO:发送
		 * MimeMessage.RecipientType.CC:抄送
		 * MimeMessage.RecipientType.BCC:密送
		 */
		msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(recipientAddress));
		//4.设置邮件主题
		msg.setSubject("邮件主题(包含图片和附件)","UTF-8");
		
		//下面是设置邮件正文
		//msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
		
		// 5. 创建图片"节点"
        MimeBodyPart image = new MimeBodyPart();
        // 读取本地文件
        DataHandler dh = new DataHandler(new FileDataSource("src\\mailTestPic.png")); 
        // 将图片数据添加到"节点"
        image.setDataHandler(dh); 
        // 为"节点"设置一个唯一编号(在文本"节点"将引用该ID)
        image.setContentID("mailTestPic");     
		
        // 6. 创建文本"节点"
        MimeBodyPart text = new MimeBodyPart();
        // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent("这是一张图片<br/><a href='http://www.cnblogs.com/ysocean/p/7666061.html'><img src='cid:mailTestPic'/></a>", "text/html;charset=UTF-8");
        
		// 7. (文本+图片)设置 文本 和 图片"节点"的关系(将 文本 和 图片"节点"合成一个混合"节点")
        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);
        
        // 9. 创建附件"节点"
        MimeBodyPart attachment = new MimeBodyPart();
        // 读取本地文件
        DataHandler dh2 = new DataHandler(new FileDataSource("src\\mailTestDoc.docx"));
        // 将附件数据添加到"节点"
        attachment.setDataHandler(dh2);
        // 设置附件的文件名(需要编码)
        attachment.setFileName(MimeUtility.encodeText(dh2.getName()));        
        
        // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text_image);
        mm.addBodyPart(attachment);     // 如果有多个附件,可以创建多个多次添加
        mm.setSubType("mixed");         // 混合关系

        // 11. 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
        msg.setContent(mm);
		//设置邮件的发送时间,默认立即发送
		msg.setSentDate(new Date());
		
		return msg;
	}

}

  执行程序后,我们查看邮箱:

   那么一封包含图片(点击图片跳转到指定超链接),和附件的邮件就生成了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java邮件开发
(重点)SMTP:发送邮件的协议。Simple Message Transfer Protocal。默认端口:25
HUC思梦
2020/09/03
1.7K0
java邮件开发
电子邮件实现详解(下)
书接上回,上篇中主要介绍了电子邮件协议格式等理论相关内容,这篇中我们从JavaMail、Python的smtplib以及Django的django.core.mail模块三个视角来实现发送邮件这件事。
才浅Coding攻略
2022/12/12
1.9K0
电子邮件实现详解(下)
Java邮件发送详解
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
全栈程序员站长
2022/08/28
1.2K0
Java邮件发送详解
JavaMail-发送一封简单邮件(附带附件)
以上的工具类有个进行了重载的方法,因为对于没有附件的邮件和有附件的邮件,在构造邮件对象时是不一样的,有附件的邮件会稍微复杂一点。接着是测试类。
雨临Lewis
2022/01/11
4620
基于JavaMail的Java邮件发送:简单快速上手
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。
陶然同学
2023/02/27
1.1K0
基于JavaMail的Java邮件发送:简单快速上手
Java Mail---SMTP协议-Java发邮件(带附件)演示过程
邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。 Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。
谙忆
2021/01/21
2.3K0
Java Mail---SMTP协议-Java发邮件(带附件)演示过程
使用Java实现邮件发送功能,邮件发送API JavaMail
JavaMail是一个用于发送和接收邮件的API。它提供了一个独立于平台的、基于Java的邮件解决方案。我们可以使用JavaMail发送电子邮件,包括文本邮件、HTML邮件以及带附件的邮件。
Harry技术
2025/01/13
1530
使用Java实现邮件发送功能,邮件发送API JavaMail
JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码
  基于 JavaMail 1.5.5 ,实现了邮件发送功能,也对接了一些客户,没出现什么问题
青石路
2023/03/09
2.7K0
JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码
Java常用工具类之发送邮件
package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingE
二十三年蝉
2018/02/28
1.5K0
利用java实现发送邮件
电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。
全栈程序员站长
2022/08/28
1.4K0
利用java实现发送邮件
Java Mail(二):JavaMail介绍及发送一封简单邮件
JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另
高爽
2018/01/15
1.7K0
Java Mail(二):JavaMail介绍及发送一封简单邮件
java实现发送邮件工具[通俗易懂]
java实现发送邮件的功能:首先需要导入mail.jar; 然后需要写发送方法: 1、邮箱发送封装工具类:
全栈程序员站长
2022/08/28
6050
java实现发送邮件工具[通俗易懂]
使用 JavaMail 实现邮件发送与收取
因为上一篇已经实现了James的配置,那接下来就是利用javaMail实现邮件的发送和收取。
林老师带你学编程
2022/11/30
1K0
邮件发送,附件太大怎么办 → 那就用分卷压缩吧
  需要注意的是,不同的邮箱的发件箱的端口会有不同,另外发件箱也可能是授权码而不是发件箱登陆密码,需要大家结合具体的邮箱服务器来设置
青石路
2023/10/16
4290
邮件发送,附件太大怎么办 → 那就用分卷压缩吧
Java-工具类之发送邮件
代码已托管到 https://github.com/yangshangwei/commonUtils
小小工匠
2021/08/17
1.7K0
SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件
(1)、Message 类: javax.mail.Message 类是创建和解析邮件的一个抽象类 子类javax.mail.internet.MimeMessage :表示一份电子邮件。 发送邮件时,首先创建出封装了邮件数据的 Message 对象, 然后把这个对象传递给邮件发送Transport 类,执行发送。 接收邮件时,把接收到的邮件数据封装在Message 类的实例中,从这个对象中解析收到的邮件数据。
知了一笑
2019/07/19
1.9K0
java实现发送邮件功能
电子邮件开发在后台中是普遍存在的现象和功能,比如用户注册,系统自动发送一封电子邮件到用户邮箱;再比如密码找回,系统会自动把密码发送到用户邮箱;…等等,所以作为一名java程序员,还是有必要学会这项技能的。
全栈程序员站长
2022/08/27
9520
java实现发送邮件功能
Java Mail(三):Session、Message详解
上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设置到Transport中,收件人可以设置到Message中,也可以设置到Transport中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。 Session        Session用于收集JavaMail运行过程中的环境信息,它可以创建一个单例的对象,也可以每次创建新的对象,Session没有构造器,只能通过如
高爽
2018/01/15
1K0
Java Mail(三):Session、Message详解
Java 发送邮件的几种方式[通俗易懂]
发送文件的项目地址(free):https://download.csdn.net/download/qq_36474549/10741073
全栈程序员站长
2022/08/28
1.3K0
车辆违章查询和限行提醒程序 -- (2) Java实现发送邮件
下面我们介绍如何用Java发送邮件,综合网上资料我制作了一篇肥肠简单的教程,只要把邮箱密码和接收者邮箱账户替换成你需要的即可!!!当然,发送邮件虽然没有成本,但是不如发短信提醒用户来的直接,而且同一个IP和账户发送邮件太多的话,邮件会被识别成为垃圾邮件,用户还得去垃圾箱里面才能看见我们发的邮件,算是有利有弊吧。
浩Coding
2019/07/03
1.2K0
相关推荐
java邮件开发
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验