java电子邮件(二)使用JavaMail收发邮件,解决了中文附件名问题

mail.jar   : http://java.sun.com/products/javamail/index.html 并添加到classpath即可.
   activation.jar: http://java.sun.com/products/javabeans/glasgow/jaf.html 并添加到
   classpath即可. 


下面是发送邮件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";
         //发送方邮箱地址(如[email protected].)
         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();
         }
     }
}

对于解码应当使用sun的JavaMail中固有的包。
使用如下方法MimeUtility.decodeText(String s);

你可能感兴趣的:(java,Yahoo,Blog,sun)