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

时间:2012-06-11 22:54:01

标签: android javamail

我正在使用JavaMail port for android在没有用户干预的情况下发送电子邮件。我注意到某些电子邮件系统无法正确显示电子邮件正文。当我将电子邮件发送到Gmail时,正文显示正确,但当我将其发送到公司电子邮件时(我不确定它使用的是什么,但它是来自Telecom的商业邮件),正文是空白的,而是有附件带有body的内容的文本文件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;
}   

如果有人知道如何解决这个问题请帮助我!对于我的应用来说,将身体显示为身体非常重要。此外,如果有更好的方式在没有用户干预的情况下发送电子邮件,请另外建议。

感谢您的帮助。

编辑:

我尝试使用.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);     
}

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

这有什么问题?

编辑:

如果其他人遇到同样的问题,我就是这样解决的。通过在添加附件之前设置正文来解决此问题。因此,我不是在发送时设置正文,而是事先单独设置正文。

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()。 现在,电子邮件的正文显示为它应该。

2 个答案:

答案 0 :(得分: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();

干杯!

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

答案 1 :(得分:0)

尝试在不使用多部分的情况下创建纯文本消息。摆脱message.setContent(multipart)并使用message.setText(body)。