技术简介:依托Java,利用smtp,pop3协议的邮件收发系统,其中涉及少量java swing编程
本文主要介绍利用java实现的一个简单的邮件收发系统
大体思路:
1. 配置自己的邮箱,和邮箱授权密码(smtp,pop3需要授权密码,而不是登录密码)
2. 填写好收件人邮箱,邮件主题,邮件内容,然后利用现有的smtp包,调用函数,邮件发送成功
3.利用pop3协议,一次性获取自己的邮箱中所有的邮件,逐层剥离,然后用swing渲染出来
接下来展示利用smtp协议的发送邮件函数与利用pop3协议的接收邮件函数
SendMail.java
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendMail {
public static boolean sendMail(String account,String subject,String content,String fromUser){
if (fromUser == null){
fromUser = "Sayello";
}
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 = "*********";//smtp/pop3授权密码
/*
*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(subject);
//消息发送者接收者设置(发件地址,昵称),收件人看到的昵称是这里设定的
message.setFrom(new InternetAddress(user, fromUser));
message.addRecipients(Message.RecipientType.TO, new InternetAddress[]{
//消息接收者(收件地址,昵称)
// 不过这个昵称貌似没有看到效果
new InternetAddress(account, "Sayello"),});
message.saveChanges();
//设置邮件内容及编码格式
// 后一个参数可以不指定编码,如"text/plain",但是将不能显示中文字符
message.setContent(content, "text/plain;charset=UTF-8");
//发送
Transport.send(message);
transport.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}
ReceiveMail.java
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import java.util.Date;
import java.util.Properties;
public class ReceiveMail {
public static Message[] getAllMails() {
String protocol = "pop3";//使用pop3协议
boolean isSSL = true;//使用SSL加密
String host = "pop.qq.com";//QQ邮箱的pop3服务器
int port = 995;//端口
final String username = "****@qq.com";//邮箱账户
final String password = "******";//smtp/pop3授权密码
/*
*Properties是一个属性对象,用来创建Session对象
*/
try{
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
Properties props = new Properties();
props.put("mail.pop3.auth.plain.disable",true);
props.put("mail.pop3.ssl.enable",true);
props.put("mail.pop3.auth", "true"); //这样才能通过验证
props.put("mail.pop3.ssl.socketFactory", sf);
props.put("mail.pop3.host", host);
props.put("mail.pop3.port", port);
MyAuthenticator myauth = new MyAuthenticator(username, password);
Session session = Session.getDefaultInstance(props,myauth);
/*
* 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_WRITE); // 设置对邮件帐户的访问权限
Message[] messages = folder.getMessages();
System.out.println("count="+messages.length);
int n = folder.getUnreadMessageCount();// 得到未读数量
int n1 = folder.getMessageCount();// 得到邮件总数量
return messages;
} catch (Exception e) {
e.printStackTrace();
}
}catch (Exception e){
e.printStackTrace();
}
System.out.println("接收完毕!");
return null;
}
}
然后附上完整代码包 ,由于本文并没有涉及到很厉害的技术,因此代码包我也就不会长存了,我就放到csdn上面存着了
我写这些代码的过程中遇到很多坑,一直有个坑是控制台报错,说ReceiveMail.java中的下面这个代码报错
store.connect(username, password);
Login fail,缺少SSL什么的,但我确定我在其中配置好了,花了差不多5个小时,后来我感觉是我引入的两个包:mail.jar和javax.mail-1.6.0.jar的冲突问题(按道理不会冲突,代码中也并没有报错)
把mail.jar删了之后竟然就好了,困扰5个小时的问题就好了!!!
现在想想可能是两个jar包里面有些接口是一样的,但是底层有些不同,javax.mail-1.6.0.jar版本新一些,一些安全措施也更加完善,符合了QQ一些摸不着头脑的安全规范
提示一点,用的邮箱不要是最近申请的,我是基于QQ邮箱的,其他邮箱使用时注意端口号可能有所不同,没记错的话,pop3端口163邮箱的是110,QQ邮箱是995
其实只要看懂上面两个函数,代码包也就不用下载了
希望能有所帮助!