1

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

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

以下代码片段是邮件的创建方式。身体和主题都是预先初始化的。

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() 之前调用。

这有什么问题?

编辑:

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

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()。现在电子邮件的正文已按原样显示。

4

2 回答 2

2

这似乎是 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();

干杯!

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

于 2015-06-17T13:44:03.057 回答
0

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

于 2012-06-11T23:06:39.057 回答