Mat*_*een 2 java email api jakarta-mail
我有以下代码,用于使用带有附件和正文部分(消息部分)的 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);
}
}
Run Code Online (Sandbox Code Playgroud)
你打了setContent()两次电话。只有一种setContent()有效——最后一种。
为了在您的消息中包含多个部分,您需要将内容设置为MimeMultipart. 好吧,您正在这样做 - 但多部分对象不包括应该是消息正文的部分。
如果您想要包含文本和附件的消息,您可以创建一个MimeMultipart( multipart/mixed,而不是multipart/related像您那样)。
以下是一些有关如何构建可能的消息的示例:
最简单的是带有一些附件的文本。例如,您想将您的简历发送给某人,因此您写了几句话的介绍并附上一个或多个文件(求职信,简历):
哑剧???多部分/混合???文本
??附件1
??附件2
多部分/混合( a 的默认值MimeMultipart)意味着电子邮件代理将按顺序显示部分 - 一个接一个。
inline,并且电子邮件代理能够显示给定的附件类型,那么它将显示在邮件本身内部 - 在其末尾。attachment,它们通常会显示为某种图标或用于保存附件的链接。如果你想发送一个漂亮的 HTML 消息,习惯上同时包含一个纯文本版本和一个 HTML 版本。这样即使在不支持 HTML 的电子邮件阅读器中,收件人也可以阅读它。如果收件人可能有视力障碍,这将非常有帮助。因此,您需要使用 multipart/alternative:
mime???multipart/mixed???multipart/alternative???text/plain
? ??文本/html
??附件1
??附件2
所以,同样,消息内容包括三个部分,正文和两个附件。但是正文本身是一个MimeMultipart(alternative),它包含纯文本版本和 HTML 版本。请记住首先放置纯文本,然后放置 HTML,因为约定是邮件代理选择它知道如何显示的最后一个选项。
附件将在正文之后连续显示,就像以前一样。
现在让我们看看一封没有“附件”的邮件,但它确实有应该嵌入 HTML 中的图像。在这种情况下,邮件代理需要知道附件不仅仅是发送给阅读器以供下载的文件,而且应该与 HTML 相关联地显示它们。所以正确的 mime 类型是multipart/related, 以表明这些部分是相关的。在这种情况下,您还需要为它们提供正确的内容 ID,并在 HTML 中使用这些内容 ID。这不是 MIME 标准的一部分,但它是当今 HTML 邮件的通常处理方式。
就 MIME 而言,这样的消息将如下所示:
mime???multipart/alternative???text/plain
??multipart/related???text/html
??嵌入图像1
??嵌入图像2
这次我们没有附件,所以我们可以把multipart/alternative作为我们的顶级内容。像以前一样,它首先具有明文替代方案,但第二个替代方案本身就是一个MimeMultipart("related").
在其中,您有 HTML 部分和两个图像。HTML 及其图像必须始终是同一个多部分/相关对象的一部分。
现在,如果您想将您的文档附加到这样的消息中,其中包含 HTML和图像的消息怎么办?然后你会使用这样的东西:
mime???multipart/mixed???multipart/alternative???text/plain
? ??multipart/related???text/html
? ??嵌入图像1
? ??嵌入图像2
??附件1
??附件2
因此,您的顶级对象是多部分/混合的,允许您将附件按顺序添加到您的消息中。消息“正文”(multipart/mixed 的第一部分)是 multipart/alternative 的复杂结构,其中嵌入了 multipart/related。然后其他附件紧随其后。
总之:
MimeMultipart对象。multipart/mixed消息具有被认为是您的可读的消息的第一部分,和其余的是附件。multipart/alternative消息给出了相同内容的不同显示选择,从最常见的分母到最稀有的表示类型(例如纯文本?HTML?富文本?专有格式)排序,收件人的邮件程序选择它知道如何显示的最后一个。multipart/related消息通常用于将HTML体与它的内联消息组合。第一部分是 HTML,其他部分具有 HTML 用于其<img src="..." />标签的Content-ID 。