1 .依赖库
mail.jar
2. 代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.internet.ParseException;
import javax.mail.internet.PreencodedMimeBodyPart;
import org.apache.log4j.Logger;
public class MimeEncoder {
private Logger logger = Logger.getLogger(MimeEncoder.class);
private String encoding = "UTF-8";
private String transferEncoding = "base64";
private String subtype = "mixed";
private MimeBodyPart txtContent;
private MimeBodyPart htmlContent;
private List<MimeBodyPart> inlineList = new ArrayList<MimeBodyPart>(); //内嵌文件
private List<MimeBodyPart> attachmentList = new ArrayList<MimeBodyPart>(); //附件
private Map<String, String> headers = new LinkedHashMap<String, String>();
public MimeEncoder(){
}
public MimeEncoder(String encoding){
this.encoding = encoding;
}
/**
* 构造MIME编码器
* @param encoding String MIME正文默认字符编码
* @param transferEncoding MIME段体传输编码("base64", "quoted-printable", "7bit", "8bit", "binary", "uuencode")
*/
public MimeEncoder(String encoding, String transferEncoding){
this.encoding = encoding;
this.transferEncoding = transferEncoding;
}
public void setSubType(String subtype){
this.subtype = subtype;
}
public void setHeader(String name, String value){
headers.put(name, value);
}
private String readFile(File f)throws IOException, MessagingException{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
String s = encodeInputStream(bis);
bis.close();
return s;
}
private String contentEnode(String contentText, String contentType)throws IOException, MessagingException{
String contentEncode = encoding;
if(contentType != null){
ContentType ct = new ContentType(contentType);
if(ct.getParameter("charset") != null){
contentEncode = ct.getParameter("charset");
}
}
return contentEnode(contentText.getBytes(contentEncode));
}
private String contentEnode(byte[] content)throws IOException, MessagingException{
ByteArrayInputStream bais = new ByteArrayInputStream(content);
String s = encodeInputStream(bais);
bais.close();
return s;
}
private String encodeInputStream(InputStream is)throws IOException, MessagingException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream os = MimeUtility.encode(baos, transferEncoding);
int data = -1;
while((data = is.read()) != -1){
os.write(data);
}
String s = baos.toString(encoding);
os.close();
baos.close();
return s;
}
public void setTxtContent(String content)throws ParseException{
ContentType ct = new ContentType("text/plain");
ct.setParameter("charset", encoding);
setTxtContent(content, ct.toString());
}
public void setTxtContent(String content, String contentType){
PreencodedMimeBodyPart txtContentPart = new PreencodedMimeBodyPart(transferEncoding);
try {
txtContentPart.setText(contentEnode(content, contentType));
if(contentType != null){
txtContentPart.setHeader("Content-Type", contentType);
}
this.txtContent = txtContentPart;
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void setHtmlContent(String content)throws ParseException{
ContentType ct = new ContentType("text/html");
ct.setParameter("charset", encoding);
setHtmlContent(content, ct.toString());
}
public void setHtmlContent(String content, String contentType){
PreencodedMimeBodyPart htmlContentPart = new PreencodedMimeBodyPart(transferEncoding);
try {
htmlContentPart.setText(contentEnode(content, contentType));
if(contentType != null){
htmlContentPart.setHeader("Content-Type", contentType);
}
this.htmlContent = htmlContentPart;
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void addAttachment(File f, String contentType){
PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
try {
attachmentPart.setText(readFile(f));
attachmentPart.setDisposition(Part.ATTACHMENT);
attachmentPart.setFileName(nameEncode(f.getName()));
if(contentType != null){
attachmentPart.setHeader("Content-Type", contentType);
}
attachmentList.add(attachmentPart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void addAttachment(String fileName, String contentText, String contentType){
PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
try {
attachmentPart.setText(contentEnode(contentText, contentType));
attachmentPart.setDisposition(Part.ATTACHMENT);
attachmentPart.setFileName(fileName);
if(contentType != null){
attachmentPart.setHeader("Content-Type", contentType);
}
attachmentList.add(attachmentPart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
e.printStackTrace();
}
}
public void addAttachment(String fileName, byte[] data, String contentType){
PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
try {
attachmentPart.setText(contentEnode(data));
attachmentPart.setDisposition(Part.ATTACHMENT);
attachmentPart.setFileName(fileName);
if(contentType != null){
attachmentPart.setHeader("Content-Type", contentType);
}
attachmentList.add(attachmentPart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
e.printStackTrace();
}
}
public void addInline(File f, String contentType){
addInline(f.getName(), f, contentType);
}
public void addInline(String name, File f, String contentType){
PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
try {
inlinePart.setText(readFile(f));
inlinePart.setDisposition(Part.INLINE);
inlinePart.setContentID(nameEncode(name));
if(contentType != null){
inlinePart.setHeader("Content-Type", contentType);
}
inlineList.add(inlinePart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void addInline(String name, String contentText, String contentType){
PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
try {
inlinePart.setText(contentEnode(contentText, contentType));
inlinePart.setDisposition(Part.INLINE);
inlinePart.setContentID(nameEncode(name));
if(contentType != null){
inlinePart.setHeader("Content-Type", contentType);
}
inlineList.add(inlinePart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void addInline(String name, byte[] data, String contentType){
PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
try {
inlinePart.setText(contentEnode(data));
inlinePart.setDisposition(Part.INLINE);
inlinePart.setContentID(nameEncode(name));
if(contentType != null){
inlinePart.setHeader("Content-Type", contentType);
}
inlineList.add(inlinePart);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
protected String nameEncode(String s)throws UnsupportedEncodingException{
return MimeUtility.encodeText(s, encoding, "B");
}
public static String nameEncode(String s, String encoding)throws UnsupportedEncodingException{
return MimeUtility.encodeText(s, encoding, "B");
}
public String encode(){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
encodeToOutputStream(baos);
try {
return baos.toString("iso-8859-1");
} catch (UnsupportedEncodingException e) {
logger.warn(e.getMessage(), e);
}
return null;
}
public void encodeToOutputStream(OutputStream os){
try {
MimeMultipart multipart = new MimeMultipart(subtype);
if((txtContent != null) && (htmlContent != null)){
MimeMultipart contentPart = new MimeMultipart("alternative");
contentPart.addBodyPart(txtContent);
contentPart.addBodyPart(htmlContent);
MimeBodyPart part = new MimeBodyPart();
part.setContent(contentPart);
multipart.addBodyPart(part);
}else if(txtContent != null){
multipart.addBodyPart(txtContent);
}else if(htmlContent != null){
multipart.addBodyPart(htmlContent);
}
for(MimeBodyPart attachment : attachmentList){
multipart.addBodyPart(attachment);
}
for(MimeBodyPart inline : inlineList){
multipart.addBodyPart(inline);
}
MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
for(String key : headers.keySet()){
message.setHeader(key, headers.get(key));
}
message.setContent(multipart);
message.writeTo(os);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
public void encodeToFile(String f){
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(f));
encodeToOutputStream(bos);
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}finally{
if(bos != null){
try {
bos.close();
} catch (IOException e) {
logger.warn(e.getMessage(), e);
}
}
}
}
}
3. 测试
public static void main(String args[])throws Exception{
MimeEncoder encoder = new MimeEncoder("UTF-8");
encoder.setTxtContent("文本内容");
encoder.setHtmlContent("<b>html内容</b><img src='cid:f1'/>");
encoder.addInline("f1", new File("d:/test/内嵌文件.gif"), "image/gif");
encoder.addAttachment(new File("d:/test/附件.txt"), "text/plain");
encoder.encodeToFile("d:/test/mime.eml");
}
执行完测试代码后会生成一个mime.eml文件, 该文件可以使用记事本等文件编辑器打开,也可以使用FoxMail等邮件工具打开。
- 大小: 1.9 KB
分享到:
相关推荐
《运用设计模式设计MIME编码类》是一篇关于在编程中如何使用设计模式来构建一个MIME(Multipurpose Internet Mail Extensions)编码类的文章。MIME是互联网标准,用于定义非ASCII字符的邮件传输和格式,它扩展了电子...
MIME64是MIME编码的一种,主要用于将二进制数据转换为ASCII文本,以便在电子邮件或其他网络协议中传输。在某些情况下,特别是涉及到特定软件如Foxmail时,可能会遇到一些编码问题,比如对某些小于0x7f的ASCII字符...
### MIME编码介绍 #### 一、MIME:Multipurpose Internet Mail Extensions MIME,全称为Multipurpose Internet Mail Extensions,即“多用途互联网邮件扩展”,是一种用于处理非纯文本信息的标准编码方式。它允许...
9. **编码MIME编码**:虽然Go的`mime`包本身不提供MIME编码,但`mime/multipart`和`mime/quotedprintable`包提供了编码功能,可以根据需要进行使用。 通过以上知识点,我们可以看出Go的`mime`包在处理网络数据、...
1. MIME编码:MIME定义了多种编码方式,如Base64、Quoted-Printable和Binary。Base64常用于将二进制数据转换为ASCII文本,以便在网络上传输;Quoted-Printable则用于保持文本格式,避免特殊字符被误解;Binary则用于...
.NET POP3 MIME Client 是一个基于.NET框架的邮件客户端开发库,它主要用于实现POP3协议来检索电子邮件,并且处理MIME编码的邮件内容。这个库可能是由一个国外的开发者或团队创建,供其他开发者在自己的应用程序中...
webMethods是一款由同名公司开发的企业服务总线(ESB)和业务流程管理(BPM)软件,其版本7.1的“MIME-S/MIME Developer’s Guide”提供了深入理解MIME编码、解码以及在Web服务通信中的应用的宝贵资源。 ### MIME与...
MIME编码通常用于在电子邮件中传输非ASCII字符或特殊格式的文本,例如中文、日文等语言或带有特殊符号的邮件主题和正文。 #### 核心知识点分析: 1. **MIME编码:**MIME是一种标准协议,允许通过电子邮件发送二...
描述中提到的“一个PHP邮件mime解析器”进一步强调了这是一个用PHP编写的工具,专注于处理MIME编码的邮件。这暗示了该解析器可能具有以下特点: 1. **解析MIME头**:能解析并解码邮件头中的字段,如编码的地址、...
通过这些文件,开发者可以学习如何在自己的应用程序中实现MIME编码和解码,这对于创建跨平台的邮件客户端、Web服务或其他需要处理复杂数据格式的项目来说非常有用。例如,你可以使用MIME来发送带有附件的电子邮件,...
C# 类库来实现MIME的编码和解码 MimeMessage mail new MimeMessage ; mail SetDate ; mail Setversion ; mail SetFrom "sender@local com" null ; mail SetTo "recipient1@server1 com Nick Name...
例如,在电子邮件和网页中,可能会使用MIME编码的"iso-2022-jp"来表示Shift JIS,或者在HTML文档中使用`<meta>`标签指定字符集为Shift JIS。 总的来说,Shift JIS编码作为日文处理的重要工具,虽然有其独特的优势,...
总的来说,“VC++ 基于MIME的邮件附件发送”涉及网络编程、SMTP协议、MIME编码和Windows API的使用。理解这些概念并熟练运用,开发者可以构建出能够发送带附件的电子邮件的应用程序,这对于自动化报告、通知服务和...
enmime是Go的MIME编码和解码库,专注于生成和解析MIME编码的电子邮件。 它与电子邮件服务一起开发。 enmime包括一个流畅的界面生成器,用于生成MIME编码的消息,请参阅Wiki中的示例。 有关示例和API使用信息,请...
MHT全称是MIME HTML,它是一种Web档案格式,使用MIME编码将网页的所有元素打包在一起。这种格式方便离线查看或传输网页内容,因为它不需要互联网连接来重新加载图片和其他外部资源。 在编程中,实现将网页保存为MHT...
2. **MIME编码**:多媒体内容被封装在一个MIME(Multipurpose Internet Mail Extensions)消息中,MIME是一种标准,用于定义非ASCII字符的电子邮件内容。它将不同的媒体类型(如文本、图像、音频等)用特定的头部...
MIME编码允许邮件包含文本、图像、音频、视频等多种类型的数据,使得电子邮件可以传递更丰富的信息。在PHP中,处理MIME编码邮件的库通常包括创建、解析和操作MIME格式的工具。 "Mimemai"是一个专门针对此功能的PHP...
这里,`$subject`变量包含了邮件的主题内容,通过调用`base64_encode()`函数将其转换为Base64编码格式,然后使用特定的MIME编码语法进行封装,最终形成符合MIME标准的编码字符串。 ### 实现细节 1. **编码选择**:...
3. **处理MIME编码**:邮件正文和附件可能被MIME编码,`MimeCode`类的功能就在这里发挥作用,将编码内容解码成可读格式。 4. **处理MIME类型**:`MimeType`类可能用于识别和处理不同类型的MIME实体,如文本、图像、...