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

使用javamail android发送电子邮件时,正文作为文本文件附加,android,jakarta-mail,Android,Jakarta Mail,我正在使用发送电子邮件,而无需用户干预应用程序。我注意到一些电子邮件系统不能正确显示电子邮件正文。当我将邮件发送到Gmail时,邮件正文显示正确,但当我将邮件发送到公司电子邮件时(我不确定它使用的是什么,但它是来自电信的商业邮件),邮件正文是空白的,而是带有正文内容的文本文件ATT00001.txt的附件 我不是邮件系统方面的专家,但从我用来设置电子邮件正文的代码来看,它似乎与附加文件的方式非常相似,也许这就是为什么正文没有被识别为正文,而是作为附件 下面的代码片段是如何创建邮件的。身体和受试者

我正在使用发送电子邮件,而无需用户干预应用程序。我注意到一些电子邮件系统不能正确显示电子邮件正文。当我将邮件发送到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;
}   
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;
}   
如果有人知道如何解决这个问题,请帮助我!对于我的应用程序来说,将主体显示为主体是很重要的。此外,如果有更好的方式发送电子邮件而无需用户干预,请也建议他们

谢谢你的帮助

编辑:

我尝试使用.setText()代替BodyPart

message.setText(body);
这根本没有显示Gmail邮件中的尸体,而是显示了公司邮件中的一些奇怪的字符串

------=第2部分\u 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 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;
}   
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()。
现在,电子邮件的正文显示为它应该显示的内容

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

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

注意:此外,只有收件人的邮箱以不同的方式处理HTML时,才能复制此问题(与MS Outlook不同,后者可以完美地处理HTML)

BodyPart attachmentBodyPart=新的MimeBodyPart();
BodyPart htmlBodyPart=新的MimeBodyPart();
Multipart Multipart=新的MimeMultipart();
MimeMessage message=新MimeMessage(会话);
message.setSubject(“某个主题”);
message.setFrom(新的InternetAddress(“一些来自-email@abc.org"));
message.addRecipient(message.RecipientType.TO,新的InternetAddress(“某些收件人”)-email@abc.com"));
DataSource ds=new FileDataSource(“./somedirectory”+File.separator+“filename.pdf”);
setDataHandler(新的DataHandler(ds));
attachmentBodyPart.setFileName(“filename.pdf”);
setContent(“一些HTML内容”、“文本/HTML”);
//在附件之前添加HTML部分
多部分addBodyPart(htmlBodyPart);
multipart.addBodyPart(附件BodyPart);
message.setContent(多部分);
message.saveChanges();
干杯


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

这不起作用。。。现在邮件根本没有显示邮件的正文。如果所有这些都能在Gmail上运行,但在你的公司电子邮件上失败了,那么你的公司电子邮件可能有问题。JavaMail常见问题解答提供了调试技巧。从那里开始,在这里发布结果,也许我们可以帮助您找出哪里出了问题。再试一次,得到了一些有趣的结果。。。我已经编辑了我的问题。你的代码没有明显的错误。也许这是您正在使用的javamail android库的一个问题。有没有办法在android上使用真正的JavaMail jar文件?在将其移动到android之前,您可以尝试从一个简单的桌面应用程序中让邮件发送逻辑正常工作。这也将使调试配置或邮件服务器的任何问题变得更容易。我已经解决了这个问题!看起来在添加附件之前必须设置主体。在我交换了身体和附件的顺序之后,它工作了!虽然您没有直接提供解决方案,但感谢您的建议和建议。