android - 使用 javamail-android 发送电子邮件时,正文作为文本文件附加

标签 android jakarta-mail

我正在使用 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/

相关文章:

java - 如何使用 Java 邮件标记跟进

java - 如何解决 javax.mail.AuthenticationFailedException 问题

java - 如何配置邮件服务器以与 JavaMail 一起使用?

android - 如何在android中发送AT命令?

android - 使用 Firebase for Android 更改密码

Android - 支持摩托罗拉上的矢量绘图

java - Android 设备上已安装应用程序的拦截

tomcat - Javamail 适用于 Windows,不适用于 Linux

java - Android 发送自定义电子邮件 STARTTLS 端口 587

java - Android 游戏 - 尝试创建数组失败?