未使用Java邮件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

我有下面的代码,用于使用带有附件和正文部分(消息部分)的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);
    }
}
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
    邮件的第一部分应该是可读邮件,其余部分是附件
  • multipart/alternative
    消息提供相同内容的不同显示备选方案,从最常见的分母到最罕见的表示类型(例如纯文本)→HTML→富文本→专有格式)和收件人的邮件程序选择它知道如何显示的最后一个
  • multipart/related
    消息通常用于将HTML正文与其内联消息相结合。第一部分是HTML,其他部分有HTML用于其
    标记的内容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);