Java实现电子邮箱发送
邮件发送
邮件服务器与传输协议
要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是 smtp.xxx.com
,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
SMTP协议:
通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议:
通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
工作原理:
步骤:
①发信人调用用户代理来撰写和编辑要发送的邮件。用户代理用SMTP协议把邮件传送给发送方邮件服务器。
②发送方邮件服务器将邮件放入邮件缓存队列中,等待发送。
③运行在发送方邮件服务器的SMTP客户进程,发现邮件缓存中有待发送的邮件,就向运行在接收方邮件服务器的SMTP服务器进程发起建立TCP连接
④TCP连接建立后,SMTP客户进程开始向远程SMTP服务器进程发送邮件。当所有待发送邮件发完后,SMTP就关闭所建立的TCP连接。
⑤运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,将邮件放入收信人的用户邮箱,等待收信人在方便时进行读取。
⑥收信人打算收信时,调用用户代理,使用POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中取回(如果邮箱中有来信的话)。
邮箱提供的支持:
我们需要到邮箱设置中开开启POP3/SMTP服务 , 获取授权码 , 如下以QQ邮箱为例,
QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
Java第三方库
我们可以调用activation-1.1.1.jar , mail-1.4.7.jar
第三方库使用java实现发送邮箱功能
Maven导入:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
工作流程:
代码实现:
普通文本邮件发送:
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws MessagingException {
Properties properties = new Properties();
properties.setProperty("mail.host","smtp.qq.com");///设置QQ邮件SMTP服务器
properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议
properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication
//以前QQ邮箱需要设置SSL加密 , 现在不需要了
// MailSSLSocketFactory sf=new MailSSLSocketFactory();
// sf.setTrustAllHosts(true);
// properties.put("mail.smtp.ssl.enable","true");
// properties.put("mail.smtp.ssl.socketFactory",sf);
//1.创建定义整个应用程序所需要的环境信息的session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 设置链接SMTP服务器的用户邮箱,即发送者的邮箱
return new PasswordAuthentication("318482536@qq.com","邮箱厂商提供的校验码");
}
});
//开启session的debug模式,这样可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts=session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","318482536@qq.com","邮箱厂商提供的校验码");
//4.创建邮件:写文件
//注意需要传递session
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("318482536@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("318482536@qq.com"));
//邮件标题
message.setSubject("邮件标题");
//邮件的文本内容
message.setContent("文件内容","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
}
文本内嵌图片邮件发送:
多用途互联网邮件扩展(英语:Multipurpose Internet Mail Extensions,缩写:MIME)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:
- 非ASCII字符文本;
- 非文本格式附件(二进制、声音、图像等);
- 由多部分(multiple parts)组成的消息体;
- 包含非ASCII字符的头信息(Header information)。这个标准被定义在 RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049 等RFC中。
在上面普通文本文件的基础上,在设置邮件内容时,追加如下代码即可
//设置邮件的文本内容
//=================================准备图片数据=======================================
MimeBodyPart image=new MimeBodyPart();
//图片需要经过数据化的处理
DataHandler dh=new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg"));
//在part中放入这个处理过图片的数据
image.setDataHandler(dh);
//给这个part设置一个ID名字
image.setContentID("bz.jpg");
//准备正文的数据
MimeBodyPart text=new MimeBodyPart();
text.setContent("这是一张正文<img src='cid:bz.jpg'>","text/html;charset=UTF-8");
//描述数据关系
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//设置消息内容, 并且保存数据关系
message.setContent(mm);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
附件邮件发送:
在普通本文邮件的基础上添加如下内容即可:
/*************设置邮件的文本内容***********************/
//正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封带有附件的邮件","text/html;charset=utf-8");
//附件
MimeBodyPart appendix = new MimeBodyPart();
appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg")));
appendix.setFileName("附件文件名.jpeg");
// 拼接邮件内容
MimeMultipart allContent = new MimeMultipart();
allContent.addBodyPart(appendix);//附件
allContent.addBodyPart(text);//正文
allContent.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
message.setContent(allContent);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
封装好的工具类:
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailUtil {
public String addresser; //发送者邮箱名
public String hostName; // 邮箱主机名
private String checkCode; // 校验码
private Properties properties; // 配置
private Session session;
private Transport transport;
private boolean isDebug = false;
// 默认用QQ发送
public void properties(){
properties("smtp.qq.com");
}
//配置需要发送的邮箱类型,QQ ,163等
public void properties(String mailHost){
this.hostName = mailHost;
properties = new Properties();
properties.setProperty("mail.host",mailHost);///设置QQ邮件SMTP服务器
properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议
properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication
}
//设置发送者的邮箱信息,如邮箱名, 校验码,是否打印deBug日志
public void senderInfo(String addresser,String checkCode,boolean isDebug) throws MessagingException {
this.addresser = addresser;
this.checkCode = checkCode;
this.session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(addresser,checkCode);
}
});
this.transport = session.getTransport();
this.transport.connect(addresser,checkCode);
}
// 发送普通文本邮件
public void sendTextMailMessage(String recipients,String mailTitle,String mailContent) throws MessagingException {
MimeMessage message=new MimeMessage(this.session);
//设置邮件的发件人
message.setFrom(new InternetAddress(this.addresser));
//设置邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress(recipients));
//邮件标题
message.setSubject(mailTitle);
//邮件的文本内容
message.setContent(mailContent,"text/html;charset=UTF-8");
//5.发送邮件
this.transport.sendMessage(message,message.getAllRecipients());
//6.关闭连接
this.transport.close();
}
}
通过工具类使用:
// 1.创建工具类对象
MailUtil mailUtil = new MailUtil();
// 2.设置服务器主机名
mailUtil.properties(); //默认用QQ邮箱发送,也可以通过有参方法设置别的邮箱发送,设置成别的邮箱服务器主机名即可
//mailUtil.properties("服务器主机名");
// 3.设置发送邮件的相关信息
mailUtil.senderInfo("发送者的邮箱名","邮箱服务厂商提供的校验码",true); //设置发送者的信息
mailUtil.sendTextMailMessage("收件人的邮箱名","邮件标题","邮件内容"); // 设置需要发送的内容标题等信息