发送邮件及邮件附件java代码实例支持多附件群发送.docx
《发送邮件及邮件附件java代码实例支持多附件群发送.docx》由会员分享,可在线阅读,更多相关《发送邮件及邮件附件java代码实例支持多附件群发送.docx(32页珍藏版)》请在冰豆网上搜索。
发送邮件及邮件附件java代码实例支持多附件群发送
以下为Mail。
java的全部代码:
packagecom.zlz3907。
mail;
importjava。
io。
BufferedReader;
importjava。
io。
File;
importjava。
io.FileInputStream;
importjava.io。
FileNotFoundException;
importjava.io。
IOException;
importjava.io.InputStream;
importjava.io。
InputStreamReader;
importjava.io。
PrintWriter;
importjava。
io.UnsupportedEncodingException;
import.Socket;
importjava。
nio。
charset。
Charset;
importjava。
text.SimpleDateFormat;
importjava。
util。
ArrayList;
importjava.util.Date;
importjava。
util。
HashMap;
importjava.util.List;
importjava。
util。
Map;
importsun。
misc。
BASE64Encoder;
/**
*该类使用Socket连接到邮件服务器,
*并实现了向指定邮箱发送邮件及附件的功能。
*
*@authorZhongLizhi
*/
publicclassMail{
/**
*换行符
*/
privatestaticfinalStringLINE_END="\r\n”;
/**
*值为“true”输出高度信息(包括服务器响应信息),值为“
*false”则不输出调试信息.
*/
privatebooleanisDebug=true;
/**
*值为“true”则在发送邮件{@linkMail#send()}
*过程中会读取服务器端返回的消息,
*并在邮件发送完毕后将这些消息返回给用户。
*/
privatebooleanisAllowReadSocketInfo=true;
/**
*邮件服务器地址
*/
privateStringhost;
/**
*发件人邮箱地址
*/
privateStringfrom;
/**
*收件人邮箱地址
*/
privateList〈String〉to;
/**
*抄送地址
*/
privateList〈String〉cc;
/**
*暗送地址
*/
privateListbcc;
/**
*邮件主题
*/
privateStringsubject;
/**
*用户名
*/
privateStringuser;
/**
*密码
*/
privateStringpassword;
/**
*MIME邮件类型
*/
privateStringcontentType;
/**
*用来绑定多个邮件单元{@link#partSet}
*的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元
*。
*/
privateStringboundary;
/**
*邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识
*。
*/
privateStringboundaryNextPart;
/**
*传输邮件所采用的编码
*/
privateStringcontentTransferEncoding;
/**
*设置邮件正文所用的字符集
*/
privateStringcharset;
/**
*内容描述
*/
privateStringcontentDisposition;
/**
*邮件正文
*/
privateStringcontent;
/**
*发送邮件日期的显示格式
*/
privateStringsimpleDatePattern;
/**
*附件的默认MIME类型
*/
privateStringdefaultAttachmentContentType;
/**
*邮件单元的集合,用来存放正文单元和所有的附件单元。
*/
privateList〈MailPart>partSet;
/**
*不同类型文件对应的{@linkMIME}类型映射。
在添加附件
*{@link#addAttachment(String)}
*时,程序会在这个映射中查找对应文件的{@linkMIME}
*类型,如果没有,则使用
*{@link#defaultAttachmentContentType}
*所定义的类型.
*/
privatestaticMap〈String,String〉contentTypeMap;
static{
//MIMEMediaTypes
contentTypeMap=newHashMap〈String,String>();
contentTypeMap。
put("xls","application/vnd。
ms—excel");
contentTypeMap.put(”xlsx","application/vnd。
ms—excel");
contentTypeMap.put("xlsm",”application/vnd。
ms-excel");
contentTypeMap。
put(”xlsb”,"application/vnd。
ms—excel");
contentTypeMap.put(”doc”,”application/msword”);
contentTypeMap.put("dot”,"application/msword");
contentTypeMap。
put(”docx",”application/msword");
contentTypeMap.put("docm",”application/msword");
contentTypeMap。
put("dotm","application/msword");
}
/**
*该类用来实例化一个正文单元或附件单元对象,他继承了
*{@linkMail}
*,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象
*,使程序易读一些。
这些邮件单元全部会放到partSet
*中,在发送邮件{@link#send()}时,程序会调用
*{@link#getAllParts()}
*方法将所有的单元合并成一个符合MIME格式的字符串。
*
*@authorZhongLizhi
*/
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〈MailPart>();
to=newArrayListcc=newArrayList();
bcc=newArrayList〈String〉();
}
/**
*根据指定的完整文件名在
*{@link#contentTypeMap}
*中查找其相应的MIME类型,如果没找到,则返回
*{@link#defaultAttachmentContentType}
*所指定的默认类型。
*
*@paramfileName
*文件名
*@return返回文件对应的MIME类型。
*/
privateStringgetPartContentType(StringfileName){
Stringret=null;
if(null!
=fileName){
intflag=fileName。
lastIndexOf(".”);
if(0<=flag&&flag〈fileName。
length()-1){
fileName=fileName。
substring(flag+1);
}
ret=contentTypeMap.get(fileName);
}
if(null==ret){
ret=defaultAttachmentContentType;
}
returnret;
}
/**
*将给定字符串转换为base64编码的字符串
*
*@paramstr
*需要转码的字符串
*@paramcharset
*原字符串的编码格式
*@returnbase64编码格式的字符
*/
privateStringtoBase64(Stringstr,Stringcharset){
if(null!
=str){
try{
returntoBase64(str.getBytes(charset));
}catch(UnsupportedEncodingExceptione){
e。
printStackTrace();
}
}
return””;
}
/**
*将指定的字节数组转换为base64格式的字符串
*
*@parambs
*需要转码的字节数组
*@returnbase64编码格式的字符
*/
privateStringtoBase64(byte[]bs){
returnnewBASE64Encoder()。
encode(bs);
}
/**
*将给定字符串转换为base64编码的字符串
*
*@paramstr
*需要转码的字符串
*@returnbase64编码格式的字符
*/
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();
if(null!
=attachmentContent&&0length()){
sbd。
append(getBoundaryNextPart()).append(LINE_END);
sbd。
append("Content—Type:
");
sbd。
append(attachment。
getContentType());
sbd。
append(LINE_END);
sbd.append(”Content—Transfer—Encoding:
”);
sbd。
append(attachment。
getContentTransferEncoding());
sbd.append(LINE_END);
if(i!
=partCount—1){
sbd.append("Content—Disposition:
”);
sbd。
append(attachment.getContentDisposition());
sbd。
append(LINE_END);
}
sbd.append(LINE_END);
sbd.append(attachment.getContent());
sbd。
append(LINE_END);
}
}
sbd。
append(LINE_END);
sbd.append(LINE_END);
//sbd.append(boundaryNextPart)。
//append(LINE_END);
partSet.clear();
returnsbd。
toString();
}
/**
*添加邮件正文单元
*/
privatevoidaddContent(){
if(null!
=content){
MailPartpart=newMailPart();
part。
setContent(toBase64(content));
part.setContentType("text/plain;charset=\""+charset+”\”");
partSet.add(part);
}
}
privateStringlistToMailString(List〈String〉mailAddressList){
StringBuildersbd=newStringBuilder();
if(null!
=mailAddressList){
intlistSize=mailAddressList.size();
for(inti=0;i〈listSize;i++){
if(0!
=i){
sbd。
append(";");
}
sbd.append("〈”).append(mailAddressList.get(i))。
append(">”);
}
}
returnsbd.toString();
}
privateList〈String>getrecipient(){
List〈String>list=newArrayList();
list。
addAll(to);
list。
addAll(cc);
list。
addAll(bcc);
returnlist;
}
/**
*添加一个附件单元
*
*@paramfilePath
*文件路径
*/
publicvoidaddAttachment(StringfilePath){
addAttachment(filePath,null);
}
publicvoidaddTo(StringmailAddress){
this。
to。
add(mailAddress);
}
publicvoidaddCc(StringmailAddress){
this。
cc。
add(mailAddress);
}
publicvoidaddBcc(StringmailAddress){
this。
bcc。
add(mailAddress);
}
/**
*添加一个附件单元
*
*@paramfilePath
*文件路径
*@paramcharset
*文件编码格式
*/
publicvoidaddAttachment(StringfilePath,Stringcharset){
if(null!
=filePath&&filePath。
length()〉0){
Filefile=newFile(filePath);
try{
addAttachment(file.getName(),newFileInputStream(file),
charset);
}catch(FileNotFoundExceptione){
System.out。
println("错误:
”+e。
getMessage());
System.exit
(1);
}
}
}
/**
*添加一个附件单元
*
*@paramfileName
*文件名
*@paramattachmentStream
*文件流
*@paramcharset
*文件编码格式
*/
publicvoidaddAttachment(StringfileName,InputStreamattachmentStream,
Stringcharset){
try{
byte[]bs=null;
if(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);
}
}
if(null!
=bs){
MailPartattachmentPart=newMailPart();
charset=null!
=charset?
charset:
Charset。
defaultCharset()
.name();
StringcontentType=getPartContentType(fileName)
+”;name=\"=?
”+charset+”?
B?
”+toBase64(fileName)
+"?
=\"”;
attachmentPart.setCharset(charset);
attachmentPart.setContentType(contentType);
attachmentPart。
setContentDisposition("attachment;filename=\”=?
”
+charset+"?
B?
"+toBase64(fileName)+"?
=\"”);
attachmentPart.setContent(toBase64(bs));
partSet。
add(attachmentPart);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(null!
=attachmentStream){
try{
attachmentStream.close();
attachmentStream=null;
}catch(IOExceptione){
e.printStackTrace();
}
}
Runtime。
getRuntime()。
gc();
Runtime。
getRuntime()。
runFinalization();
}
}
/**
*发送邮件
*
*@return邮件服务器反回的信息
*/
publicStringsend(){
//对象申明
//当邮件发送完毕后,以下三个对象(Socket、
//PrintWriter,
//BufferedReader)需要关闭.
Socketsocket=null;
PrintWriterpw=null;
BufferedReaderbr=null;
try{
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。
toStr