邮件收取配置过程
< 返回列表时间: 2020-04-18来源:OSCHINA
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
收取邮件(带附件)有几个过程
1.接收邮件
a.确定对象邮箱的协议、端口和密码等参数
b.通过Properties类配置(协议、端口和服务器)参数
c.用session储存这些配置,用于定义环境信息
d.通过Store取session里的参数来连接邮箱
f.通过Folder获得收件箱()(Folder是操作邮件的对象)

2.解析邮件
a.通过Message[]获得收件箱中邮件
b.通过MimeMessage 获取单个邮件处理对象,MimeMessage是Message子类,实例对象表示一封邮件
3.保存附件
a.通过Multipart获取复杂体邮件处理对象
b.通过BodyPart获取复杂邮件的一个邮件体,BodyPart是Multipart的一个属性,图片、附件等节点都可以通过BodyPart组合成一个混合的Multipart整体
4.读取并处理输入流
学习链接:
MIME協議在郵件中的應用詳解
JavaMail發送郵件简单示例
附上个人学习demo: public class mytest { public static void main(String[] args) throws Exception { String duankou = "110";// 端口号 String servicePath = "pop.qiye.aliyun.com";// 服务器地址(收件端) String xieyi = "pop3";// 协议(邮箱类型) String mail = " ";// 邮件地址 String password = ""; String mydes = "H:\\ ";// 附件保存路径(文件不用另外命名) receive(duankou, servicePath, xieyi, mail, password, mydes); } // 接收邮件 public static void receive(String duankou, String servicePath, String xieyi, String mail, String password, String mydes) throws Exception { // 准备连接服务器的会话信息 Properties props = new Properties(); props.setProperty("mail.store.protocol", xieyi); // 使用pop3协议(指定接收邮件的协议) // props.setProperty("mail.transport.protocol", xieyi); // 使用pop3协议(指定发送邮件的协议) props.setProperty("mail.pop3.port", duankou); // 端口 props.setProperty("mail.pop3.host", servicePath); // pop3服务器 // 创建Session实例对象 Session session = Session.getInstance(props); Store store = session.getStore(xieyi); // store.connect(host, user, password); store.connect(mail, password); // 获得收件箱 Folder folder = store.getFolder("INBOX");//通过pop3协议获取某个邮件夹的名称只能为inbox folder.open(Folder.READ_WRITE); // 打开收件箱 //folder.open(Folder.READ_ONLY); // 得到收件箱中的所有邮件,并解析 // Message[] messages = folder.getMessages(); Message[] messages = folder.search(new SubjectTerm("要访问的邮件主题名称")); parsingMessage(messages, mydes); } // 解析邮件 public static void parsingMessage(Message[] messages, String mydes) throws Exception { // 解析所有邮件 for (int i = 0, count = messages.length; i < count; i++) { MimeMessage msg = (MimeMessage) messages[i]; msg.getMessageNumber();//第几封邮件 MimeUtility.decodeText(msg.getSubject());//邮件主题 msg.getSentDate();//发送时间 msg.getSize();//邮件大小(兆) boolean isContainerAttachment = isContainAttachment(msg);//是否包含附件 if (isContainerAttachment) { saveAttachment(msg, mydes); // 保存附件 } StringBuffer content = new StringBuffer(30);//content是邮件正文 //获取邮件正文 content.toString();//对纯文本的适用 //getMailTextContent(msg, content);//针对复杂体邮件 } } //获取邮件文本内容 /* public static void getMailTextContent(Part part, StringBuffer content) throws Exception { boolean isContainTextAttach = part.getContentType().indexOf("name") > 0; if (part.isMimeType("text/*") && !isContainTextAttach) {//邮件是纯文本,并且文本不为空 content.append(part.getContent().toString()); } else if (part.isMimeType("message/rfc822")) { //message/rfc822单一邮件体文件 getMailTextContent((Part) part.getContent(), content); } else if (part.isMimeType("multipart/*")) { //multipart/*复杂体邮件,如带附件邮件 Multipart multipart = (Multipart) part.getContent(); int partCount = multipart.getCount(); for (int i = 0; i < partCount; i++) { BodyPart bodyPart = multipart.getBodyPart(i); getMailTextContent(bodyPart, content); } } } **/ // 保存附件 public static void saveAttachment(Part part, String destDir) throws Exception { if (part.isMimeType("multipart/*")) { // multipart/*包含附件的邮件 Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件 // 复杂体邮件包含多个邮件体 int partCount = multipart.getCount(); for (int i = 0; i < partCount; i++) { // 获得复杂体邮件中其中一个邮件体 BodyPart bodyPart = multipart.getBodyPart(i); // 某一个邮件体也有可能是由多个邮件体组成的复杂体 String disp = bodyPart.getDisposition(); if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { // 表示msg已经有内容,文件已经下来或可以打开 InputStream is = bodyPart.getInputStream(); saveFile(is, destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码 } else if (bodyPart.isMimeType("multipart/*")) { saveAttachment(bodyPart, destDir); } else { String contentType = bodyPart.getContentType(); if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) { saveFile(bodyPart.getInputStream(), destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码 } } } } else if (part.isMimeType("message/rfc822")) { saveAttachment((Part) part.getContent(), destDir);// getContent是获取邮件内容并加以显示 } } // 是否包含附件 public static boolean isContainAttachment(Part part) throws Exception { boolean flag = false; if (part.isMimeType("multipart/*")) { MimeMultipart multipart = (MimeMultipart) part.getContent(); int partCount = multipart.getCount(); for (int i = 0; i < partCount; i++) { BodyPart bodyPart = multipart.getBodyPart(i); String disp = bodyPart.getDisposition(); if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { flag = true; } else if (bodyPart.isMimeType("multipart/*")) { flag = isContainAttachment(bodyPart); } else { String contentType = bodyPart.getContentType(); if (contentType.indexOf("application") != -1) { flag = true; } if (contentType.indexOf("name") != -1) { flag = true; } } if (flag) break; } } else if (part.isMimeType("message/rfc822")) { flag = isContainAttachment((Part) part.getContent()); } return flag; } // 读取输入轮流保存到指定位置 public static void saveFile(InputStream is, String destDir, String fileName) throws Exception { BufferedInputStream bis = new BufferedInputStream(is); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir + fileName))); int len = -1; while ((len = bis.read()) != -1) { bos.write(len); bos.flush(); } bos.close(); bis.close(); } }


热门排行