邮件可以抽象为信封、邮件和邮件体。
RFC822文档规定了如何编写一封简单邮件
•邮件头和邮件体,两者使用空行分隔
•邮件头
•from字段
•to字段
•subject字段
•cc、bcc字段
•邮件体
•邮件内容
•冒充邮箱,编写欺骗邮件
•MIME协议规定了如何编写一封复杂邮件,MIME协议是对RFC822文档的升级和补充。
•对于包含不同类型数据的复杂邮件,MIME协议对不同数据进行分隔,并使用Content-Type头字段描述数据类型、以及不同数据之间的关系。
•数据类型
•以“主类型/子类型”的形式出现,主类型有text、image、audio、video、application、multipart、message等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包含plain、html、xml、css等子类型。
•数据的关系
•multipart/mixed、multipart/related、multipart/alternative MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据也称之为MIME消息。
•Content-Disposition头字段
Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”。 Content-ID头字段
Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
public String[] sendHtmlWithImg(String subject, String htmlText, ArrayList imgs, String[] mails) {
String[] result = {"", ""};
Session session = null;
Message message = null;
MimeMultipart multipart = null;
Transport transport = null;
props = new Properties();
//props.put("mail.transpost.protocol", "smtp");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "false");
try
{
session = Session.getDefaultInstance(props, null);
session.setDebug(false);
message = new MimeMessage(session);
message.setSubject(subject);
String[] tempArray = mails[0].split("`");
String fromMail = tempArray[0];
String fromPerson = tempArray[1];
String feedback = tempArray[2];
message.setFrom(new InternetAddress(fromMail, fromPerson));
//是否要求回执
if(feedback.equals("on.")) {
message.setHeader("Disposition-Notification-To", fromMail);
}
tempArray = mails[1].split(";");
for(int i=0;i<tempArray.length;i++) {
if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
{
continue;
}
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(tempArray[i]));
}
tempArray = mails[2].split(";");
for(int i=0;i<tempArray.length;i++) {
if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
{
continue;
}
message.addRecipient(Message.RecipientType.CC,
new InternetAddress(tempArray[i]));
}
tempArray = mails[3].split(";");
for(int i=0;i<tempArray.length;i++) {
if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
{
continue;
}
message.addRecipient(Message.RecipientType.BCC,
new InternetAddress(tempArray[i]));
}
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(htmlText, "text/html;charset=GBK");
multipart = new MimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
result[0] = "ok";
for(int i=0;i<imgs.size();i++) {
String[] temp = (String[])imgs.get(i);
String f = temp[0];
if (new File(f).exists())
{
try{
DataSource fds = new FileDataSource(f);
messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID","<"+temp[1]+">");
multipart.addBodyPart(messageBodyPart);
} catch (Exception e) {
System.out.println(e);
result[0] = "no";
result[1] = ("未知错误!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", " ");
break;
}
}
else {
result[1] = ("系统找不到指定的文件:"+f).replaceAll("\r", " ").replaceAll("\n", " ").replaceAll("'", " ");
}
}
message.setContent(multipart);
message.saveChanges();
transport = session.getTransport("smtp");
transport.connect(currentMailServer, null, null);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (AddressException e) {
System.out.println(e);
result[0] = "no";
result[1] = ("无效邮件地址!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", " ");
} catch (MessagingException e) {
System.out.println(e);
currentMailServer = MAIL_SMTP_HOST[1];
try {
transport.connect(currentMailServer, null, null);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
result[0] = "ok";
}
catch (MessagingException ex) {
System.out.println(ex);
currentMailServer = MAIL_SMTP_HOST[2];
try {
transport.connect(currentMailServer, null, null);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
result[0] = "ok";
}
catch (Exception ex2) {
System.out.println(ex2);
result[0] = "no";
result[1] = "邮件服务器繁忙,请稍候再试!";
}
}
} catch (Exception e) {
e.printStackTrace();
result[0] = "no";
result[1] = ("未知错误!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", " ");
}
multipart = null;
message = null;
session = null;
transport = null;
//System.out.println("currentMailServer="+currentMailServer);
return result;
}
分享到:
相关推荐
string body = @"这是一封包含内嵌图片的邮件</h1><br /> <img src='cid:MyPic' /><br /> 点击在新窗口打开图片</a>"; mail.Body = body; // 创建图片附件 Attachment attachment = new Attachment(@"C:\path...
在更复杂的场景下,如果邮件需要包含内嵌资源或附件,可以使用`MimeBodyPart`和`MimeMultipart`类。`MimeBodyPart`代表邮件的一个MIME消息,可以封装文本、图片、文件等。`MimeMultipart`则可以组合多个`...
这个服务能够发送HTML格式的邮件,其中包含内嵌的图片,并且能够处理附件,同时解决字符编码可能导致的乱码问题。以下是详细的知识点讲解: 1. **Spring Framework**:Spring 是一个广泛使用的 Java 应用开发框架,...
在压缩包文件`MAPI`中,可能包含了一些关于如何利用MAPI接口的更详细资料,比如如何处理邮件的其他复杂属性,或者如何处理多邮件的批量操作等。这些内容可能涉及到更底层的MAPI接口使用,对开发者来说,理解和使用...
2. **创建正文**:为了创建包含图片的 HTML 正文,我们需要创建一个 `MimeBodyPart` 来存储 HTML 内容,然后创建一个 `MimeMultipart("related")`,将 HTML 和图片关联在一起。`"related"` 参数指示这些部分是相关的...
- 使用 `MimeMessage` 类可以创建包含多种类型内容的消息体。 3. **添加附件和内嵌资源** - JavaMail 支持在邮件中添加附件,并能将图片等资源嵌入到 HTML 内容中,实现富文本展示。 4. **处理 HTML 内容** - ...
2. **预览附件**:用户无需打开原始邮件,即可通过OutlookAttachView预览内嵌附件的详细信息,如文件类型、大小、创建日期等,这对于快速查找和评估附件内容非常有帮助。 3. **导出附件**:OutlookAttachView允许...
本篇文章将深入探讨如何使用Java编写程序来实现邮件的发送,包括发送纯文本邮件、带有附件的邮件、包含图片的邮件以及在邮件中显示图片。 首先,我们得知道JavaMail API是实现邮件发送功能的关键库。它提供了一系列...
// 创建包含内嵌图片的邮件正文 MimeBodyPart messageBodyImagePart = new MimeBodyPart(); // 假设图片资源为:C:\image\example.jpg DataSource fds = new FileDataSource("C:\\image\\example.jpg"); ...
这个方法不仅适用于发送简单的内嵌图片,还可以扩展到包含多个图片、链接和其他富媒体内容的复杂邮件。请注意,实际应用中需要根据你的SMTP服务器配置进行相应的调整,例如设置用户名、密码、端口等信息。此外,为了...
在Vue邮件系统中,开发者可以学习到如何创建、组织和管理Vue组件,这些组件可以代表邮件列表、单个邮件、发送表单等不同的界面元素。通过组件化,项目代码变得模块化,易于理解和维护。 Vue Router是Vue.js官方的...
2. **自动内嵌CSS**:为了解决CSS在邮件客户端中可能遇到的兼容性问题,`email-templates`支持自动将CSS内联到HTML元素中,确保邮件在各种阅读器中的显示效果一致。 3. **样式表与嵌入图像**:除了内联CSS,该库还...
总结来说,Spring框架为Java应用程序提供了强大且灵活的邮件发送功能,无论是简单的文本邮件还是复杂的HTML邮件,甚至是包含附件和内嵌资源的邮件,都能通过其高级抽象层轻松实现。同时,配合模板引擎,可以有效地...
- 类似于HTML邮件的创建过程,但额外支持内嵌资源(如图片),这通常用于邮件中的图片不会作为附件而是直接显示在邮件正文中。 - 需要在`MimeMessageHelper`中使用`addInline`方法添加内嵌资源。 #### 四、扩展...
- **目的**:生成包含文本、附件和内嵌图片的复杂邮件。 ##### 发送邮件 - **核心类**:`javax.mail.Transport` 类。 - **步骤**: - 创建 `Session` 对象,包含邮件服务器的网络连接信息。 - 创建 `Message` ...
JavaMail允许开发者自定义邮件的MIME类型,因此可以创建一个包含内嵌图片的MIMEMessage,并使用MimeBodyPart来添加这些资源。 接下来,我们谈谈如何结合Redis。Redis是一个内存数据存储系统,可以作为数据库、缓存...
"outlook删除重复邮件宏代码.txt"文件很可能包含了这样的宏代码,它能帮助用户自定义一个过程,自动扫描并删除指定文件夹中的重复邮件。 宏的使用通常涉及到VBA(Visual Basic for Applications),这是Microsoft ...