当前位置: 首页 > 知识库问答 >
问题:

未使用Java邮件API接收邮件正文/内容

饶谦
2023-03-14

我有下面的代码,用于使用带有附件和正文部分(消息部分)的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);
    }
}

共有3个答案

华宪
2023-03-14

在附件前添加信息BodyPart Part

multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);

message.setContent(multipart);

否则,您将获得作为附件的正文消息

鲁鹤轩
2023-03-14

共享完整代码以发送带有正文和附件的自动化测试报告(以下附有最新报告)。

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;
}
益楷
2023-03-14

您正在调用setContent()两次。只有一个setContent()可以工作-最后一个。

为了在您的消息中有多个部分,您需要将内容设置为MimeMultipart。嗯,您正在这样做——但是多部分对象不包括应该是消息主体的部分。

如果想要包含文本和附件的邮件,可以创建MimeMultipartmultipart/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 [ //....