100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > java mail 收 附件_使用 JavaMail 收发邮件 解决中文附件问题

java mail 收 附件_使用 JavaMail 收发邮件 解决中文附件问题

时间:2022-07-15 17:23:18

相关推荐

java mail 收 附件_使用 JavaMail 收发邮件 解决中文附件问题

几天来一直在开发一个项目,其中一部分需要用 JavaMail

收发邮件,于是就在网上找了一些相关的源代码,最后经过整理和修改,终于好使了,希望能够给使用 JavaMail 收发邮件的朋友提供一个参考 J

使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件, mail.jar 和 activation.jar, 这两个 jar

包可以很容易的在网上找到,这里就不提供下载链接了。

下面是发送邮件SendMail.java(含附件)代码:

Java代码

//SendMail.java

importjavax.mail.*;

importjavax.mail.internet.*;

importjava.util.*;

importjavax.activation.*;

publicclassSendMail...{

publicstaticvoidsend(StringcustomMailBoxAddress,Stringusername,Stringpassword,StringserverMailBoxAddress,Stringsubject,StringattachmentPath,StringattachmentName)...{

//这里面使用新浪作为发送邮件的邮件服务器,其他的smtp服务器可以到相关网站上查到。

Stringhost="";

//发送方邮箱地址(如BlogJava@.)

Stringfrom=customMailBoxAddress;

//收件人邮箱地址

Stringto=serverMailBoxAddress;

//发送者的邮箱用户名

Stringuser=username;

//发送者的邮箱密码

Stringps=password;

Propertiesprops=newProperties();

//设置发送邮件的邮件服务器的属性(这里使用新浪的smtp服务器)

props.put("mail.smtp.host",host);

//需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有//这一条)

props.put("mail.smtp.auth","true");

//用刚刚设置好的props对象构建一个session

Sessionsession=Session.getDefaultInstance(props);

//有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使

//用(有的时候网络连通性不够好,发送邮件可能会有延迟,在这里面会有所//提示,所以最好是加上这句,避免盲目的等待)

session.setDebug(true);

//定义消息对象

MimeMessagemessage=newMimeMessage(session);

try...{

message.setFrom(newInternetAddress(from));

message.addRecipient(Message.RecipientType.TO,newInternetAddress(to));

message.setSubject(subject);

//向multipart对象中添加邮件的各个部分内容,包括文本内容和附件

Multipartmultipart=newMimeMultipart();

//设置邮件的文本内容

BodyPartcontentPart=newMimeBodyPart();

contentPart.setText("邮件的具体内容在此");

multipart.addBodyPart(contentPart);

//添加附件

BodyPartattachmentPart=newMimeBodyPart();

DataSourcesource=newFileDataSource(attachmentPath);

attachmentPart.setDataHandler(newDataHandler(source));

//注意:下面定义的enc对象用来处理中文附件名,否则名称是中文的附//件在邮箱里面显示的会是乱码,

sun.misc.BASE64Encoderenc=newsun.misc.BASE64Encoder();

messageBodyPart.setFileName("=?GBK?B?"+enc.encode(attachmentName.getBytes())+"?=");

multipart.addBodyPart(messageBodyPart);

//将multipart对象放到message中

message.setContent(multipart);

//发送邮件

message.saveChanges();

Transporttransport=session.getTransport("smtp");

transport.connect(host,username,password);

transport.sendMessage(message,message.getAllRecipients());

transport.close();

}catch(Exceptione)...{

e.printStackTrace();

}

}

}//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 = "";

//发送方邮箱地址(如BlogJava@.)

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代码如下:

Java代码

importjavax.mail.*;

importjava.util.*;

importjava.io.*;

publicclassReceiveMail...{

//处理任何一种邮件都需要的方法

privatevoidhandle(Messagemsg)throwsException...{

System.out.println("邮件主题:"+msg.getSubject());

System.out.println("邮件作者:"+msg.getFrom()[0].toString());

System.out.println("发送日期:"+msg.getSentDate());

}

//处理文本邮件

privatevoidhandleText(Messagemsg)throwsException...{

this.handle(msg);

System.out.println("邮件内容:"+msg.getContent());

}

//处理Multipart邮件,包括了保存附件的功能

privatestaticvoidhandleMultipart(Messagemsg)throwsException...{

Stringdisposition;

BodyPartpart;

Multipartmp=(Multipart)msg.getContent();

//Miltipart的数量,用于除了多个part,比如多个附件

intmpCount=mp.getCount();

for(intm=0;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());

}

}

}

privatestaticvoidsaveAttach(BodyPartpart)throwsException...{

//得到未经处理的附件名字

Stringtemp=part.getFileName();

//除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名

//(请参考发送邮件程序SendMail的附件名编码部分)

Strings=temp.substring(8,temp.indexOf("?="));

//文件名经过了base64编码,下面是解码

StringfileName=base64Decoder(s);

System.out.println("有附件:"+fileName);

InputStreamin=part.getInputStream();

FileOutputStreamwriter=newFileOutputStream(newFile(

"保存附件的本地路径"+"\"+fileName));

byte[]content=newbyte[255];

intread=0;

while((read=in.read(content))!=-1)...{

writer.write(content);

}

writer.close();

in.close();

}

//base64解码

privatestaticStringbase64Decoder(Strings)throwsException...{

sun.misc.BASE64Decoderdecoder=newsun.misc.BASE64Decoder();

byte[]b=decoder.decodeBuffer(s);

return(newString(b));

}

publicstaticvoidreceive(StringreceiverMailBoxAddress,Stringusername,Stringpassword)...{

//本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器

Stringhost="pop.";

try...{

//连接到邮件服务器并获得邮件

Propertiesprop=newProperties();

prop.put("mail.pop3.host",host);

Sessionsession=Session.getDefaultInstance(prop);

Storestore=session.getStore("pop3");

store.connect(host,username,password);

Folderinbox=store.getDefaultFolder().getFolder("INBOX");

//设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件

inbox.open(Folder.READ_WRITE);

Message[]msg=inbox.getMessages();

FetchProfileprofile=newFetchProfile();

profile.add(FetchProfile.Item.ENVELOPE);

inbox.fetch(msg,profile);

for(inti=0;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(Exceptione)...{

e.printStackTrace();

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。