`

javamail_接收邮件_pop3接收邮件乱码问题

 
阅读更多

javaMail基础:

Session类,它代表与邮件服务器的Session请求(连接),Session和邮件服务器的关系类似于JDBC中的Connection类和数据库系统的关系。每一个基于JavaMail的应用程序至少有一个Session,但可以有任意多个SessionSession对象需要知道用来处理的SMTP服务器和POP服务器。

Message类:这个类封装了和我们信箱中的电子邮件信息一一对应的属性。

Transport类,Store类:用来发送信息的类,它与Store类从某种意义上说是相反。该类用得最多的是send方法。把Message对象设置完毕后,调用sendMessage)就可以实现发邮件的功能。Store类实现特定邮件协议的读写监视查找等操作。通过javax.mail.Store类可以访问javax.mail.Folder类。该类常用的方法是:connect()方法来连接邮件服务器,getFolder()来得到待操作的Folder对象。

 

javaMail收邮件的操作是:1.连接到Pop3邮件服务器2.得到邮件对象数组3.查看指定邮件的信息4.删除邮件。

 

javamail通过pop3接收到发件人的乱码问题

  

邮件发件人的格式为:姓名+<邮件地址>

 

而有些邮件没姓名,直接是<邮件地址> 。可以把它看成一个字符串,这个字符串先经过编码,然后可以被加密。由于Email的规范,在smtp传输中不可使用中文字符。所以可以使用内置类的MimeUtility方法encodeText将收件人、发件人名字编码即可。编码方式有两种:"B"代表Base64"Q"代表QPquoted-printable)方式。

 

字符串的编码方式:一个字节为8bits,一个字为16bit,编码方式的不同体现在用多少bit表示一个字符。字符串由字符组成,按照不同的编码显示会完全不同。这就是中文乱码问题的所在。JavaString中有getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。getBytes(Charset charset) 使用给定的charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。getBytes(String charsetName)   使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。如果需要加密,就对此byte数组加密。

 

我从163pop3的服务器上读取我的邮件,并输出发件人。中文出现了乱码。收件人字符串格式有:utf-8gbkgb2312gb18030

加密形式有"B"代表Base64如:=?gb2312?B?1sfBqtXQxrj=?=<a.jiaji@support150.zhaopin.com>",可以看出,这个字符串的编码格式是:gb2312,而采用了base64加密。QQPquoted-printable)方式:=?utf-8?Q?=E4=B8=AD=E5=8D=8E=E8=8B=B1=E6=89=8D=E7=BD=91?=campusys2010@mychinahr.com可以看出这个字符串采用的编码格式是:utf-8,而采用了quoted-printable加密。

 

对于没有加密的字符串,直接用rtnStr=new String(str.getBytes("iso-8859-1"));就能正确显示。对于加密的字符串,需要用rtnStr=MimeUtility.decodeText(str);就能解决

 

我们需要取出邮件地址+发件人名字,发件人名字有些是没有的,这给处理带来了难度,用正则表达式分组可以解决这个问题。也就是说名字可以没有,但是发件人的邮件地址是一定有的。

 

将得到的收件人字符串通过如下的方法:

 

通过正则表达式可以将发件人的名字和地址分别取出。

 

 

 //用匹配=?.*?[B|Q]的加密形式,工作过程是:首先对字符串编码,然后加密:"B"代表Base64、"Q"代表QP(quoted-printable)方式
 //对于加密的形式需要进行解密。
 
    private static Pattern p=Pattern.compile("((=//?.*//?[B|Q])(.*))([<](.*)[>]$)",Pattern.CASE_INSENSITIVE);
    
    //对于没有加密的编码,直接用new String(str.getBytes("iso-8859-1")),java中默认的编码是GBK.
    

private static Pattern p1=Pattern.compile(".*",Pattern.CASE_INSENSITIVE);
    private static Matcher m=null;
    private static Matcher m1=null;

    public static String getChinese(String str){
     String rtnStr="";
     m=p.matcher(str);
     m1=p1.matcher(str);
     try {
      if (m.find()) {
       if (m.group(1)!=null) {
        rtnStr=MimeUtility.decodeText(m.group(0));
        
    }else if (m.group(5)!=null){
       //rtnStr="为定义的名字";
        rtnStr=new String(m.group(0).getBytes("iso-8859-1"));
    }
       }else if(m1.find()){
        //System.out.println(m1.find());
     
      rtnStr=new String(m1.group().getBytes("iso-8859-1"));
     
      
   }            
  } catch (Exception e) {
   rtnStr=str;
   e.printStackTrace();
  }
  System.out.println(rtnStr);
  return rtnStr;
    }

 

 

 

 

 

 得到邮件主题的乱码问题:

 

 

邮件主题的乱码不是很复杂,和收件人一样。编码后加密,当然有的也不加密。我们可以对得到的字符串先进行new String(str.getBytes("iso-8859-1")),然后再判断有无? = Q等特殊字符,有的话用MimeUtility.decodeText()就可以解决了。代码如下:

 

public static String getSubChinese(String str){
     String rtnStr="";
     try {
      rtnStr=new String(str.getBytes("iso-8859-1"));
      
      if (rtnStr.contains("=")) {
       rtnStr=MimeUtility.decodeText(str);
   }
   
  } catch (UnsupportedEncodingException e) {
   rtnStr=str;
   e.printStackTrace();
  }
  System.out.println(rtnStr);
  return rtnStr;
    }
}

 

 

分享到:
评论

相关推荐

    javamail发送html邮件

    JavaMail API 是一个用于发送、接收电子邮件的标准接口集合,它支持多种协议(如 SMTP、IMAP 和 POP3),使得 Java 应用程序能够轻松地发送和接收电子邮件。 #### 二、发送 HTML 格式的邮件 在实际应用中,经常需要...

    james和javamail实现邮件收发(带发送附件)

    JavaMail API提供了相应的设置,可以避免乱码问题。 5. **发送邮件**:最后,通过`Transport.send()`方法将邮件消息发送出去。在此过程中,JavaMail会与SMTP服务器建立连接,验证身份(如果需要),并传输邮件。 ...

    JavaMail开发原理简介PPT

    JavaMail 是一种在Java应用程序中实现电子邮件发送和接收的API,它允许开发者通过标准的邮件协议(如SMTP、POP3和IMAP)与邮件服务器进行交互。本PPT旨在介绍JavaMail的开发原理,虽然没有具体的代码示例,但涵盖了...

    javamail 邮件系统

    JavaMail邮件系统是一种基于Java平台的邮件发送和接收解决方案,它允许开发者通过编程方式与SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)等邮件服务器进行交互。在JavaMail中,...

    JavaMail结合JSP实现中文邮件收发系统.rar

    在处理中文字符时,JavaMail API支持MIME(多用途互联网邮件扩展)编码,确保非ASCII字符(如中文)在传输过程中不会出现乱码问题。 JSP是Java的一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现...

    jsp/servlet javamail 发送邮件 可发送多个附件

    1. **JavaMail API**: JavaMail API是Java平台上的标准邮件服务接口,提供了创建、发送和接收邮件的能力。它支持SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP(因特网消息访问协议)等邮件协议,使得...

    Javamail开发

    在实际开发中,还会遇到一些常见问题,如中文附件的乱码问题、Tomcat中JavaMail的兼容性和冲突问题,以及如何高效地实现邮件群发。 邮件开发涉及的基本概念包括邮件服务器和电子邮箱。邮件服务器扮演着类似现实生活...

    Java邮件开发详解-张孝祥 ppt

    此外,还涵盖了处理中文名附件乱码、Tomcat中JavaMail支持及可能的冲突问题,以及如何开发SMTP邮件服务器等高级应用。 学习邮件开发主要包括两个核心部分:一是发送与接收邮件,二是创建与解析邮件内容。邮件的发送...

    JavaMail 发送邮件

    JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中发送和接收电子邮件。它提供了丰富的 API,使得开发者可以方便地实现 SMTP、POP3 和 IMAP 协议的功能,进行邮件的发送、接收、读取和管理。在本文中,我们将...

    Java邮件开发源代码.zip

    这个API支持SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议),使得开发者可以编写程序来发送、接收和管理邮件。 JavaMail API的主要类包括: 1. `Session`:这是邮件会话对象,负责设置...

    javamail资料

    - 遵循邮件编码规则,尤其是处理非 ASCII 字符时,以防止乱码问题。 - 如果可能,使用 SMTP 服务器的 STARTTLS 或者 SSL/TLS 加密选项。 JavaMail 是 Java 开发者处理电子邮件的强大工具,无论是在企业级应用还是...

    传智播客张孝祥Java邮件开发学习笔记

    JavaMail是Java中处理邮件发送和接收的API,其体系结构包括API分类以及JavaBeans Activation Framework(JAF),后者用于处理数据类型和转换等问题。利用JavaMail API,开发人员可以编写Java程序来处理邮件发送任务...

    邮件的收发.pptx

    - **中文名的邮件附近乱码问题**:确保使用正确的字符集编码(如UTF-8)来避免乱码问题。 - **Tomcat中JavaMail支持与冲突问题**:配置合适的库版本,解决兼容性问题。 - **SMTP邮件服务器程序的开发**:涉及邮件...

    javaMail.zip

    JavaMail 还支持其他的邮件协议,如POP3(用于接收邮件)和IMAP(用于访问邮件服务器上的邮件)。此外,它还提供了许多高级特性,如S/MIME(用于加密和签名邮件)和JAF(JavaBeans Activation Framework,用于处理...

    JavaMail组件开发

    2. 接收邮件问题:确保POP3或IMAP服务器设置无误,注意网络连接和服务器状态。 3. 附件问题:使用MIME技术处理附件,确保编码正确,避免乱码。 六、应用场景 JavaMail组件广泛应用于企业级应用中,如自动发送通知...

    Java自带的Java-mail框架 163 邮件发送,支持多附件,没中文乱码

    JavaMail是Java编程语言中的一个开源库,用于处理电子邮件通信,包括发送、接收邮件以及管理邮件附件。在JavaMail框架的帮助下,开发者可以方便地实现SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP...

    简单的javamail例子 (源码)

    JavaMail 是一个用于发送和接收电子邮件的 Java API。它基于 JavaBeans 的设计模式,允许开发者轻松地集成邮件功能到 Java 应用程序中。JavaMail 可以处理多种邮件协议(如 SMTP、POP3 和 IMAP),并且支持多种附件...

    javaMai开发教程

    此外,你将学习如何实现类似新浪、搜狐那样的Web邮件发送功能,以及如何解决邮件开发过程中遇到的问题,如中文附件的乱码问题、Tomcat环境中JavaMail的配置与冲突,以及邮件群发的实现。 邮件开发涉及到的基本概念...

    java mail 收发邮件Demo源码

    接收邮件通常使用`Store`接口,根据不同的邮件协议(如POP3或IMAP)连接到邮件服务器。登录后,可以获取`Folder`对象,打开并遍历其中的`Message`。对于每条消息,可以提取发件人、收件人、主题、日期等信息,并...

Global site tag (gtag.js) - Google Analytics