我正在使用 JavaMail port for android无需用户干预应用程序即可发送电子邮件。而且我注意到某些电子邮件系统无法正确显示电子邮件正文。当我将电子邮件发送到 Gmail 时,正文显示正确,但当我将其发送到公司电子邮件时(我不确定它使用的是什么,但它是来自电信的商务邮件)正文是空白的,而是有一个附件包含正文内容的文本文件 ATT00001.txt。
我不是邮件系统方面的专家,但从我用来设置电子邮件正文的代码来看,它似乎与附加文件的方式非常相似,也许这就是为什么正文不被识别为正文,但作为附件。
下面的代码 fragment 是如何创建邮件的。 body 和 subjects 都是预先初始化的。
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--
在测试这些时,我创建了一个电子邮件测试 Activity ,它基本上通过单击按钮发送一封电子邮件。在尝试了一些东西之后,我将我的类(class)改回原来的样子(使用 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()。 现在电子邮件的正文已按应有的方式显示。
最佳答案
这似乎是 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();
干杯!
编辑:更新示例代码并添加更多详细信息以复制问题。
关于android - 使用 javamail-android 发送电子邮件时,正文作为文本文件附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988537/