邮件收发
要想在网络上实现邮件功能,必须要有专门的邮件服务器
这些邮件服务器类似显示生活中的邮局,它主要接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中
SMTP服务器地址:一般是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com
电子邮箱的获得需要在邮件服务器上进行申请,比如我们要使用qq邮箱,就需要开通邮箱功能。
传输协议
smtp协议
发送邮件:
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器
POP3协议
接收邮件:
我们通常把处理用户pop3请求的服务器称之为pop3服务器
邮件收发原理
- user1通过smtp协议连接到smtp服务器,然后发送一封邮件给邮件服务器
- 网易发现需要去qq的邮件服务器,通过这个smtp协议将邮件转投给qq的SMTP服务器
- qq接收到的邮件存储在****@qq.com这个邮件账号的空间中
- user2通过Pop3协议连接到POP3服务器收取邮件
- 从****@qq.com这个邮件账号的空间中取出邮件
- Pop3服务器将取出来的邮件送到user2手中
注意:有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息,这是以为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里面能找到。解决办法就是重复的邮件内容不要多次发送,或者更换收件箱试试。
Java发送简单邮件(文本)
我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。
使用Java发送e-mail非常简单,但是首先应该准备JavaMail API 和Java Activation Framework的两个jar包
在maven下载JavaMail API时要选择JavaMail API (compat) » [1.4.7]这一个
Javamail是sun公司(现被甲骨文收购)为方便java开发人员再应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,比如前面所讲的SMTP,POP3,IMPA还要MIME等。我们使用JavaMail API编写邮件时,无需考虑邮件的底层实现细节,只要调用JavaMail开发包中相似的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。
- 创建包含邮件服务器网络连接信息的Session对象。此session非彼session。
- 创建代表邮件内容的Message对象
- 创建Transport对象,连接服务器,发送Message,关闭连接
主要有四个核心类,我们再编写程序时,记住这四个核心类,就很容易编写出java邮件处理程序。

示例(发送qq邮件):
发送qq邮件之前需要在qq邮箱打开smtp/pop3协议,获得授权码
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailDemo01 {
//发送一封简单的邮件
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器
prop.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
prop.setProperty("mail.host","smtp.qq.com");//需要验证用户名密码
//关于qq邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory","sf");
//使用JavaMail发送邮件的五个步骤
//1. 创建定义整个应用程序所需的环境信息session对象
//这是qq才有的步骤
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("***@qq.com","授权码");
}
});
//开启session的debug模式,这样就可以查看程序发送email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.通过邮箱的用户名和授权码连上服务器
ts.connect("smtp.qq.com","***@qq.com","授权码");
//4.创建邮箱,写邮件
//注意需要传递session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("***@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("***@qq.com"));
//邮件的标题
message.setSubject("学习java发送邮件");
//邮件的文本内容,其实就是一段html代码,可以有样式
message.setContent("<h1 style='color:red;'>java邮件,学习发送邮件</h1>","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
}
带图片和附件的邮件
先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
有一个方法setSubType(“属性”) 具有三个属性对应下面的关系

发送带图片邮件
和普通文本邮件除了在创建邮件对象时不一样,其他的都一样,只列出不一样的代码
//4.创建邮箱,写邮件
//注意需要传递session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("276635785@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("276635785@qq.com"));
//邮件的标题
message.setSubject("学习java发送邮件");
//================================
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
//图片需要经过数据处理..DataHandler:数据处理
DataHandler dh = new DataHandler(new FileDataSource("E:\\test\\mn.jfif"));
image.setDataHandler(dh);//在我们的body中放入这个处理的图片数据
image.setContentID("bz.jpg");//给图片设置一个ID方便调用
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这个邮件带了嵌入的资源<img src='cid:bz.jpg'>","text/html;charset=UTF-8");
//描述数据的关系
MimeMultipart mm = new MimeMultipart();//这个对象是装bodyPart的容器
mm.addBodyPart(text);//把数据放进去
mm.addBodyPart(image);
mm.setSubType("related");//代表这个邮件有嵌入的资源,mixed权限最高
//把对象放到message中,保存修改
message.setContent(mm);
message.saveChanges();
//=================================
发送带附件邮件
不同的也是创建message对象时的不同,主要用到了把正文的MimeMultipart再次封装成MimeBodyPart,然后再和附件封装,给出构建message不同的部分
//4.创建邮箱,写邮件
//注意需要传递session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("276635785@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("276635785@qq.com"));
//邮件的标题
message.setSubject("学习java发送邮件");
//================================
//图片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("E:\\test\\mn.jfif")));
body1.setContentID("bg.jpg");
//文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("请注意,我不是广告<img src='cid:bg.jpg'>","text/html;charset=utf-8");
//附件
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("E:\\test\\sg.png")));
body3.setFileName("sg.png");
MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("E:\\test\\1.gif")));
body4.setFileName("1.gif");
//拼装邮件正文内容
MimeMultipart mm1 = new MimeMultipart();
mm1.addBodyPart(body1);
mm1.addBodyPart(body2);
mm1.setSubType("related");//文本和图片内嵌成功
//将拼接好的正文内容再次设置成单独的bodyPart
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mm1);
//拼接附件和正文
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(body3);//附件
allFile.addBodyPart(body4);//附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed");//有附件必须是mixed
//保存到message中
message.setContent(allFile);
message.saveChanges();//保存修改
//=================================
本文详细介绍了如何使用JavaMail API在Java应用程序中实现邮件发送功能,包括邮件服务器配置、SMTP协议应用、邮件内容构造及发送过程。同时,文章还提供了发送带图片和附件邮件的示例代码。
1168

被折叠的 条评论
为什么被折叠?



