Java基于smtp与pop3实现收发邮件的功能

时间:2022-03-13 18:59:12

前言

最近用java实现了收发邮件的功能,网上虽然已经有很多资料,但实际开发过程中还是遇到了一些问题。查阅了不少资料才最终完成,在此分享一下,希望帮助更多的人少走弯路。

背景

javaMail

JavaMail是java提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序,完成收发邮件的功能。
JavaMail并不包含在JDK中,需要我们手动下载并导入。
JavaMail官方下载地址
想要深入了解JavaMail还是要阅读官方文档。
JavaMail官方文档
下载javax.mail.jar包,使用时导入即可。

smtp

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。我们将利用smtp协议来发送邮件。

pop3

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
我们将使用pop3协议来接收邮件。

发送邮件

Talk is cheap.Show me the code!

下面是我实现的一个通过QQ邮箱的smtp服务器发送邮件的demo,通过这个demo,你将看到整个发送邮件的流程。

    public static void main(String[] args){
try {
String host = "smtp.qq.com";//这是QQ邮箱的smtp服务器地址
String port = "25"; //端口号
/*
*Properties是一个属性对象,用来创建Session对象
*/

Properties props = new Properties();
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.ssl.enable", "false");//"true"
props.setProperty("mail.smtp.connectiontimeout", "5000");
final String user = "******@qq.com";//用户名
final String pwd = "******";//密码
/*
*Session类定义了一个基本的邮件对话。
*/

Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//登录用户名密码
return new PasswordAuthentication(user,pwd);
}
});
session.setDebug(true);
/*
*Transport类用来发送邮件。
*传入参数smtp,transport将自动按照smtp协议发送邮件。
*/

Transport transport = session.getTransport("smtp");//"smtps"
transport.connect(host,user,pwd);
/*
*Message对象用来储存实际发送的电子邮件信息
*/

MimeMessage message = new MimeMessage(session);
message.setSubject("邮件标题");
//消息发送者接收者设置(发件地址,昵称),收件人看到的昵称是这里设定的
message.setFrom(new InternetAddress(user,"二师兄"));
message.addRecipients(Message.RecipientType.TO,new InternetAddress[]{
//消息接收者(收件地址,昵称)
//不过这个昵称貌似没有看到效果
new InternetAddress("510172916@qq.com","大师兄"),
});
message.saveChanges();

//设置邮件内容及编码格式
//后一个参数可以不指定编码,如"text/plain",但是将不能显示中文字符
message.setContent("邮件内容..", "text/plain;charset=UTF-8");
//发送
//transport.send(message);
Transport.send(message);
transport.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

接收邮件

仍然用一个demo来总结接收邮件的过程。

public static void main(String[] args){
String protocol = "pop3";//使用pop3协议
boolean isSSL = true;//使用SSL加密
String host = "pop.qq.com";//QQ邮箱的pop3服务器
int port = 995;//端口
String username = "******@qq.com";//用户名
String password = "******";//密码

/*
*Properties是一个属性对象,用来创建Session对象
*/

Properties props = new Properties();
props.put("mail.pop3.ssl.enable", isSSL);
props.put("mail.pop3.host", host);
props.put("mail.pop3.port", port);
/*
*Session类定义了一个基本的邮件对话。
*/

Session session = Session.getDefaultInstance(props);

/*
* Store类实现特定邮件协议上的读、写、监视、查找等操作。
* 通过Store类可以访问Folder类。
* Folder类用于分级组织邮件,并提供照Message格式访问email的能力。
*/

Store store = null;
Folder folder = null;
try {
store = session.getStore(protocol);
store.connect(username, password);

folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);//在这一步,收件箱所有邮件将被下载到本地

int size = folder.getMessageCount();//获取邮件数目
Message message = folder.getMessage(size);//取得最新的那个邮件

//解析邮件内容
String from = message.getFrom()[0].toString();
String subject = message.getSubject();
Date date = message.getSentDate();

System.out.println("From: " + from);
System.out.println("Subject: " + subject);
System.out.println("Date: " + date);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (folder != null) {
folder.close(false);
}
if (store != null) {
store.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("接收完毕!");
}

总结

上面两个demo可以完成最简单的收发邮件功能。
想要实现更加丰富的功能,就去读文档和协议的内容吧。

对本篇博客有疑问可联系leejf1994@outlook.com交流。