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) { } } } }

 

posted on 2023-04-05 23:19  陈惟鲜的博客  阅读(313)  评论(0编辑  收藏  举报

导航