JavaMail中文附件处理

//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();
        }

    }

}
  

  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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值