`
rainlife
  • 浏览: 233372 次
  • 性别: Icon_minigender_1
  • 来自: 我也来自火星?
社区版块
存档分类
最新评论

使用 JavaMail 收发邮件,解决中文附件问题

    博客分类:
  • JAVA
阅读更多
几天来一直在开发一个项目,其中一部分需要用 JavaMail 收发邮件,于是就在网上找了一些相关的源代码,最后经过整理和修改,终于好使了,希望能够给使用 JavaMail 收发邮件的朋友提供一个参考 J
    使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件, mail.jar 和 activation.jar, 这两个 jar 包可以很容易的在网上找到,这里就不提供下载链接了。
下面是发送邮件SendMail.java(含附件)代码:
//SendMail.java
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.*;

public class SendMail ...{
    
    public static void send(String customMailBoxAddress,String username,String password,String serverMailBoxAddress,String subject,String attachmentPath,String attachmentName) ...{
        //这里面使用新浪作为发送邮件的邮件服务器,其他的smtp服务器可以到相关网站上查到。
        String host = "smtp.sina.com.cn";
        //发送方邮箱地址(如BlogJava2006@blog.com.cn.)
        String from = customMailBoxAddress;
        //收件人邮箱地址
        String to = serverMailBoxAddress;
        //发送者的邮箱用户名
        String user = username;
        //发送者的邮箱密码
        String ps = password;
        
        Properties props = new Properties();
        
        //设置发送邮件的邮件服务器的属性(这里使用新浪的smtp服务器)
        props.put("mail.smtp.host", host);
        //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有//这一条)
        props.put("mail.smtp.auth", "true");
        
        //用刚刚设置好的props对象构建一个session
        Session session = Session.getDefaultInstance(props);
        
        //有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
        //用(有的时候网络连通性不够好,发送邮件可能会有延迟,在这里面会有所//提示,所以最好是加上这句,避免盲目的等待)
        session.setDebug(true);
        
        //定义消息对象
        MimeMessage message = new MimeMessage(session);
        try...{
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
            message.setSubject(subject);
            
            // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
            Multipart multipart = new MimeMultipart();
            //设置邮件的文本内容
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setText("邮件的具体内容在此");
            multipart. addBodyPart(contentPart);
            //添加附件
            BodyPart attachmentPart= new MimeBodyPart();
            DataSource source = new FileDataSource(attachmentPath);
            attachmentPart.setDataHandler(new DataHandler(source));
            //注意:下面定义的enc对象用来处理中文附件名,否则名称是中文的附//件在邮箱里面显示的会是乱码,
            sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
            messageBodyPart.setFileName("=?GBK?B?"+enc.encode(attachmentName.getBytes())+"?=");
            multipart.addBodyPart(messageBodyPart);
            
            //将multipart对象放到message中
            message.setContent(multipart);
            //发送邮件
            message.saveChanges();
            Transport transport = session.getTransport("smtp");
            transport.connect(host, username, password);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }catch(Exception e)...{
            e.printStackTrace();
        }
    }
}

ReceiveMail.java代码如下:
import javax.mail.*;
import java.util.*;
import java.io.*;

public class ReceiveMail ...{

    //处理任何一种邮件都需要的方法
    private void handle(Message msg) throws Exception ...{
        System.out.println("邮件主题:" + msg.getSubject());
        System.out.println("邮件作者:" + msg.getFrom()[0].toString());
        System.out.println("发送日期:" + msg.getSentDate());
    }

    //处理文本邮件
    private void handleText(Message msg) throws Exception ...{
        this.handle(msg);
        System.out.println("邮件内容:"+msg.getContent());
    }

    //处理Multipart邮件,包括了保存附件的功能
    private static void handleMultipart(Message msg) throws Exception ...{
        String disposition;
        BodyPart part;

        Multipart mp = (Multipart) msg.getContent();
        //Miltipart的数量,用于除了多个part,比如多个附件
        int mpCount = mp.getCount();
        for (int m = 0; m < mpCount; m++) ...{
            this.handle(msg);
            part = mp.getBodyPart(m);
            disposition = part.getDisposition();
            //判断是否有附件
            if (disposition != null && disposition.equals(Part.ATTACHMENT))
            ...{
                //这个方法负责保存附件
                saveAttach(part);
            } else ...{
                //不是附件,就只显示文本内容
                System.out.println(part.getContent());
            }
        }
    }

    private static void saveAttach(BodyPart part) throws Exception ...{
        //得到未经处理的附件名字
        String temp = part.getFileName();
        //除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名
        //(请参考发送邮件程序SendMail的附件名编码部分)
        String s = temp.substring(8, temp.indexOf("?="));
        //文件名经过了base64编码,下面是解码
        String fileName = base64Decoder(s);
        System.out.println("有附件:" + fileName);

        InputStream in = part.getInputStream();
        FileOutputStream writer = new FileOutputStream(new File(
                "保存附件的本地路径"+ "\"+fileName));
        byte[] content = new byte[255];
        int read = 0;
        while ((read = in.read(content)) != -1) ...{
            writer.write(content);
        }
        writer.close();
        in.close();
    }
    //base64解码
    private static String base64Decoder(String s) throws Exception ...{
        sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
        byte[] b = decoder.decodeBuffer(s);
        return (new String(b));
    }

    public static void receive(String receiverMailBoxAddress, String username,String password) ...{
        //本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器
        String host = "pop.mail.yahoo.com.cn";
        try ...{
            //连接到邮件服务器并获得邮件
            Properties prop = new Properties();
            prop.put("mail.pop3.host", host);
            Session session = Session.getDefaultInstance(prop);
            Store store = session.getStore("pop3");
            store.connect(host, username, password);

            Folder inbox = store.getDefaultFolder().getFolder("INBOX");
            //设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件
            inbox.open(Folder.READ_WRITE);

            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++) ...{
                //标记此邮件的flag标志对象的DELETED位为true,可以在读完邮件后直接删除该附件,具体执行时间是在调用
                //inbox.close()方法的时候
                msg[i].setFlag(Flags.Flag.DELETED, true);
                handleMultipart(msg[i]);
                System.out.println("****************************");
            }
            if (inbox != null) ...{
                //参数为true表明阅读完此邮件后将其删除,更多的属性请参考mail.jar的API
                inbox.close(true);
            }
            if (store != null) ...{
                store.close();
            }
        } catch (Exception e) ...{
            e.printStackTrace();
        }
    }
}
分享到:
评论

相关推荐

    javamail收发邮件(带附件,正文带图).doc

    javamail收发邮件(带附件,正文带图).doc

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

    在提供的压缩包文件“james+javaMail收发邮件”中,可能包含了示例代码和配置文件,供开发者参考和学习如何在实际项目中实现邮件收发功能,特别是处理中文内容和附件。通过理解和实践这些示例,开发者可以更好地掌握...

    javaMail 收发邮件

    在实际开发中,使用 JavaMail 进行邮件收发的步骤大致如下: 1. 创建 Session 对象,配置邮件服务器的相关信息。 2. 使用 Session 创建 Store 对象,连接到邮件服务器。 3. 打开 Folder,读取或管理邮件。 4. 如果...

    JavaMail收发Gmail邮件

    #### 二、使用JavaMail收发Gmail邮件 在使用JavaMail进行Gmail邮件的收发时,需要注意几个关键点: 1. **SSL加密**: 为了确保数据的安全传输,通常会使用SSL加密技术。 2. **Gmail的SMTP和POP3设置**: - SMTP服务器...

    javamail收取邮件(包括附件)

    在JavaMail中,我们可以利用其API来实现邮件的收发功能,包括处理附件。下面我们将详细探讨如何使用JavaMail API实现邮件的收取,特别是如何通过POP3和IMAP协议获取邮件信息。 首先,确保你的项目中已经引入了...

    javamail收发邮件类库

    总的来说,JavaMail类库是Java开发人员处理电子邮件的得力工具,无论是简单的文本邮件还是复杂的多媒体邮件,甚至是包含大量附件的邮件,都可以通过其API轻松实现。结合JAF,JavaMail能够优雅地处理各种邮件格式和...

    javamail 收发电子邮件

    5. 附件处理:JavaMail 提供了 `MimeBodyPart` 类来处理邮件附件。通过创建 `MimeBodyPart`,设置 `DataHandler`,然后将其添加到 `MimeMultipart` 对象中,可以将附件添加到邮件中。 6. 联系人管理:虽然JavaMail...

    javamail收发邮件(带附件,正文带图).docx

    JavaMail API 是 Java 平台上广泛使用的邮件处理库之一,它允许开发人员通过简单的 API 调用来发送和接收电子邮件,包括支持附件和内嵌图片等功能。 #### 二、邮件的基本结构 邮件由邮件头和邮件体两部分组成: -...

    基于Javamail的邮件收发系统

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

    javaMail收发邮件经典程序

    在这个"javaMail收发邮件经典程序"中,我们将深入探讨如何利用JavaMail库进行邮件的发送和接收,并特别关注添加多个附件、指定多个发送人以及接收邮件附件的操作。 首先,要使用JavaMail,我们需要在项目中引入其...

    javamail收发邮件步骤

    本篇文章将详细解析使用 JavaMail 收发邮件的基本步骤。 **1. 发送邮件** 发送邮件的关键在于配置 `Session` 和创建 `Message`。以下是详细步骤: ### 1.1 构造 Session - **初始化 Authentication**: 创建一个...

    使用javaMail实现收发邮件

    总的来说,JavaMail为Java开发者提供了一个强大的工具,使得收发邮件变得简单。无论是发送简单的文本邮件,还是构建包含多媒体内容的复杂邮件,或者从邮件服务器接收邮件,JavaMail都能胜任。通过合理利用activation...

    基于Javamail的邮件收发系统(word论文+开题报告+任务书+答辩PPT).zip

    这个项目主要探讨了如何使用JavaMail API来实现一个高效、稳定的邮件收发系统。下面将详细解析其中涉及的关键知识点。 一、JavaMail API JavaMail API是Java平台上用于处理电子邮件的一组接口和类。它提供了一种...

    基于JavaMail的电子邮件收发系统设计说明.doc

    通过深入理解SMTP和POP3等邮件传输协议,设计出一个简化操作、实用性强的系统,使用户能快速收发邮件,不受时间和地点限制。 1.2 国外发展趋势和现状 电子邮件作为互联网基础服务,全球用户基数庞大,中国也不例外...

    jsp写的收发邮件,使用javamail写的

    在使用JavaMail过程中,可能会遇到网络问题、认证错误或邮件服务器拒绝连接等问题。因此,需要适当地捕获和处理`MessagingException`和其他相关异常。 8. **实战应用**: 以JSP为例,用户可能通过表单提交邮件...

    基于Javamail的邮件收发系统(系统+论文+开题报告+任务书+外文翻译+文献综述+答辩PPT).zip

    (3) 邮件附件的发送与接受; (4) 删除邮件; 具体操作步骤如下: 1、打开javamailsystem文件夹,找到javamail.jar可执行文件,双击该执行文件,即可打开Javamail邮件收发系统客户端软件。进入该系统后,首先选择...

    javamail(带界面的javamail)

    对于邮件接收,JavaMail 使用 Store 和 Folder 类来连接邮件服务器并获取邮件。你可以选择 POP3 或 IMAP 协议,根据用户的需求,可以设置为只读或读写模式。Folder 对象代表邮件文件夹,如“收件箱”、“已发送”等...

    java读写xml和用javamail收发邮件

    在本文中,我们将深入探讨Java如何实现XML的读写操作以及使用JavaMail API进行邮件收发。 首先,让我们看看Java如何处理XML文件。XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它具有...

    javaMail电子邮件收发

    本教程将深入探讨如何使用JavaMail实现普通电子邮件以及带有附件的电子邮件的收发。 首先,要使用JavaMail,我们需要引入相关的依赖库,如`javax.mail`和`javax.mail-api`。这些库可以通过Maven或Gradle等构建工具...

Global site tag (gtag.js) - Google Analytics