javamail读取完整的邮件

javamail fetch函数 预取标题,uid等 fetchpublic void fetch(Message[] msgs, FetchProfile fp) throws MessagingExceptionPrefetch the items specified in the FetchProfile for the given Messages. Clients u 阅读详情
  Javamail API虽然功能封装的比较完整,但是要写一个能正确显示复杂邮件的程序还有很多逻辑和细节要处理。下面是我最近做一个webmail时整理的 Servlet,基本上可以正确的读取text,HTML,HTML中显示图片及附件。在本servlet中也简单处理了常见的中文问题,包括主题、附件、HTML图片中文、email Address中文。总体感觉有两个难点:1、附件和网页图片的抓取,需要定位数节点nodeid,光用partid是不行的;2、中文分两种情况 Base64和客户端服务器端编码不一致。本程序中实现了3种displayPart()的方法,具体情况不同结合使用效率更高。本程序还有一个未处理的地方就是我在做nodeid的时候最多算10个。当然还有其他问题欢迎指正,来出是为了给后来的初学者作个参考例子,少走弯路。
          import java.io.IOException;
  import java.io.InputStream;
  import java.io.UnsupportedEncodingException;
  import java.util.HashMap;
  import javax.mail.Folder;
  import javax.mail.Message;
  import javax.mail.MessagingException;
  import javax.mail.Multipart;
  import javax.mail.Part;
  import javax.mail.Store;
  import javax.mail.internet.InternetAddress;
  import javax.mail.internet.MimeUtility;
  import javax.servlet.ServletException;
  import javax.servlet.ServletOutputStream;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
  import chunwei.mail.Login;
  import chunwei.mail.MailUserData;
  /**
  * Servlet implementation class for Servlet: MailServlet
  * Author: luchunwei Email: luchunwei@gmail.com
  */
  public class MailNode extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  nodeid="";
  node="0";
  currentnodeid=0;
  url=request.getRequestURL().toString();
  HttpSession ses=request.getSession();
  MailUserData mud=(MailUserData)ses.getAttribute("mud");
  ServletOutputStream out=response.getOutputStream();
  response.setContentType("text/html;charset=GB2312");
  int msgid=-1,partid=-1;
  String partname=null;
  String nodepara=null;
  if (request.getParameter("msgid")!=null)
  msgid=Integer.parseInt(request.getParameter("msgid"));
  msgidStr="msgid="+msgid;
  if (request.getParameter("partid")!=null)
  partid=Integer.parseInt(request.getParameter("partid"));
  if (request.getParameter("partname")!=null)
  partname=new String(request.getParameter("partname").getBytes("ISO-8859-1"),"GB2312");
  if (request.getParameter("node")!=null)
  nodepara=request.getParameter("node");
  System.out.println(nodepara);
  //System.out.println(msgid+":"+partid+":"+partname);
  if (partname!=null){
  //displayImages
  try {
  displayPart(partname,response,out);
  } catch (MessagingException e) {
  e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  }
  return;
  }
  //--------------------------
  if (mud==null){
  Login login=new Login("imap","mail.server.com",-1,"user","password");
  login.login();
  if (login.getResult()==1){
  HttpSession session = request.getSession();
  session.setMaxInactiveInterval(3600);
  session.setAttribute("mud",login.getMud());
  }
  mud=(MailUserData)ses.getAttribute("mud");
  }
  //---------------------------
  if (mud==null){
  out.print("<error>Login First(No Session)</error>");
  } else{
  //Folder folder=mud.getFolder();
  try {
  //------------------------
  Store store=mud.getStore();
  Folder folder=store.getFolder("INBOX");
  folder.open(Folder.READ_ONLY);
  //------------------------
  Message m=folder.getMessage(msgid);
  //if(partid==-1){
  if (nodepara==null){
  //if(!imgs.isEmpty())imgs.clear();
  messageHtml="";
  attachment="";
  recipients=getAllgetRecipients(m);
  out.print(displayMessage(request,m,partid));
  } else{
  displayPart(m,nodepara,response,out);
  }
  } catch (MessagingException e) {
  e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doGet(request,response);
  }
  String stdUrl="";
  String url="";
  String msgidStr="";
  String messageHtml="";
  String attachment="";
  String recipients="";
  String nodeid="";
  int currentnodeid=0;
  String node="";
  HashMap<String,Part> imgs=new HashMap<String,Part>();
  public String displayMessage(HttpServletRequest request,Part p,int partid) throws Exception{
  //System.out.println("Type:"+p.getContentType());
  if (currentnodeid==1&&!node.endsWith("0")){
  nodeid=nodeid.substring(0,(nodeid.length()-2));
  }
  node=nodeid+currentnodeid;
  System.out.println(node);
  if (p.isMimeType("multipart/*")){
  nodeid+=currentnodeid+"-";
  Multipart mp=(Multipart) p.getContent();
  int cnt=mp.getCount();
  String mpct=mp.getContentType().toLowerCase();
  for (int i=0;
  i   i++){
  if (mpct.startsWith("multipart/alternative")&&mp.getBodyPart(i).getContentType().toLowerCase().startsWith("text/plain"))continue;
  currentnodeid=i;
  displayMessage(request,mp.getBodyPart(i),i);
  }
  }
  if (p.isMimeType("text/plain")||p.isMimeType("text/html")){
  if (messageHtml=="") {
  messageHtml=(String)p.getContent();
  //System.out.println(messageHtml);
  } else {
  messageHtml=messageHtml+"
  //System.out.println(messageHtml);
  }
  } else if (p.isMimeType("message/rfc822")) {
  //Nested Message
  //displayMessage(request,(Part)p.getContent(),partid);
  } else{
  if (node.length()>2) node=node.substring(2);
  System.out.println(node);
  String disposition=p.getDisposition();
  //System.out.println("disposition:"+disposition);
  if (disposition!=null&&disposition.equalsIgnoreCase(Part.ATTACHMENT)){
  String filename=getFileName(p);
  //imgs.put(filename,p);
  //attachment全部放入内存,会造成内存膨胀;若及时清空又造成Back回来的页面访问不到Attachment
  //attachment+=","+"<a href='"+url+"/"+filename+"?"+msgidStr+"&partid="+partid+"'>"+filename+"</a>";
  attachment+=","+"<a href='"+url+"/"+filename+"?"+msgidStr+"&node="+node+"'>"+filename+"</a>";
  //attachment+=","+"<a href='"+url+"/"+filename+"?"+"&partname="+getFileName(p)+"'>"+filename+"</a>";
  //System.out.println(attachment);
  } else{
  //if(disposition!=null&&disposition.equalsIgnoreCase(Part.INLINE)){
  if (getCid(p)!=null) {
  //System.out.println("Enter Replace");
  imgs.put(getFileName(p),p);
  //String uri=url+"?"+msgidStr+"&partid="+partid;
  String uri=url+"?"+msgidStr+"&node="+node;
  //String uri=url+"?"+"&partname="+getFileName(p);
  String t=messageHtml.substring(messageHtml.indexOf(getCid(p))-1);
  if (!(t.startsWith("/"")||t.startsWith("/'"))){
  uri="'"+uri+"'";
  }
  messageHtml=messageHtml.replace(getCid(p),uri);
  //System.out.println("cid:"+getCid(p));
  //System.out.println(uri);
  }
  }
  }
  return messageHtml+"attachhncwx="+attachment+recipients;
  }
  public void displayPart(Message m,String node,HttpServletResponse response,ServletOutputStream out)
  throws MessagingException, IOException{
  Part part = getPart(m,node);
  String sct = part.getContentType();
  response.setContentType(sct);
  outPut(part,out);
  }
  private Part getPart(Part m, String nodes) throws NumberFormatException, MessagingException, IOException {
  if (node==null)return m;
  String node=nodes.substring(0,1);
  System.out.println(nodes+" : "+node);
  int nid=Integer.parseInt(node);
  if (m.getContent()==null)System.out.print("no content");
  Part p=((Multipart)m.getContent()).getBodyPart(nid);
  if (nodes.length()>2)nodes=nodes.substring(2);
  else {
  if (nodes.length()==1)nodes="";
  }
  if (nodes.length()>0)p=getPart(p,nodes);
  return p;
  }
  public void displayPart(String partname,HttpServletResponse response, ServletOutputStream out) throws MessagingException, IOException{
  //System.out.println(imgs.keySet()+":"+partname);
  Part part=imgs.get(partname);
  String ct=part.getContentType();
  if (ct!=null) response.setContentType(ct);
  //=====Start push Stream into out
  InputStream in=part.getInputStream();
  ByteArrayOutputStream bos=new ByteArrayOutputStream();
  byte [] buffer=new byte[8192];
  int count=0;
  while ((count=in.read(buffer))>=0) bos.write(buffer,0,count);
  in .close();
  try{
  out.write(bos.toByteArray());
  out.flush();
  } catch(Exception e){
  }
  out.close();
  //=====End
  }
  public void displayPart(Message m,int partid,HttpServletResponse response, ServletOutputStream out) throws MessagingException, IOException{
  Multipart mp = (Multipart)m.getContent();
  Part part = mp.getBodyPart(partid);
  String sct = part.getContentType();
  // ContentType ct = new ContentType(sct);
  response.setContentType(sct);
  if (sct == null) {
  out.println("invalid part");
  return;
  }
  //=====Start push Stream into out
  InputStream in=part.getInputStream();
  ByteArrayOutputStream bos=new ByteArrayOutputStream();
  byte [] buffer=new byte[8192];
  int count=0;
  while ((count=in.read(buffer))>=0) bos.write(buffer,0,count);
  in .close();
  try{
  out.write(bos.toByteArray());
  out.flush();
  } catch(Exception e){
  }
  out.close();
  //=====End
  }
  private String getFileName(Part p) throws MessagingException, UnsupportedEncodingException{
  //System.out.println("filename:");
  String filename=p.getFileName();
  if (filename==null)return null;
  filename=new String(filename.getBytes("ISO-8859-1"),"GB2312");
  int indexStart=filename.toUpperCase().indexOf("=?GB");
  if (indexStart>-1){
  filename=filename.substring(0,indexStart)+MimeUtility.decodeText(filename.substring(indexStart));
  }
  return filename;
  }
  private String getCid(Part p) throws MessagingException{
  String cidraw=null,cid=null;
          String [] headers=p.getHeader("Content-id");
  if (headers!=null && headers.length>0) {
  cidraw=headers[0];
  } else{
  return null;
  }
  if (cidraw.startsWith("<")&&cidraw.endsWith(">")) {
  cid="cid:"+cidraw.substring(1,cidraw.length()-1);
  } else {
  cid="cid:"+cidraw;
  }
  return cid;
  }
  /**
  * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
  * @throws Exception
  */
  private String getAllgetRecipients(Message m) throws Exception{
  return "mailaddrTo=" +getRecipients(m,"TO")
  +"mailaddrCc="+getRecipients(m,"CC")
  +"mailaddrBcc="+getRecipients(m,"BCC");
  }
  private String getRecipients(Message m,String type) throws Exception {
  StringBuffer mailaddr = new StringBuffer("");
  String addtype = type.toUpperCase();
  InternetAddress[] address = null;
  if (addtype.equals("TO")) {
  address = (InternetAddress[]) m.getRecipients(Message.RecipientType.TO);
  } else if (addtype.equals("CC")) {
  address = (InternetAddress[]) m.getRecipients(Message.RecipientType.CC);
  } else {
  address = (InternetAddress[]) m.getRecipients(Message.RecipientType.BCC);
  }
  if (address != null) {
  for (int i = 0;
  i < address.length; <br >   i++) {
  String email = address[i].getAddress();
  if (email == null)
  email = "";
  else {
  email = MimeUtility.decodeText(email);
  }
  String personal = address[i].getPersonal();
  if (personal == null)
  personal = "";
  else {
  personal = MimeUtility.decodeText(personal);
  }
  mailaddr.append("/""+personal+"/" ");
  mailaddr.append("<");
  mailaddr.append(email);
  mailaddr.append(">");
  mailaddr.append(",");
  }
  }
  if (mailaddr.length()>0)mailaddr.deleteCharAt(mailaddr.length()-1);
  return mailaddr.toString();
  }
  private void outPut(Part part,ServletOutputStream out) throws IOException, MessagingException{
  //=====Start push Stream into out
  InputStream in=part.getInputStream();
  ByteArrayOutputStream bos=new ByteArrayOutputStream();
  byte [] buffer=new byte[8192];
  int count=0;
  while ((count=in.read(buffer))>=0) bos.write(buffer,0,count);
  in .close();
  try{
  out.write(bos.toByteArray());
  out.flush();
  } catch(Exception e){
  }
  out.close();
  //=====End
  }
}
        本文转自
http://java.poac.ac.cn/codeopen/html/jishuwenzhang/JavaEE/2007/0606/458.html  
java之邮件读取和解析 本文通过demo的形式描述JavaMail邮件收发的整个过程,大家可自行复制demo到本地测试。另外,本文邮件接收采用IMAP方式,POP3的接收过程与之类似,但IMAP功能更加完善,推荐使用IMAP。 阅读详情

相关推荐

CANoe UDS $27服务DLL生成实战:从工程配置到算法修改全流程

本文详细介绍了在Vector CANoe中为UDS(统一诊断服务)的$27安全访问服务生成定制化DLL(动态链接库)的全流程。从定位官方参考工程、配置Visual Studio开发环境,到深入解析核心的GenerateKeyEx函数接口,并重点演示了如何修改和实现自定义的种子-密钥安全算法,最终完成DLL的编译、部署与CANoe集成测试,为汽车电子诊断开发提供实战指导。

star5的专栏 534

利用JavaMail实现邮件的收取

     昨天写了一个利用JavaMail发送邮件的示例,本着有始有终的原则。今天写了一篇利用JavaMail收取邮件的示例。由于实力有限,代码写的不周到的地方,请大家见亮。本人只是写了一个简单的例子,在实际项目开发中,还有很多东西需要读者自己去斟酌和修改。废话不多说,直接上代码。 1、一些参数配置的常量类 package com.bao.receivemail; /** * 邮件配...

让爱远航——当我们老去,该干点嘛! 732

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 262

【Java用法】java使用javax.mail读取邮箱,SpringBoot javax.mail获取邮件内容,根据时间段筛选邮件,内附代码,拿来即用

package com.iot.daily.module.web; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import java.io.*; import java.text.SimpleDateFormat; import java.util.Array.

No8g攻城狮的博客 4757

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4591

通过 Java 中 5 种流行的方法提取电子邮件

在本文中,我们将探讨如何利用 Java 库的强大功能,通过 POP3、IMAP、EWS、Graph API 以及以 pst 文件为示例从各种格式的离线邮箱存储中检索电子邮件。

励志做最业余的专业博主,控件产品可以私我~ 3190

手把手教你用STM32F303和LAN9252搭建EtherCAT从站(附IO/AD/DA完整代码)

本文详细介绍了如何使用STM32F303和LAN9252搭建EtherCAT从站,涵盖硬件选型、开发环境配置、协议栈移植及IO/AD/DA功能实现。通过实战指南和完整代码,帮助开发者快速掌握工业自动化中的实时通信技术,提升系统性能与可靠性。

weixin_26802933的博客 235

java 读邮件_javamail读取完整的邮件

1importjava.io.IOException;2importjava.io.InputStream;3importjava.io.UnsupportedEncodingException;4importjava.util.HashMap;5importjavax.mail.Folder;6importjavax.mail.Message;7import...

weixin_35882722的博客 1174

【ArcGIS Pro微课1000例】0065:制作千层饼多图层叠加效果

右键dem图层,点击符号系统,在右侧的符号系统窗口中,选择拉伸,勾选【显示名称】和【显示全部】,选择高程色带7。由于数据具有高程源,因此可以将数据进行三维显示。右键地面→添加高程源图层。打开ArcGIS PRo,新建一个局部场景,命名为千层饼。设置了高程源数据之后,千层饼一下子就变成了三维形状。数据默认都是在一个平面上,以默认的符号系统显示。到此为止,每个图层均为平面的千层饼已经做好了。将TIN图层的高程偏移设置为-1000。最后将等高线的高程设为2000.移除工程默认加载的图层。默认即可,不需要做修改。

智慧空间实验室 1155

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 349

java gmail imap,使用JavaMail从GMail中读取完整的电子邮件

I am making use of javamail and I am having trouble getting the HTML from my gmail emails. I have the following:Session session = Session.getDefaultInstance(props, null);Store store = session.getStore...

weixin_34984088的博客 850

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4010

java mail header_javamail读取完整的邮件

1importjava.io.IOException;2importjava.io.InputStream;3importjava.io.UnsupportedEncodingException;4importjava.util.HashMap;5importjavax.mail.Folder;6importjavax.mail.Message;7import...

weixin_33480380的博客 476

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaMail发送邮件

Java Mail入门第四篇

qq_53456479的博客 305

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java邮件发送:基于JavaMail

javax.mail mail 1.4.7         最近需要写一个项目自动发包的功能,需要每次提新需求的时候都有邮件通知相关人,写了一个邮件发送的工具类,这里用到的java里面的javamail模块,但是在下载的jdk里面是不包含这个模块的,所以需要我们自己去下载,我这里是使用Maven javax.mail mai

陈洪杰的博客 1465

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring+javamail+velocity发送邮件

最精做到一个项目需要用到邮箱验证,所研究了一下   首先需要jar包: org.springframework.context.support-3.1.2.RELEASE.jar (封装了javamail的相关api) mail.jar;   velocity-1.4.jar  velocity-tools-view-1.2.jar    activation.jar

zhou405680603的专栏 2695

javamail发送html邮件

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.net.URI; /** * 读取邮件模板 * * @author wangzi6hao * */ public ...

wangzi6hao的专栏 202

使用JavaMail收发Internet邮件

JavaMail是JavaEE中的一个组件,用来开发邮件客户端程序(MUA)。JavaMail API本身是与具体的消息协议无关的,可以在运行程序之前设置实现具体协议的providers,例如在Sun的mail.jar中提供了一个缺省的文件 javamail.default.providers,里面提供了三个协议(imap, smtp和pop3)的实现,其中smtp的provider类是com.s...

weixin_30662011的博客 144

java收邮件完整代码

下面是用 Java 收取邮件的完整代码示例: import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; public class MailReceiver { public stat...

weixin_42611310的博客 459

javamail发送二进制流附件的问题

最近做个邮件发送功能,要内嵌图片并有附件。 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下javamail的文档。 添加附件方法如下 MimeBodyPart messageBodyPart=new MimeBodyPart(); DataSource dataSource1=new FileDataSource("d:/xx.doc"); //DataSourc...

denghe1886的博客 461

SendMail发送回执及读取收件箱

一、SendMail发送有回执提示   1.邮件发送配置 Properties props = new Properties(); String smtp = "smtp.qq.com"; //使用域名地址,建议不要使用ip地址,因为IP有可能会换掉。 String servername = "******@qq...

dbzn13732的博客 841

邮件功能开发--JavaMail

本节摘要:本节主要简单介绍一下javamail插件的使用 引入:最近项目中要做一个简单的邮件功能,即从前台输入邮件内容,去配置文件中读取发件人、收件人等信息后,然后发送邮件到指定的邮箱,其中收件人和抄送人可以有多个,基于这个需求,查询了相关资料,决定采用javamail这个插件来实现。 preparation: 1.JavaMail的介绍 JavaMail,顾名思义,提供给开发者...

weixin_30478619的博客 368
上一篇: java代码编写的30条建议
下一篇: Oracle SQL性能优化技巧大总结
superjava_2006
博客等级 码龄20年 39粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值