java 接收pop3邮件接收 使用socket方式
java 接收pop3邮件接收 使用socket方式。
选用pop3而不适用imap的原因是,pop3不会改变收件箱邮件状态。而imap会。
有几个命令解释下。
POP3命令码
命令
|
描述
|
USER [username]
|
处理用户名
|
PASS [password]
|
处理用户密码
|
APOP [Name,Digest]
|
认可Digest是MD5消息摘要
|
STAT
|
处理请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
|
UIDL [Msg#]
|
处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
|
LIST [Msg#]
|
处理返回邮件数量和每个邮件的大小
|
RETR [Msg#]
|
处理返回由参数标识的邮件的全部文本
|
DELE [Msg#]
|
处理服务器将由参数标识的邮件标记为删除,由quit命令执行
|
RSET
|
处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令
|
TOP [Msg# n]
|
处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数
|
NOOP
|
处理服务器返回一个肯定的响应
|
QUIT
|
终止会话
|
逻辑:
1、创建一个socket,
2、验证用户名、
3、验证密码、
4、获取邮件汇总
5、获取邮件列表
6、读取列表每封邮件
7、获取邮件头信息,因邮件有的邮件有附件比较大,所以读头信息就够了
8、需要下载附件、邮件的时候,再读取整封邮件
9、退出。
测试 demo
package com.ccjr.htra.demo.test; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.nio.charset.StandardCharsets; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import com.ccjr.commons.util.MyDateUtil; import lombok.extern.slf4j.Slf4j; @Slf4j class POP3Demo {
// 邮箱信息 private static String POP3Server = "pop.126.com";private static int POP3Port = 110; private static String uid = "用户名"; private static String pid = "密码"; public static void main(String[] args) { POP3Demo demo = new POP3Demo(); demo.handleEmail(); } public void handleEmail() { Socket client = null; try { // 向POP3服务程序建立一个套接字连接。 client = new Socket(emailhost, POP3Port); // 创建一个BufferedReader对象,以便从套接字读取输出。 InputStream is = client.getInputStream(); BufferedReader sockin = new BufferedReader(new InputStreamReader(is)); // 创建一个PrintWriter对象,以便向套接字写入内容。 OutputStream os = client.getOutputStream(); PrintWriter sockout = new PrintWriter(os, true); String outMsg = ""; // 显示同SMTP服务程序的握手过程。 outMsg = sockin.readLine(); log.info(outMsg); // this.showIn(sockin); sockout.println("user " + uid); outMsg = sockin.readLine(); log.info(outMsg); // this.showIn(sockin); sockout.println("pass " + pid); outMsg = sockin.readLine(); log.info(outMsg); // this.showIn(sockin); sockout.println("stat"); outMsg = sockin.readLine(); log.info(outMsg); // this.showIn(sockin); String temp[] = outMsg.split(" "); int count = Integer.parseInt(temp[1]);// 得到信箱中共有多少封邮件 sockout.println("list"); outMsg = sockin.readLine(); log.info(outMsg); String message = ""; String line = outMsg; while (!".".equalsIgnoreCase(line)) { message = message + line + "\n"; line = sockin.readLine().toString(); } log.info(message); sockout.println("list 8"); outMsg = sockin.readLine(); log.info(outMsg); // 依次打印出邮件的内容 for (int i = 1; i <= count; i++) { // 获取邮件头信息, 其中i表示当前第N封邮件,除了附件大多信息都在头信息中了 sockout.println("top "+i+" 0"); StringBuffer sb = new StringBuffer(); while (true) { String reply = sockin.readLine(); sb.append(reply).append("\n"); if (reply.toLowerCase().equals(".")) { break; } }
System.out.println(sb.toString());
// 保存头信息字符串 TODO ,解析top信息,并判断是否已处理,如果已处理,那么跳过continue。 // 整风邮件读取。 sockout.println("retr " + i); String msg = "第" + i + "封"; log.info("----start------"+msg+"------------"); StringBuffer sb2 = new StringBuffer(); while (true) { String reply = sockin.readLine(); sb2.append(reply).append("\n"); if (reply.toLowerCase().equals(".")) { break; } }
// TODO 存储邮件内容。。
receivedMessageIs.close(); log.info("----------"+msg+"----------end--"); } } catch (IOException e) { log.info(e.toString()); } finally { try { if (client != null) { client.close(); } } catch (IOException e) { } } } }