`
CoderDream
  • 浏览: 477355 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

解决JavaMail发邮件抛出找不到SharedByteArrayInputStream类的异常

 
阅读更多

在最近项目开发过程中,需要用到JavaMail发邮件。在Java Project下导入官方包mail.jar(截止今天的最新版是1.4.4,下载地址是:http://www.oracle.com/technetwork/java /javamail/index-138643.html),另外需要导入activation-1.1.jar,执行下面的代码,可成功发送邮件。

下面这段代码是网上找的,大家可以参考一下。

代码出处:http://blogold.chinaunix.net/u/15221/showart_1078351.html

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 利用java.mail的邮件发送程序
 */

public class SendMailTest {
    public static void main(String[] args) {
        String title = "SendMailTest_title";// 所发送邮件的标题
        String from = "XXXXX@163.com";// 从那里发送
        String sendTo[] = { "aaaaa@yahoo.com.cn", "123456789@qq.com" };// 发送到那里
        // 邮件的文本内容,可以包含html标记则显示为html页面
        String content = "mail test!!!!!!<br><a href=#>aaa</a>";
        // 所包含的附件,及附件的重新命名
        String fileNames[] = { "F:\\text1.txt,text1.txt",
                "F:\\text2.txt,text2.txt" };
        try {
            sendmail(title, from, sendTo, content, fileNames,
                    "text/html;charset=gb2312");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @SuppressWarnings("static-access")
    public static void sendmail(String subject, String from, String[] to,
            String text, String[] filenames, String mimeType) throws Exception {
        // 可以从配置文件读取相应的参数
        Properties props = new Properties();

        String smtp = "smtp.163.com"; // 设置发送邮件所用到的smtp
        String servername = "XXXXX";
        String serverpaswd = "******";

        javax.mail.Session mailSession; // 邮件会话对象
        javax.mail.internet.MimeMessage mimeMsg; // MIME邮件对象

        props = java.lang.System.getProperties(); // 获得系统属性对象
        props.put("mail.smtp.host", smtp); // 设置SMTP主机
        props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证
        // 到服务器验证发送的用户名和密码是否正确
        Email_Autherticatorbean myEmailAuther = new Email_Autherticatorbean(
                servername, serverpaswd);
        // 设置邮件会话
        mailSession = javax.mail.Session.getInstance(props,
                (Authenticator) myEmailAuther);
        // 设置传输协议
        javax.mail.Transport transport = mailSession.getTransport("smtp");
        // 设置from、to等信息
        mimeMsg = new javax.mail.internet.MimeMessage(mailSession);
        if (from != null && !from.equals("")) {
            InternetAddress sentFrom = new InternetAddress(from);
            mimeMsg.setFrom(sentFrom); // 设置发送人地址
        }

        // 收件人
        InternetAddress[] sendTo = new InternetAddress[to.length];
        for (int i = 0; i < to.length; i++) {
            System.out.println("发送到:" + to[i]);
            sendTo[i] = new InternetAddress(to[i]);
        }

        // 抄送
        InternetAddress[] sendToCC = new InternetAddress[2];
        sendToCC[0] = new InternetAddress("username@hotmail.com");
        sendToCC[1] = new InternetAddress("username@gmail.com");

        // 密送
        InternetAddress[] sendToBCC = new InternetAddress[2];
        sendToBCC[0] = new InternetAddress("username@126.com");
        sendToBCC[1] = new InternetAddress("username@gmail.com");

        mimeMsg.setRecipients(javax.mail.internet.MimeMessage.RecipientType.TO,
                sendTo);
        mimeMsg.setRecipients(javax.mail.internet.MimeMessage.RecipientType.CC,
                sendToCC);
        mimeMsg.setRecipients(
                javax.mail.internet.MimeMessage.RecipientType.BCC, sendToBCC);

        mimeMsg.setSubject(subject, "gb2312");

        MimeBodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setContent(text, mimeType);

        Multipart multipart = new MimeMultipart();// 附件传输格式
        multipart.addBodyPart(messageBodyPart1);

        for (int i = 0; i < filenames.length; i++) {
            MimeBodyPart messageBodyPart2 = new MimeBodyPart();
            // 选择出每一个附件名
            String filename = filenames[i].split(",")[0];
            System.out.println("附件名:" + filename);
            String displayname = filenames[i].split(",")[1];
            // 得到数据源
            FileDataSource fds = new FileDataSource(filename);
            // 得到附件本身并设置到BodyPart
            messageBodyPart2.setDataHandler(new DataHandler(fds));
            // 得到文件名同样设置到BodyPart
            messageBodyPart2.setFileName(MimeUtility.encodeText(displayname));
            multipart.addBodyPart(messageBodyPart2);
        }
        mimeMsg.setContent(multipart);
        // 设置信件头的发送日期
        mimeMsg.setSentDate(new Date());
        mimeMsg.saveChanges();

        // 发送邮件
        transport.send(mimeMsg);
        transport.close();
    }

}

/**
 * 验证类(内部类)
 *
 * @author Administrator
 *
 */
class Email_Autherticatorbean extends Authenticator {
    private String m_username = null;
    private String m_userpass = null;

    public void setUsername(String username) {
        m_username = username;
    }

    public void setUserpass(String userpass) {
        m_userpass = userpass;
    }

    public Email_Autherticatorbean(String username, String userpass) {
        super();
        setUsername(username);
        setUserpass(userpass);

    }

    public PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(m_username, m_userpass);
    }
}

 

接下来,我们把这段代码直接放入已有的J2EE工程中,然后运行,抛出类没有找到的错误:

java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInputStream

具体到代码中查看,发现问题出在这行代码:

 

Session session = Session.getInstance(props);

这行代码的意思是通过javax.mail.Session 创建Session,但是在工程中有两个jar档都有这个类,一个是j2ee.jar,在WebSphere的Library中,另一个是mail.jar,在【Web App Libraries】中,也就是自己导入的,需要调用的jar档。

通过工程的属性的【Java Build Path】的【Order and Export】面板可以看到Library的顺序有问题 ,使用【Up】和【Down】调整一下顺序 ,把【Web App Libraries】放到上面,问题解决!

 

PS:如果在两个jar在同一个Library中,可以通过修改jar档的名字来调整调用顺序!


  • 大小: 201.2 KB
分享到:
评论
1 楼 di1984HIT 2014-11-05  
不错,。不错

相关推荐

    使用JAVAMail代发邮件

    这个类称为 MailInfo,包含了邮件的各种信息,例如邮件服务器的主机名和端口号、邮件发送者的地址、邮件接收者的地址、邮件主题、邮件内容、邮件附件等。 在 MailInfo 类中,我们定义了多个成员变量,用于存储邮件...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...

    javaMail 发邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...

    基于Javamail的邮件收发系统.zip

    基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    JavaMail 具备垃圾邮件过滤功能的邮箱

    这涉及到JavaMail API的使用,如`Session`对象用于配置邮件服务器连接参数,`Message`对象代表一封邮件,`Transport`类则负责实际的邮件发送操作。收邮件时,会通过`Store`对象连接到邮件服务器,获取`Folder`并读取...

    javamail收发邮件加密和不加密

    JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...

    常规JavaMail 邮件发送实用类

    "常规JavaMail 邮件发送实用类"标题所指的,通常是一个自定义的Java类,封装了JavaMail API的基本操作,使得邮件发送变得更加简单和便捷。这类实用类一般包含配置SMTP服务器、设置邮件内容、添加附件等功能。 ...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    javamail 回执邮件资料

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...

    利用JavaMail发邮件

    JavaMail是Java编程语言中用于...总结来说,JavaMail是一个强大且灵活的库,它使Java开发者能够方便地集成电子邮件功能到他们的应用程序中。通过理解并熟练使用JavaMail API,我们可以创建复杂、安全且高效的邮件系统。

    javaMail学习(七)——使用javaMail发复杂邮件

    在这个主题“javaMail学习(七)——使用javaMail发复杂邮件”中,我们将深入探讨如何使用 JavaMail API 发送包含多种附件、HTML 内容和其他复杂元素的邮件。在提供的文件列表中,我们看到一系列名为 MailUtils 的类,...

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

    对于邮件接收,JavaMail API同样提供了`Store`接口,可以连接到邮件服务器(如James)的邮箱,获取和处理新邮件。这通常涉及以下步骤: 1. **配置邮件存储**:与发送邮件类似,我们需要创建一个`Properties`对象,...

    基于Javamail的邮件收发系统

    **基于Javamail的邮件收发系统** JavaMail是一个开放源码的API,它为Java程序员提供了一套全面的接口来处理电子邮件。这个系统的设计目的是使得开发者能够方便地发送和接收邮件,包括附件、HTML内容以及MIME多部分...

    struts2集成javamail发邮件示例详解

    这两个JAR文件提供了JavaMail API以及对MIME和JAF(Java Activation Framework)的支持,它们需要被添加到项目的类路径中。 2. **配置SMTP服务器**: SMTP(Simple Mail Transfer Protocol)是用于发送电子邮件的...

    用javaMail发送邮件

    3. **创建邮件消息**:使用`Message`类实例化一个邮件对象,并设置必要的属性,如发件人、收件人、主题和正文。 ```java Message message = new MimeMessage(session); message.setFrom(new InternetAddress(...

    JavaMail javamail java电子邮件客户端

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件的发送和接收。它提供了对各种邮件协议的支持,如 Simple Mail Transfer Protocol (SMTP)、Post Office Protocol (POP3) 和 Internet Message ...

    javamail发送邮件小程序,类以及写好,只要放包,下载一个就可以

    4. **Transport**:`Transport` 类负责将 `Message` 实例发送到邮件服务器。`Transport.send(Message)` 方法是实际发送邮件的关键调用。 5. **Address**:`Address` 类族包括 `InternetAddress`,用于表示电子邮件...

    javamail 收发电子邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件的发送和接收。它支持多种邮件协议,如SMTP(简单邮件传输协议)用于发送邮件,IMAP(因特网消息访问协议)和POP3(邮局协议)用于接收邮件。在...

    用javaMail发邮件

    3. 构造邮件消息:使用`Message`类创建一个邮件对象,并设置发件人、收件人、主题和正文。 ```java Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your-email@example.com"))...

Global site tag (gtag.js) - Google Analytics