我有下面的代码,用于使用带有附件和正文部分(消息部分)的Java mail API发送邮件,但我只得到附件,而不是正文消息。
如有任何帮助或意见,将不胜感激。
public static void sendmail(String to, String from, String url,
String port, final String username, final String password,
String filename) {
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "false");
props.put("mail.smtp.host", url);
props.put("mail.smtp.port", port);
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject("HTML mail with images");
message.setContent("<h1>Hello world</h1>", "text/html");
message.setHeader("Content-ID", "<memememe>");
Multipart multipart = new MimeMultipart("related");
BodyPart messageBodyPart = new MimeBodyPart();
System.out.println("file attached is " + filename);
DataSource source = new FileDataSource(filename);
// messageBodyPart.setHeader("Content-ID",Part.ATTACHMENT);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(source.getName());
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart, Part.INLINE);
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException e) {
System.out.println("::::::Error while sending mail...."
+ e.getMessage());
throw new RuntimeException(e);
}
}
在附件前添加信息BodyPart Part
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
否则,您将获得作为附件的正文消息
共享完整代码以发送带有正文和附件的自动化测试报告(以下附有最新报告)。
public static void sendMail() throws NoSuchProviderException {
Properties prop = System.getProperties();
prop.put("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.host", hostName);
prop.setProperty("mail.user", uName);
prop.setProperty("mail.password", password);
prop.put("mail.smtp.starttls.enable", true);
prop.setProperty("mail.smtp.port", portNo);
prop.put("mail.smtp.auth", "true");
// Setup mail server
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(prop, auth);
try {
// session.setDebug(true);
Transport transport = session.getTransport();
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromAddr));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddr));
message.setSubject("Automation Execution Results_" + Utility.systemTimeStamp());
BodyPart messageBodyPart = new MimeBodyPart();
BodyPart attachmentPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
String filename = "AutomationTestReport.html";
DataSource source = new FileDataSource(getTheNewestFile(filePath, ".html"));
attachmentPart.setDataHandler(new DataHandler(source));
messageBodyPart.setText("Hi All" + "\n\n" + "Please find the automation test results" + "\n\n" + "Regards,"
+ "\n" + "Testing team");
attachmentPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);
// session.setDebug(true);
message.setContent(multipart);
transport.connect();
Transport.send(message);
transport.close();
System.out.println("Email report sent successfully....");
Logs.Ulog("Email report sent successfully....");
} catch (MessagingException e) {
e.printStackTrace();
System.out.println("Email report sent failed...." + e.getMessage());
Logs.Ulog("Email report sent failed...." + e.getMessage());
}
}
static class PopupAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(uName, password);
}
}
/**
* Get the newest file for a reports location
*
* @param filePath
* @param ext
* @return
*/
public static File getTheNewestFile(String filePath, String ext) {
File theNewestFile = null;
File dir = new File(filePath);
FileFilter fileFilter = new WildcardFileFilter("AutomationReport_*" + ext);
File[] files = dir.listFiles(fileFilter);
if (files.length > 0) {
/** The newest file comes first **/
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
theNewestFile = files[0];
System.out.println(theNewestFile.getName());
}
return theNewestFile;
}
您正在调用setContent()
两次。只有一个setContent()
可以工作-最后一个。
为了在您的消息中有多个部分,您需要将内容设置为MimeMultipart
。嗯,您正在这样做——但是多部分对象不包括应该是消息主体的部分。
如果想要包含文本和附件的邮件,可以创建MimeMultipart
(multipart/mixed
,而不是像您那样创建multipart/related
)。
以下是一些如何构建可能消息的示例:
最简单的是带有一些附件的文本。例如,你想把你的简历发给某人,所以你写了几句介绍,并附上一份或多份文件(求职信,简历):
mime───multipart/mixed─┬─text ├─attachment1 └─attachment2
Multipart/mixed(MimeMultipart的默认值)意味着电子邮件代理将依次连续显示这些部分。
如果您想发送一条漂亮的HTML消息,通常会同时包含纯文本版本和HTML版本。这样,即使在不支持HTML的电子邮件阅读器中,收件人也可以阅读它。如果接受者可能有视力障碍,这是非常有帮助的。因此,您需要使用multipart/alternative:
mime───multipart/mixed─┬─multipart/alternative─┬─text/plain │ └─text/html ├─attachment1 └─attachment2
所以,同样,消息内容包括三个部分,正文和两个附件。但是正文本身是一个MimeMultipart(替代)
,它包含明文版本和超文本标记语言版本。记住将明文放在第一位,超文本标记语言放在第二位,因为惯例是邮件代理选择它知道如何显示的最后一个选项。
附件将在身体后面连续显示,就像以前一样。
现在让我们来看一封没有“附件”的邮件,但是它确实有一些应该嵌入HTML中的图像。在这种情况下,邮件代理需要知道附件不仅仅是发送给要下载的阅读器的文件,还应该与HTML关联显示它们。因此,正确的mime类型是multipart/related
,以显示各部分是相关的。在这种情况下,还需要为它们提供适当的内容ID,并在HTML中使用这些内容ID。这不是MIME标准的一部分,但现在HTML邮件通常是这样做的。
就MIME而言,这样的消息如下所示:
mime───multipart/alternative─┬─text/plain └─multipart/related─┬─text/html ├─embedded image 1 └─embedded image 2
这次我们没有附件,所以我们可以把多部分/替代作为我们的顶级内容。它首先有明文替代方案,如前所述,但第二个替代方案本身是一个MimeMultipart(相关)
。
在它里面,有HTML部分和两个图像。HTML及其图像必须始终是同一个多部分/相关对象的一部分。
现在,如果您想将您的文档附加到这样一条消息,其中包含HTML和图像,该怎么办?然后,您将使用以下内容:
mime───multipart/mixed─┬─multipart/alternative─┬─text/plain │ └─multipart/related─┬─text/html │ ├─embedded image 1 │ └─embedded image 2 ├─attachment1 └─attachment2
因此,您的顶级对象是多部分/混合的,允许您向消息中连续添加附件。消息主体(多部分/混合的第一部分)是与嵌入的多部分/替代的多部分/相关的复杂结构。然后其他附件紧随其后。
总结:
MimeMultipart
对象
multipart/mixed
邮件的第一部分应该是可读邮件,其余部分是附件
multipart/alternative
消息提供相同内容的不同显示备选方案,从最常见的分母到最罕见的表示类型(例如纯文本)→HTML→富文本→专有格式)和收件人的邮件程序选择它知道如何显示的最后一个
multipart/related
消息通常用于将HTML正文与其内联消息相结合。第一部分是HTML,其他部分有HTML用于其
我编写了一个电子邮件客户端使用简单的java邮件API和it队列发送,但我没有收到任何电子邮件。 执行信息:
我遇到了一个问题,JAVA mail(JavaMail Version1.5.3)在发送电子邮件消息时抛出了一个未连接异常,而电子邮件确实被发送出去了。我从4周前就开始遇到这个问题了。该问题似乎主要与托管的exchange服务器有关。例外情况如下:
我一直在与Gmail API的意外行为作斗争。 到目前为止,我都是通过邮件获取每封邮件的正文。有效载荷。部分[0]。身体数据,其中包含base64中的消息体。在这种情况下,零件的MimeType为text/plain。 问题是,当我检索的邮件有附件时,parts[0]MimeType是“multipart/alternative”,它的主体只有空字段。 如果邮件正文有附件,我该如何获取它? 谢谢
我一直在尝试设置AWS简单电子邮件服务,作为一种将收到的电子邮件转发到我的自定义域到我的Gmail帐户的方式,而不需要任何电子邮件托管服务。 我已经设置并验证了我的自定义域(mycustomdomain.com),还验证了它们将转发到的电子邮件地址(myemail@gmail.com)因为我仍然处于沙箱模式。 在电子邮件接收下- 没有指定收件人,我认为这应该允许为我的自定义域下的所有收件人触发此规
本文向大家介绍java Mail邮件接收工具类,包括了java Mail邮件接收工具类的使用技巧和注意事项,需要的朋友参考一下 下面是一个邮件接收的工具类,有点长!!! 邮件接收与工具类的使用,有好几种邮件接收的写法!: 看了很多网上其他代码,pop3Server的值是pop.mail.163.com,但是试了试不成功,还有 user的值既可以是带有 username@...com也可以是user
注意: 本节正在开发中。 Yii 支持组成和发送电子邮件。然而,该框架提供的只有内容组成功能和基本接口。 实际的邮件发送机制可以通过扩展提供, 因为不同的项目可能需要不同的实现方式, 它通常取决于外部服务和库。 大多数情况下你可以使用 yii2-swiftmailer 官方扩展。 配置 邮件组件配置取决于你所使用的扩展。 一般来说你的应用程序配置应如下: return [ //....