未使用Java邮件API接收邮件正文/内容
我有下面的代码,用于使用带有附件和正文部分(消息部分)的Java mail API发送邮件,但我只得到附件,而不是正文消息 如有任何帮助或意见,将不胜感激未使用Java邮件API接收邮件正文/内容,java,api,email,jakarta-mail,Java,Api,Email,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) { Propertie
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);
}
}
publicstaticvoidsendmail(stringto、stringfrom、stringurl、,
字符串端口、最终字符串用户名、最终字符串密码、,
字符串(文件名){
Properties props=新属性();
props.put(“mail.smtp.auth”,“true”);
props.put(“mail.smtp.starttls.enable”、“false”);
put(“mail.smtp.host”,url);
props.put(“mail.smtp.port”,port);
会话=会话.getInstance(props,
新的javax.mail.Authenticator(){
受保护的密码身份验证getPasswordAuthentication(){
返回新密码身份验证(用户名、密码);
}
});
试一试{
Message Message=新的mimessage(会话);
message.setFrom(新的InternetAddress(from));
message.setRecipients(message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(“带有图像的HTML邮件”);
message.setContent(“helloworld”、“text/html”);
message.setHeader(“内容ID”,即“”);
Multipart Multipart=新的mimemmultipart(“相关”);
BodyPart messageBodyPart=新的MimeBodyPart();
System.out.println(“附加的文件是”+文件名);
DataSource source=新文件DataSource(文件名);
//messageBodyPart.setHeader(“内容ID”,Part.ATTACHMENT);
setDataHandler(新的DataHandler(源));
messageBodyPart.setFileName(source.getName());
multipart.addBodyPart(messageBodyPart);
message.setContent(多部分,Part.INLINE);
传输。发送(消息);
System.out.println(“已成功发送消息…”);
}捕获(消息异常e){
System.out.println(“::发送邮件时出错…”
+e.getMessage());
抛出新的运行时异常(e);
}
}
您正在调用setContent()
两次。只有一个setContent()
可以工作-最后一个
为了在邮件中包含多个部分,您需要将内容设置为MimeMultipart
。好的,您正在这样做-但是multipart对象不包括应该是消息体的部分
如果想要包含文本和附件的邮件,可以创建MimeMultipart
(multipart/mixed
,而不是像您那样创建multipart/related
)
下面是一些如何构造可能的消息的示例:
最简单的是带有一些附件的文本。例如,您想将您的简历发送给某人,因此您写了几句介绍,并附上一份或多份文件(求职信、简历): 同样,消息内容包括三个部分,正文和两个附件。但正文本身是一个
MimeMultipart(可选)
,它包含纯文本版本和HTML版本。请记住将明文放在第一位,HTML放在第二位,因为惯例是邮件代理选择它知道如何显示的最后一个选项
附件将在正文之后连续显示,就像前面一样
现在让我们来看一封没有“附件”的邮件,但是它确实有一些应该嵌入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
因此,您的顶级对象是多部分/混合的,允许您将附件连续添加到邮件中。消息“body”(multipart/mixed的第一部分)是multipart/alternative的复杂结构,带有嵌入式multipart/related。然后其他的附件也跟着
总之:
- 如果消息的结构不仅仅是纯文本正文,那么它的内容必须是某种类型的
对象MimeMultipart
邮件的第一部分应该是可读邮件,其余部分是附件multipart/mixed
消息提供相同内容的不同显示备选方案,从最常见的分母到最罕见的表示类型(例如纯文本)→HTML→富文本→专有格式)和收件人的邮件程序选择它知道如何显示的最后一个multipart/alternative
消息通常用于将HTML正文与其内联消息相结合。第一部分是HTML,其他部分有HTML用于其multipart/related
标记的内容ID
在attachmentPart之前添加messageBodyPart
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
否则,您将以附件的形式获取正文消息您将调用
setContent()
两次。第二次调用将替换第一次调用中设置的内容。那么,我如何调用message.setContent()一次来发送邮件附件和文本消息?很抱歉回复太晚,但您能否告诉我附加文档和消息的代码中到底缺少了什么?我不是java方面的专家。。!我有
mime───multipart/alternative─┬─text/plain
└─multipart/related─┬─text/html
├─embedded image 1
└─embedded image 2
mime───multipart/mixed─┬─multipart/alternative─┬─text/plain
│ └─multipart/related─┬─text/html
│ ├─embedded image 1
│ └─embedded image 2
├─attachment1
└─attachment2
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;
}
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);