您的位置:首页 > 编程语言 > Java开发

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

2007-02-07 11:22 561 查看
几天来一直在开发一个项目,其中一部分需要用 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();


}


}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐