怎么用java发送带附件的邮件代码详解

2025-04-14 07:10:03
推荐回答(1个)
回答1:

package email;  
import java.io.BufferedReader;   
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.io.UnsupportedEncodingException;  
import java.net.Socket;  
import java.nio.charset.Charset;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
import sun.misc.BASE64Encoder;  
public class Mail {  
private static final String LINE_END = "\r\n";  
private boolean isDebug = true;  
private boolean isAllowReadSocketInfo = true;  
private String host;  
private String from;  
private List to;  
private List cc;  
private List bcc;  
private String subject;  
private String user;  
private String password;  
private String contentType;  
private String boundary;  
private String boundaryNextPart;  
private String contentTransferEncoding;  
private String charset;  
private String contentDisposition;  
private String content;  
private String simpleDatePattern;  
private String defaultAttachmentContentType;  
private List partSet;  
private static Map contentTypeMap;  
static {  
// MIME Media Types  
contentTypeMap = new HashMap();  
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");  
}  
private class MailPart extends Mail {  
public MailPart() {  
}  
}  
public Mail() {  
defaultAttachmentContentType = "application/octet-stream";  
simpleDatePattern = "yyyy-MM-dd HH:mm:ss";  
boundary = "--=_NextPart_zlz_3907_" + System.currentTimeMillis();  
boundaryNextPart = "--" + boundary;  
contentTransferEncoding = "base64";  
contentType = "multipart/alternative";  
charset = Charset.defaultCharset().name();  
partSet = new ArrayList();  
to = new ArrayList();  
cc = new ArrayList();  
bcc = new ArrayList();  
}  
private String getPartContentType(String fileName) {  
String ret = null;  
if (null != fileName) {  
int flag = fileName.lastIndexOf(".");  
if (0 <= flag && flag < fileName.length() - 1) {  
fileName = fileName.substring(flag + 1);  
}  
ret = contentTypeMap.get(fileName);  
}  
if (null == ret) {  
ret = defaultAttachmentContentType;  
}  
return ret;  
}  

private String toBase64(String str, String charset) {  
if (null != str) {  
try {  
return toBase64(str.getBytes(charset));  
} catch (UnsupportedEncodingException e) {  
e.printStackTrace();  
}  
}  
return "";  
}  
private String toBase64(byte[] bs) {  
return new BASE64Encoder().encode(bs);  
}  
private String toBase64(String str) {  
return toBase64(str, Charset.defaultCharset().name());  
}  
private String getAllParts() {  
int partCount = partSet.size();  
StringBuilder sbd = new StringBuilder(LINE_END);  
for (int i = partCount - 1; i >= 0; i--) {  
Mail attachment = partSet.get(i);  
String attachmentContent = attachment.getContent();  
if (null != attachmentContent && 0 < attachmentContent.length()) {  
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);  
partSet.clear();  
return sbd.toString();  
}  
private void addContent() {  
if (null != content) {  
MailPart part = new MailPart();  
part.setContent(toBase64(content));  
part.setContentType("text/plain;charset=\"" + charset + "\"");  
partSet.add(part);  
}  
}  
private String listToMailString(List mailAddressList) {  
StringBuilder sbd = new StringBuilder();  
if (null != mailAddressList) {  
int listSize = mailAddressList.size();  
for (int i = 0; i < listSize; i++) {  
if (0 != i) {  
sbd.append(";");  
}  
sbd.append("<").append(mailAddressList.get(i)).append(">");  
}  
}  
return sbd.toString();  
}  
private List getrecipient() {  
List list = new ArrayList();  
list.addAll(to);  
list.addAll(cc);  
list.addAll(bcc);  
return list;  
}  
public void addAttachment(String filePath) {  
addAttachment(filePath, null);  
}  
public void addTo(String mailAddress) {  
this.to.add(mailAddress);  
}  
public void addCc(String mailAddress) {  
this.cc.add(mailAddress);  
}  
public void addBcc(String mailAddress) {  
this.bcc.add(mailAddress);  
}  
public void addAttachment(String filePath, String charset) {  
if (null != filePath && filePath.length() > 0) {  
File file = new File(filePath);  
try {  
addAttachment(file.getName(), new FileInputStream(file),  
charset);  
} catch (FileNotFoundException e) {  
System.out.println("错误:" + e.getMessage());  
System.exit(1);  
}  
}  
}