javaweb_邮件发送
邮件发送
1. 电子邮件
-
要在网络上实现邮件功能,必须要有专门的邮件服务器。
-
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
-
SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
-
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能。
2. 传输协议
SMTP协议:发送邮件:
-
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议:接收邮件:
-
我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)
邮件发送原理:
步骤:
-
大狂神通过smtp协议连接到smtp服务器,然后发送一封邮件给网易的邮件服务器.
-
网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的smtp服务器.
-
QQ将接收到的邮件存储在24736743@qq.com这个邮件账号的空间中.
-
小狂神通过Pop3协议连接到Pop3服务器收取邮件.
-
从24736743@qq.com这个邮件账号的空间中取出邮件.
-
Pop3服务器将取出来的邮件送到小狂神手中.
注意:有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试
3. Java发送邮件概述
我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。
使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework
我们需要得到两个jar包:
-
mail.jar
-
activation.jar
JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络:
-
创建包含邮件服务器的网络连接信息的Session对象。
-
创建代表邮件内容的Message对象。
-
创建Transport对象,连接服务器,发送Message,关闭连接。
主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。
4. 实现java发送纯文本邮件
4.1 首先从邮箱中获取对应的权限:
QQ邮箱需要安全验证,我们需要获取他对应的权限:
QQ邮箱–>邮箱设置–>账户
获取到授权码 复制下来 备用
4.2 导入所需jar包
需要把这两个jar包下载下载放到Tomcat的lib目录下
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency >
<groupId >javax.mail </groupId >
<artifactId >mail </artifactId >
<version >1.4.7 </version >
</dependency >
4.3 编写代码
package com.zcc;
import com.sun.mail.util.MailLogger;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
//尝试发送一封纯文本邮件;
public class EmailSend {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties properties=new Properties();
//设置邮件服务器;
properties.setProperty("mail.host","smtp.163.com");
//邮件发送协议;
properties.setProperty("mail.transport.protocol","smtp");
//需要验证用户名与密码;
properties.setProperty("mail.smtp.auth","true");
//QQ邮箱的SSL加密;
/*MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);*/
//使用JavaMail发送邮件;
//1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
//QQ的独特创建方式;===>
/*Session session=Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//userName:用户名 password:授权码
return new PasswordAuthentication("发送人@qq.com","授权码");
}
});*/
Session session=Session.getDefaultInstance(properties);
//开启session的debug模式;
session.setDebug(true);
//2.session==>获取Transport对象
Transport ts=session.getTransport();
//3.使用邮箱的授权码,用户名,连接邮件的服务器;
ts.connect("smtp.163.com","发送人@163.com","授权码");
//4.创建邮件; 需要传递session;
MimeMessage message=new MimeMessage(session);
//需要指明邮件的发送人;
message.setFrom(new InternetAddress("发送人@163.com"));
//指明收件人==> 此处为自发;
message.setRecipient(Message.RecipientType.TO,new InternetAddress("收件人邮箱"));
//邮件标题;
message.setSubject("520,我想对你说","utf-8");
//文本内容;
message.setContent("<h3 style='color: red'>我爱你</h3>","text/html;charset=UTF-8");
//5.发送邮件; 需要指明发送的地址;
ts.sendMessage(message, message.getAllRecipients());
//6.关闭;
ts.close();
}
}
5. 实现java发送带有图片和附件的邮件
先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类:
javax.mail.internet.MimeBodyPart类,表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类:
javax.mail.internet.MimeMultipart是抽象类,Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
MimeMultipart对象的使用的时候需要设置setSubType()的属性值,一共就下面3种取值:
我们在使得的时候如果不知道使用哪一个,直接使用mixed即可,使用这个属性值一定不会报错。
创建包含内嵌图片的邮件:
前面的例子 中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可
package com.zcc;
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.security.GeneralSecurityException;
import java.util.Properties;
public class EmailPicturesSend {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties properties=new Properties();
//设置邮件服务器;
properties.setProperty("mail.host","smtp.163.com");
//邮件发送协议;
properties.setProperty("mail.transport.protocol","smtp");
//需要验证用户名与密码;
properties.setProperty("mail.smtp.auth","true");
//QQ邮箱的SSL加密;
/*MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);*/
//使用JavaMail发送邮件;
//1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
//QQ的独特创建方式;===>
/*Session session=Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//userName:用户名 password:授权码
return new PasswordAuthentication("发送人@qq.com","授权码");
}
});*/
Session session=Session.getDefaultInstance(properties);
//开启session的debug模式;
session.setDebug(true);
//2.session==>获取Transport对象
Transport ts=session.getTransport();
//3.使用邮箱的授权码,用户名,连接邮件的服务器;
ts.connect("smtp.163.com","发送人@163.com","授权码");
//4.创建邮件; 需要传递session;
MimeMessage message=new MimeMessage(session);
//需要指明邮件的发送人;
message.setFrom(new InternetAddress("发送人@163.com"));
//指明收件人==> 此处为自发;
message.setRecipient(Message.RecipientType.TO,new InternetAddress("发送人邮箱"));
//邮件标题;
message.setSubject("520,我想对你说","utf-8");
//发送包含图片的复杂邮件==========================================
//准备图片数据。
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("D:\\JavaWeb\\源代码\\Email_java\\src\\main\\resources\\image\\05.png"));
image.setDataHandler(