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

    技术2022-05-11  69

    几天来一直在开发一个项目,其中一部分需要用 JavaMail 收发邮件,于是就在网上找了一些相关的源代码,最后经过整理和修改,终于好使了,希望能够给使用 JavaMail 收发邮件的朋友提供一个参考 J     使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件, mail.jar 和 activation.jar, 这两个 jar 包可以很容易的在网上找到,这里就不提供下载链接了 J   下面是发送邮件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();        }    }}

    最新回复(0)