发送邮件及邮件附件java代码实例支持多附件群发送文档格式.docx
《发送邮件及邮件附件java代码实例支持多附件群发送文档格式.docx》由会员分享,可在线阅读,更多相关《发送邮件及邮件附件java代码实例支持多附件群发送文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
privatebooleanisDebug=true;
*值为“true”则在发送邮件{@linkMail#send()}
*过程中会读取服务器端返回的消息,
*并在邮件发送完毕后将这些消息返回给用户。
privatebooleanisAllowReadSocketInfo=true;
*邮件服务器地址
privateStringhost;
*发件人邮箱地址
privateStringfrom;
*收件人邮箱地址
privateList<
String>
to;
*抄送地址
cc;
*暗送地址
bcc;
*邮件主题
privateStringsubject;
*用户名
privateStringuser;
*密码
privateStringpassword;
*MIME邮件类型
privateStringcontentType;
*用来绑定多个邮件单元{@link#partSet}
*的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元
*。
privateStringboundary;
*邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识
privateStringboundaryNextPart;
*传输邮件所采用的编码
privateStringcontentTransferEncoding;
*设置邮件正文所用的字符集
privateStringcharset;
*内容描述
privateStringcontentDisposition;
*邮件正文
privateStringcontent;
*发送邮件日期的显示格式
privateStringsimpleDatePattern;
*附件的默认MIME类型
privateStringdefaultAttachmentContentType;
*邮件单元的集合,用来存放正文单元和所有的附件单元。
MailPart>
partSet;
*不同类型文件对应的{@linkMIME}类型映射。
在添加附件
*{@link#addAttachment(String)}
*时,程序会在这个映射中查找对应文件的{@linkMIME}
*类型,如果没有,则使用
*{@link#defaultAttachmentContentType}
*所定义的类型。
privatestaticMap<
String,String>
contentTypeMap;
static{
//MIMEMediaTypes
contentTypeMap=newHashMap<
();
contentTypeMap.put("
xls"
"
application/vnd.ms-excel"
);
xlsx"
xlsm"
xlsb"
doc"
application/msword"
dot"
docx"
docm"
dotm"
}
*该类用来实例化一个正文单元或附件单元对象,他继承了
*{@linkMail}
*,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象
*,使程序易读一些。
这些邮件单元全部会放到partSet
*中,在发送邮件{@link#send()}时,程序会调用
*{@link#getAllParts()}
*方法将所有的单元合并成一个符合MIME格式的字符串。
privateclassMailPartextendsMail{
publicMailPart(){
*默认构造函数
publicMail(){
defaultAttachmentContentType="
application/octet-stream"
simpleDatePattern="
yyyy-MM-ddHH:
mm:
ss"
boundary="
--=_NextPart_zlz_3907_"
+System.currentTimeMillis();
boundaryNextPart="
--"
+boundary;
contentTransferEncoding="
base64"
contentType="
multipart/alternative"
charset=Charset.defaultCharset().name();
partSet=newArrayList<
to=newArrayList<
cc=newArrayList<
bcc=newArrayList<
*根据指定的完整文件名在
*{@link#contentTypeMap}
*中查找其相应的MIME类型,如果没找到,则返回
*所指定的默认类型。
*@param
*文件名
*@return返回文件对应的MIME类型。
privateStringgetPartContentType(String){
Stringret=null;
if(null!
=){
intflag=("
."
if(0<
=flag&
&
flag<
()-1){
=(flag+1);
ret=contentTypeMap.get();
if(null==ret){
ret=defaultAttachmentContentType;
returnret;
*将给定字符串转换为base64编码的字符串
*@paramstr
*需要转码的字符串
*@paramcharset
*原字符串的编码格式
*@returnbase64编码格式的字符
privateStringtoBase64(Stringstr,Stringcharset){
=str){
try{
returntoBase64(str.getBytes(charset));
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
return"
"
*将指定的字节数组转换为base64格式的字符串
*@parambs
*需要转码的字节数组
privateStringtoBase64(byte[]bs){
returnnewBASE64Encoder().encode(bs);
privateStringtoBase64(Stringstr){
returntoBase64(str,Charset.defaultCharset().name());
*将所有的邮件单元按照标准的MIME格式要求合并。
*@return返回一个所有单元合并后的字符串。
privateStringgetAllParts(){
intpartCount=partSet.size();
StringBuildersbd=newStringBuilder(LINE_END);
for(inti=partCount-1;
i>
=0;
i--){
Mailattachment=partSet.get(i);
StringattachmentContent=attachment.getContent();
=attachmentContent&
0<
attachmentContent.length()){
sbd.append(getBoundaryNextPart()).append(LINE_END);
sbd.append("
Content-Type:
"
sbd.append(attachment.getContentType());
sbd.append(LINE_END);
Content-Transfer-Encoding:
sbd.append(attachment.getContentTransferEncoding());
if(i!
=partCount-1){
Content-Disposition:
sbd.append(attachment.getContentDisposition());
sbd.append(attachment.getContent());
//sbd.append(boundaryNextPart).
//append(LINE_END);
partSet.clear();
returnsbd.toString();
*添加邮件正文单元
privatevoidaddContent(){
=content){
MailPartpart=newMailPart();
part.setContent(toBase64(content));
part.setContentType("
text/plain;
charset=\"
+charset+"
\"
partSet.add(part);
privateStringlistToMailString(List<
mailAddressList){
StringBuildersbd=newStringBuilder();
=mailAddressList){
intlistSize=mailAddressList.size();
for(inti=0;
i<
listSize;
i++){
if(0!
=i){
<
).append(mailAddressList.get(i)).append("
>
getrecipient(){
List<
list=newArrayList<
list.addAll(to);
list.addAll(cc);
list.addAll(bcc);
returnlist;
*添加一个附件单元
*文件路径
publicvoidaddAttachment(String){
addAttachment(,null);
publicvoidaddTo(StringmailAddress){
this.to.add(mailAddress);
publicvoidaddCc(StringmailAddress){
this.cc.add(mailAddress);
publicvoidaddBcc(StringmailAddress){
this.bcc.add(mailAddress);
*文件编码格式
publicvoidaddAttachment(String,Stringcharset){
=&
()>
0){
=new);
addAttachment((),new(file),
charset);
}catch(e){
System.out.println("
错误:
+e.getMessage());
System.exit
(1);
*@paramattachmentStream
*文件流
publicvoidaddAttachment(String,InputStreamattachmentStream,
Stringcharset){
byte[]bs=null;
=attachmentStream){
intbuffSize=1024;
byte[]buff=newbyte[buffSize];
byte[]temp;
bs=newbyte[0];
intreadTotal=0;
while(-1!
=(readTotal=attachmentStream.read(buff))){
temp=newbyte[bs.length];
System.arraycopy(bs,0,temp,0,bs.length);
bs=newbyte[temp.length+readTotal];
System.arraycopy(temp,0,bs,0,temp.length);
System.arraycopy(buff,0,bs,temp.length,readTotal);
=bs){
MailPartattachmentPart=newMailPart();
charset=null!
=charset?
charset:
Charset.defaultCharset()
.name();
StringcontentType=getPartContentType()
+"
name=\"
=?
?
B?
+toBase64()
=\"
attachmentPart.setCharset(charset);
attachmentPart.setContentType(contentType);
attachmentPart.setContentDisposition("
attachment;
+toBase64()+"
attachmentPart.setContent(toBase64(bs));
partSet.add(attachmentPart);
}catch(Exceptione){
}finally{
attachmentStream.close();
attachmentStream=null;
}catch(IOExceptione){
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
*发送邮件
*@return邮件服务器反回的信息
publicStringsend(){
//对象申明
//当邮件发送完毕后,以下三个对象(Socket、
//PrintWriter,
//BufferedReader)需要关闭。
Socketsocket=null;
PrintWriterpw=null;
BufferedReaderbr=null;
socket=newSocket(host,25);
pw=newPrintWriter(socket.getOutputStream());
br=newBufferedReader(newInputStreamReader(socket
.getInputStream()));
StringBuilderinfoBuilder=newStringBuilder(
\nServerinfo:
\n------------\n"
//与服务器建立连接
pw.write("
HELO"
.concat(host).concat(LINE_END));
//连接到邮件服务
if(!
readResponse(pw,br,infoBuilder,"
220"
))
returninfoBuilder.toString();
AUTHLOGIN"
.concat(LINE_END));
//登录
250"
pw.write(toBase64(user).concat(LINE_END));
//输入用户名
334"
pw.write(toBase64(password).c