1

Android 用の JavaMail ポートを使用して、ユーザーがアプリケーションに介入することなく電子メールを送信しています。また、一部の電子メール システムでは電子メールの本文が正しく表示されないことに気付きました。メールをGmailに送信すると本文は正しく表示されますが、会社のメールに送信すると(何を使用しているのか正確にはわかりませんが、Telecomからのビジネスメールです)、本文は空白で代わりに添付ファイルがありますbody の内容を含むテキスト ファイル ATT00001.txt の

私はメールシステムの専門家ではありませんが、メールの本文を設定するために使用するコードからは、ファイルを添付する方法と非常に似ているように見えます。おそらくそれが本文が本文として認識されない理由ですが、添付ファイルとして。

次のコード スニペットは、メールの作成方法です。body と subject はすべて事前に初期化されています。

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;
}   

誰かがこの問題を回避する方法を知っているなら、私を助けてください! 私のアプリケーションでは、体を体として示すことが重要です。また、ユーザーの介入なしでメールを送信するためのより良い方法があれば、それも提案してください。

ご協力いただきありがとうございます。

編集:

BodyPart の代わりに .setText() を使用してみました

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 に答える