【问题标题】:When sending email using javamail-android the body is attached as a text file使用 javamail-android 发送电子邮件时,正文作为文本文件附加
【发布时间】:2012-06-14 20:32:27
【问题描述】:

我正在使用JavaMail port for android 发送电子邮件,而无需用户干预应用程序。而且我注意到某些电子邮件系统无法正确显示电子邮件正文。当我将电子邮件发送到 Gmail 时,正文显示正确,但是当我将其发送到公司电子邮件时(我不确定它使用的是什么,但它是来自电信的商业邮件),正文是空白的,而是有一个附件包含正文内容的文本文件 ATT00001.txt。

我不是邮件系统方面的专家,但从我用来设置电子邮件正文的代码来看,它似乎与您附加文件的方式非常相似,也许这就是为什么正文不被识别为正文,但作为附件。

下面的代码 sn -p 是邮件的创建方式。 body 和 subject 都是预先初始化的。

public synchronized void send() throws MessagingException {   
    MimeMessage message = new MimeMessage(session);   
    BodyPart bodyPart = new MimeBodyPart();
    bodyPart.setText(body);
    message.setSender(new InternetAddress(sender));   
    message.setSubject(subject);   
    //message.setDataHandler(handler);
    multipart.addBodyPart(bodyPart);
    message.setContent(multipart);
    if (recipients.indexOf(',') > 0)   
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
    else  
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
    Transport.send(message);  
    user = null;
    password = null;
    session = null;
}   

如果有人知道如何解决这个问题,请帮助我!对我的应用程序来说,将 body 显示为 body 很重要。另外,如果有更好的无需用户干预的方式发送电子邮件,也请提出建议。

感谢您的帮助。

编辑:

我尝试使用 .setText() 而不是 BodyPart

message.setText(body);

这根本没有显示来自 Gmail 的正文,并显示了来自公司邮件的一些奇怪的字符串

--------=_Part_2_1079750440.1339556360521--

在测试这些时,我创建了一个电子邮件测试活动,它基本上通过单击按钮发送电子邮件。在尝试了一些东西之后,我把我的课程改回原来的样子(使用 BodyPart),然后它就起作用了!看起来是附件导致了问题,我认为我附加文件的方式不正确。

public void addAttachment(File file) throws MessagingException {
    BodyPart messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(file);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(file.getName());
    multipart.addBodyPart(messageBodyPart);     
}

这个 addAttachment() 函数在 send() 之前调用。

这有什么问题?

编辑:

如果其他人也遇到同样的问题,这就是我修复它的方法。通过在添加附件之前设置正文解决了该问题。所以我没有在发送时设置body,而是预先单独设置body。

public void setBody(String body) throws MessagingException {
    BodyPart bodyPart = new MimeBodyPart();
    bodyPart.setText(body);
    multipart.addBodyPart(bodyPart);
}

public synchronized void send() throws MessagingException {   
    MimeMessage message = new MimeMessage(session);   
    message.setSender(new InternetAddress(sender));   
    message.setSubject(subject);   
    message.setContent(multipart);
    if (recipients.indexOf(',') > 0)   
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
    else  
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
    Transport.send(message);  
    user = null;
    password = null;
    session = null;
}   

所以当我调用函数时,我首先调用 setBody(),然后是 addAttachment(),然后是 send()。 现在电子邮件的正文已按原样显示。

【问题讨论】:

    标签: android jakarta-mail


    【解决方案1】:

    这似乎是 JavaMail API 的问题(不仅仅是在 android 中!),我遇到了同样的问题,重新排序(在附件部分之前添加 HTML 部分)解决了它。

    注意:此外,如果收件人的邮箱以不同方式处理 HTML(与 MS Outlook 不同,它可以完美运行),则只能复制此问题。

    BodyPart attachmentBodyPart = new MimeBodyPart();
    BodyPart htmlBodyPart = new MimeBodyPart();
    Multipart multipart = new MimeMultipart();
    MimeMessage message = new MimeMessage(session);
    
    message.setSubject("Some subject");
    message.setFrom(new InternetAddress("some-from-email@abc.org"));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("some-recipient-email@abc.com"));
    
    DataSource ds = new FileDataSource("./somedirectory" + File.separator + "filename.pdf");
    
    attachmentBodyPart.setDataHandler(new DataHandler(ds));             
    attachmentBodyPart.setFileName("filename.pdf");
    
    htmlBodyPart.setContent("<html><body>Some HTML content</body></html>", "text/html");
    
    //add HTML part before attachment 
    multipart.addBodyPart(htmlBodyPart);
    multipart.addBodyPart(attachmentBodyPart);
    
    message.setContent(multipart);
    message.saveChanges();
    

    干杯!

    编辑:更新了示例代码并添加了更多细节以复制问题。

    【讨论】:

      【解决方案2】:

      尝试只创建纯文本消息而不使用多部分。摆脱 message.setContent(multipart) 并使用 message.setText(body)。

      【讨论】:

      • 这不起作用...现在电子邮件根本不显示正文。
      • 如果所有这些都适用于 Gmail,但无法使用您的公司电子邮件,那么您的公司电子邮件可能有问题。 JavaMail FAQ 提供了调试技巧。从那里开始并在此处发布结果,也许我们可以帮助您找出问题所在。
      • 再次尝试并得到了一些有趣的结果...我已经编辑了我的问题。
      • 您的代码没有明显的问题。也许这是您正在使用的 javamail-android 库的问题。没有办法在android中使用真正的JavaMail jar文件吗?您可以尝试让您的邮件发送逻辑在一个简单的桌面应用程序中正常工作,然后再将其移至 android。这也将使调试配置或邮件服务器的任何问题变得更加容易。
      • 我已经解决了这个问题!看起来必须在添加附件之前设置正文。在我交换了身体和附件的顺序后,它起作用了!虽然您没有直接提供解决方案,但感谢您的建议和建议。
      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 2021-07-18
      • 2018-05-06
      • 2021-02-04
      • 2014-07-04
      • 2017-10-17
      相关资源
      最近更新 更多