如何用邮箱发送图片不是附件 java_Java程序中使用JavaMail发送带图片和附件的邮件...

本文介绍了如何使用JavaMail发送内含附件和内嵌图片的邮件,通过MimeBodyPart、MimeMultipart等类创建正文、附件和内嵌图片,实现了邮件的多媒体展示。
摘要由CSDN通过智能技术生成

我们常常在邮件中添加附件,以达到传输较大文件的目的。而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩。我们想要一封正文部分图文并茂,而游客附带若干附件的邮件。

下面是代码结构中3个重要的方法:

MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回;

MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并返回;

MimeMessage createMessage(Session session) 方法用于调用上面的两个方法生成邮件。

其实,创建一个内含附件的邮件与上一篇文章中创建正文中包含图片的邮件的原理,甚至代码都几乎相同。也就是使用 JAF 框架中的 FileDataSource 类和 DataHandler 类来获得给定路径的资源文件,JAF 框架中的这两个类共同协作可以获知文件所属的 MIME 类型,它们会正确地添加到邮件组织结构中的对应消息头中。

不同的是:

在 HTML 格式的正文中内含图片是使用 MimeBody.setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段;

而在 MIME 邮件中添加附件是使用 MimeBodyPart.setFileName() 方法来关联 FileSourceData 对象指向的资源文件。

程序代码:

这个不同点在下面代码中会用橙色背景强调指出,代码如下:

import java.io.FileOutputStream;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

/**

* 创建内含附件、图文并茂的邮件

* @author haolloyin

*/

public class WithAttachmentMessage {

/**

* 根据传入的文件路径创建附件并返回

*/

public MimeBodyPart createAttachment(String fileName) throws Exception {

MimeBodyPart attachmentPart = new MimeBodyPart();

FileDataSource fds = new FileDataSource(fileName);

attachmentPart.setDataHandler(new DataHandler(fds));

attachmentPart.setFileName(fds.getName());

return attachmentPart;

}

/**

* 根据传入的邮件正文body和文件路径创建图文并茂的正文部分

*/

public MimeBodyPart createContent(String body, String fileName)

throws Exception {

// 用于保存最终正文部分

MimeBodyPart contentBody = new MimeBodyPart();

// 用于组合文本和图片,"related"型的MimeMultipart对象

MimeMultipart contentMulti = new MimeMultipart("related");

// 正文的文本部分

MimeBodyPart textBody = new MimeBodyPart();

textBody.setContent(body, "text/html;charset=gbk");

contentMulti.addBodyPart(textBody);

// 正文的图片部分

MimeBodyPart jpgBody = new MimeBodyPart();

FileDataSource fds = new FileDataSource(fileName);

jpgBody.setDataHandler(new DataHandler(fds));

jpgBody.setContentID("logo_jpg");

contentMulti.addBodyPart(jpgBody);

// 将上面"related"型的 MimeMultipart 对象作为邮件的正文

contentBody.setContent(contentMulti);

return contentBody;

}

/**

* 根据传入的 Seesion 对象创建混合型的 MIME消息

*/

public MimeMessage createMessage(Session session) throws Exception {

String from = test_hao@163.com;

String to = "test_hao@sina.cn";

String subject = "创建内含附件、图文并茂的邮件!";

String body = "

内含附件、图文并茂的邮件测试!!!
"

+ " 蚂蚁"

+ "%5C%22cid:logo_jpg%5C%22";

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));

msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));

msg.setSubject(subject);

// 创建邮件的各个 MimeBodyPart 部分

MimeBodyPart attachment01 = createAttachment("F:\\java\\Snake.java");

MimeBodyPart attachment02 = createAttachment("F:\\java\\meng.mp3");

MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg");

// 将邮件中各个部分组合到一个"mixed"型的 MimeMultipart 对象

MimeMultipart allPart = new MimeMultipart("mixed");

allPart.addBodyPart(attachment01);

allPart.addBodyPart(attachment02);

allPart.addBodyPart(content);

// 将上面混合型的 MimeMultipart 对象作为邮件内容并保存

msg.setContent(allPart);

msg.saveChanges();

return msg;

}

// 测试生成邮件

public static void main(String[] args) throws Exception {

WithAttachmentMessage mail = new WithAttachmentMessage();

Session session = Session.getDefaultInstance(new Properties());

MimeMessage message = mail.createMessage(session);

message.writeTo(new FileOutputStream("withAttachmentMail.eml"));

}

}

编译、运行生成 withAttachmentMail.eml 文件,双击打开,如下图:

7c3732f6c67c9c435f76c6aa83fc79c0.png

c0c36fa9d76929fab1377c5e68df1b30.png

看看上面用 Outlook 打开生成的文件,在附件栏里面就有一个 .java 源文件和一首 MP3 文件了。

打开邮件的原始内容:

查看生成的邮件的原始内容,点击“文件”、“属性”、“邮件来源”或者使用 EditPlus 、UltraEdit 等文本编辑器直接打开也行,下面是原始内容:

From: test_hao@163.com

To: test_hao@sina.cn

Message-ID: <56667.2.1279677956578.JavaMail.Administrator@WWW-1477FF1578B>

Subject: =?GBK?B?tLS9qMTauqy4vbz+oaLNvM7EsqLDr7XE08q8/qOh?=

MIME-Version: 1.0

Content-Type: multipart/mixed;

boundary="----=_Part_1_13249998.1279677956546"

------=_Part_1_13249998.1279677956546

Content-Type: application/octet-stream; name=Snake.java

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=Snake.java

// 省略被 BASE64 转码后的 Snake.java 附件内容

------=_Part_1_13249998.1279677956546

Content-Type: application/octet-stream; name=meng.mp3

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=meng.mp3

// 省略被 BASE64 转码后的 meng.java 附件内容

------=_Part_1_13249998.1279677956546

Content-Type: multipart/related;

boundary="----=_Part_0_3373112.1279677956546"

------=_Part_0_3373112.1279677956546

Content-Type: text/html;charset=gbk

Content-Transfer-Encoding: quoted-printable

=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC=

=FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1

og.51cto.com/> =C2=EC=D2=CF

3D

------=_Part_0_3373112.1279677956546

Content-Type: image/jpeg

Content-Transfer-Encoding: base64

Content-ID: logo_jpg

// 省略被 BASE64 转码后的邮件正文部分内嵌的 .jpg 图片的内容

------=_Part_0_3373112.1279677956546--

------=_Part_1_13249998.1279677956546--

重要部分已经用背景颜色指出来了,有兴趣的可以深入了解一下 MIME 协议对邮件结构组织的规范格式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值