`

Java Mail无法解析带分号的收件人列表的问题

    博客分类:
  • J2SE
阅读更多
Java Mail无法解析带分号的收件人列表的问题
分类: JAVA 2010-01-21 22:39 1553人阅读 评论(4) 收藏 举报
java邮件服务器邮件工具propertiesmicrosoftgmail
Java Mail无法解析带分号的收件人列表的问题
      今天同事碰到一个问题,使用JAVA MAIL收取邮件时,如果收件人是个列表,且收件人列表是以分号进行分割的,则JAVA MAIL就会出现异常,不能正常解析,抽空看了一眼,自己写了个简单demo,很简单,例如:
 
[java] view plaincopy
@Test  
public void testReceiveMail() {  
          
        try {  
                String host = "pop3.163.com";  
                Properties pops = new Properties();  
                pops.put("mail.pop3.host", host);  
                pops.put("mail.pop.auth", "true");  
                Session session = Session.getDefaultInstance(pops, null);  
                Store store = session.getStore("pop3");  
                //连接邮件服务器  
                store.connect(host, "chb_go", "3870359346");  
                //收取收件箱  
                Folder inbox = store.getDefaultFolder().getFolder("INBOX");  
                //只读足够了  
                inbox.open(Folder.READ_ONLY);  
                //得到所有邮件列表  
                Message[] msg = inbox.getMessages();  
                FetchProfile profile = new FetchProfile();  
                profile.add(FetchProfile.Item.ENVELOPE);  
                inbox.fetch(msg, profile);  
                for (int i = 0; i < msg.length; i++) {  
                        System.out.println("===============================================");  
                        System.out.println("主题:"+msg[i].getSubject());  
                        InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);  
                        for(InternetAddress adress:toAddress){  
                                System.out.println(adress.getAddress());  
                        }  
                }  
                //关闭打开的资源  
                if (inbox != null)  
                        inbox.close(true);  
                if (store != null)  
                        store.close();  
        } catch (NoSuchProviderException e) {  
                e.printStackTrace();  
        } catch (MessagingException e) {  
                e.printStackTrace();  
        } catch (Exception e) {  
                e.printStackTrace();  
        }  
}  
 
      很简单,可以正常收取邮件、正常显示收件人列表;但是当连接一个内部邮件服务器,并且收件人是以分号为分隔符的邮件时,确实无法正常显示收件人。
      查找了一下规范,发现FRC 822规定:收件人之间是要求以逗号为分割,看来分号分割不是标准的分隔符,如下:
destination = "To" ":" 1#address ; Primary
/ "Resent-To" ":" 1#address
 / "cc" ":" 1#address ; Secondary
/ "Resent-cc" ":" 1#address
/ "bcc" ":" #address ; Blind carbon
/ "Resent-bcc" ":" #address
而#语法表示一个列表,列表之间的内容以逗号进行分割,例如:
2.7. #RULE: LISTS
A construct "#" is defined, similar to "*", as follows:
<l>#<m>element
indicating at least <l> and at most <m> elements, each separated by one or more commas (","). This makes the usual form of lists very easy; a rule such as '(element *("," element))' can be shown as "1#element". Wherever this construct is used, null elements are allowed, but do not contribute to the count of elements present. That is, "(element),,(element)" is permitted, but counts as only two elements. Therefore, where at least one ele- ment is required, at least one non-null element must be present. Default values are 0 and infinity so that "#(element)" allows any number, including zero; "1#element" requires at least one; and "1#2element" allows one or two.
 
JAVA MAIL严格按照RFC 822规范进行操作,没有对分号做处理。大多数邮件服务器都是严格遵循RFC 822规范的,比如Lotus Notes、gmail(gmail的收件人是不能输入分号的,甚至会自动替换成逗号,赞一个);但是,大家也会发现平时发送邮件,经常以分号做分割,这是因为微软的一些邮件工具,如:outlook、outlook Express或是其MAPI,则是以分号为分隔符的,又因为outlook使用用户非常广泛,甚至很多人会认为分号分隔才是规范,强烈鄙视Microsoft!不规范的东西太多了!!
 
      如果足够倒霉,真的碰到了习惯使用分号作为分割符的用户,而其邮件服务器又不会自动将分号替换为逗号,那我们只能通过程序做兼容了,可以考虑修订JAVA MAIL源码,修改
InternetAddress类的parse方法,这里源码就不展现了,大家只需将对于分号的处理修改成和逗号一样即可(但是分号在FRC 822中也有定义,这么修改有可能引起隐患,大家慎重)。

按分号进行接收者重组不就行了,API是死的,API的使用者是活的!
分享到:
评论

相关推荐

    浅析Java Mail无法解析带分号的收件人列表的问题

    然而,在实际应用中,可能会遇到一些问题,比如本文提到的"Java Mail无法解析带分号的收件人列表的问题"。这主要是由于Java Mail在处理收件人地址时遵循了RFC 822(现在已经被RFC 5322取代)的规范。 RFC 822(以及...

    仿APP邮箱 多个收件人显示

    4. **删除功能**:当用户想要移除某收件人时,点击收件人列表中的删除图标,应能即时从列表和最终的邮件发送数据中移除该收件人。 5. **输入建议**:为了提高用户体验,可以实现自动补全功能,根据用户输入的首字母...

    javacsv_CsvReader:解析CSV文件

    `javacsv`库是处理CSV文件的一种工具,特别是`CsvReader`类,它提供了方便的方法来读取和解析这些文件。 `CsvReader`是`javacsv`库中的核心类,用于读取CSV文件并将其内容转换为Java对象。这个库由`csv`和`java`...

    Java简明教程 习题解析

    【Java简明教程 习题解析】这篇教程涵盖了Java编程的基础知识,包括语言特性、开发环境的搭建、程序编写及运行流程。以下是其中的关键知识点: 1. **Java语言的主要特点**: - 平台独立性:Java通过字节码实现了...

    android邮件收件人控件,类似腾冲QQ邮箱收件人输入框功能

    1、在网上都没找到的android邮箱收件人控件,找了几天都没人写此类的控件,后面自己仿照相关控件写的, 2、控件支持从外部直接设置邮件地址和手动输入邮件地址功能,以分号结束区分,文件中有APP,自己可以安装试试...

    oracle截取表字段中带分号的信息的存储过程

    Oracle 存储过程截取表字段中带分号的信息 Oracle 存储过程是 Oracle 数据库中的一种程序单元,它可以实现复杂的业务逻辑和数据处理。在本文中,我们将讨论如何使用 Oracle 存储过程来截取表字段中带分号的信息。 ...

    邮件加分号模板

    )代替逗号,邮件服务器会将这些地址视为独立的收件人,但仍会在一次发送中处理,但这样做的目的是为了保护收件人的隐私,因为其他收件人看不到所有收件人的完整列表。 加分号模板(如“加分号模板.xls”所示)通常...

    邮件逐一发送 发送邮件(多收件人逐一发送) v1.0

    4. **性能考虑**:逐一发送可能会比一次性群发花费更多的时间,特别是当收件人列表很长时,用户需要对此有所预期。 总结来说,“邮件逐一发送 发送邮件(多收件人逐一发送) v1.0”是一款实用的邮件工具,它解决了...

    Java解析SQL的基本思路.pdf

    Java解析SQL的基本思路 Java解析SQL的基本思路是指使用Java语言对SQL语句进行解析和执行的过程。该过程通常涉及到两个主要步骤:分词和解析。在分词步骤中,Java程序会将输入的SQL语句分解为多个标记(tokens),以...

    关于宏定义带参数可能会出现的分号错误问题

    ### 关于宏定义带参数可能引发的分号错误问题 #### 概述 宏定义是C语言中的一个重要特性,主要用于代码的预处理阶段。通过宏定义可以实现代码的替换、简化编程过程等目的。其中,带参数的宏定义能够根据传入的不同...

    java字符串分隔类

    在Java编程中,处理字符串是非常常见的需求之一,特别是在数据解析、格式化输出等场景下。`StringTokenizer`类作为Java标准库的一部分,为开发者提供了一种方便的方式来分割字符串,并且能够很好地控制分割行为。...

    分号带来的错误

    使用中文的分号会导致语法错误,因为编译器或解释器无法识别它,从而引发解析错误。 在编程中,错误的分号使用可能导致以下几种情况: 1. **语句结束错误**:如果一个语句没有正确地以分号结束,编译器或解释器可能...

    关于java环境配置的一些问题

    在探讨“关于java环境配置的一些问题”这一主题时,我们主要关注的是如何正确地设置Java开发环境,确保Java应用程序能够顺利运行。对于初次接触Java环境配置的朋友们,以下的详细指南将提供必要的帮助。 ### Java...

    java英语练习题

    ### Java英语练习题知识点解析 #### 1. 题目概述 本套Java英语练习题旨在帮助学习者巩固Java基础知识,并为参加Java认证考试做准备。题目涵盖了Java语言的基本概念、工具、语法等方面,通过选择题的形式进行考察。 ...

    java编程参考文档

    Java是一种Sun公司开发的语言。它是面向对象的,继承了C++的大多数风格。但是相比之下,面向对象概念更深。 学习使用Java语言首先要下载JDK的J2EE的安装程序进行安装,到Sun公司的网站上找吧。 然后最好到桌面-我的...

    Java学习利器-JAVA解惑

    然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...

    java常见错误列表

    ### Java常见错误列表 在Java编程中,遇到各种各样的错误是不可避免的。为了帮助初学者更好地理解并解决这些问题,本文将详细介绍一些常见的Java错误及其原因,并提供解决方案。 #### 一、编译错误:找不到符号 ...

    java程序代码不能运行的几个基本原因

    在Java开发过程中,可能会遇到一些导致程序无法正常运行的问题。这些问题有时并不容易被开发工具直接检测出来,因此需要开发者具备一定的排查技巧和经验积累。接下来,我们将针对标题和描述中提及的一些常见问题进行...

    OCJP题库JAVA考试3

    **问题126** 这个问题要求排列代码元素以使Java源文件正确编译,但没有提供具体代码片段,因此无法提供详细的解答。通常,Java源文件应遵循一定的顺序,包括包声明(如果有)、导入语句、公共类或接口声明,以及类...

    详述Java中带包的类的编译与调试

    ### 详述Java中带包的类的编译与调试 在Java开发中,使用包(packages)是一种非常常见的组织代码的方式。通过合理地利用包结构,开发者可以更好地管理类库,避免命名冲突,并实现模块化编码。本文将详细介绍如何在...

Global site tag (gtag.js) - Google Analytics