2016-12-07 8 views
0

Javaが正しく動作していることを明確にしてください。問題はプログラマにあります!JavaMail MimeBodyPartがMimeMultipartに「正しく」追加されていない

電子メールに添付ファイルを3つ追加する必要があります(1つのzip、1 png、1 jpeg)。最初は、各アイテムを自分のものに追加できるコードを書いています。次に、3つのアイテムをすべて同時に追加するには、同じコードを(非常に小さな変更を加えて)とり、それをforループに入れてください。これは私が問題を抱えているところです。ループは3つの添付ファイルを電子メールに追加しますが、問題はすべての添付ファイルが同じ同一の添付ファイルであることです。具体的には、forループの最初の2回の反復でアタッチされる最初の2つのアタッチメントは接続されず、3番目のアタッチメント(3回目の反復でバットまでのアタッチメント)が3回アタッチされます。

私はJavaのドキュメントを読みました。私はあらゆる種類の変更を試みましたが、どこが間違っているのか分かりにくいです。現実には、私は前進する十分なプログラミング能力を持っていないということです。私は立ち往生している。どんなアドバイスも大歓迎です!私はクラスのほとんどを添付しましたが、本当の問題はforループの中にあります。なぜ3つの固有のオブジェクトがすべて添付されていないのですか?

ありがとうございます。

try 
    { 
     Message message = new MimeMessage(session); 

     message.setFrom(new InternetAddress(userLogin)); 

     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(primaryRecipient)); 


     MimeBodyPart bodyPart = new MimeBodyPart(); //container to hold the email contents (body only - the text) 

     bodyPart.setText(emailBody); 

     MimeMultipart multipart = new MimeMultipart(); 


     multipart.addBodyPart(bodyPart); 


     MimeBodyPart mimePart = new MimeBodyPart(); 

     String filename; //hold the current path 
     FileDataSource resource;//object to grab the physical resource 

     for(int i = 0; i < itemsToAttach.length; i++) 
     { 

      filename = itemsToAttach[i]; 
      System.out.println("Test: " + itemsToAttach[i]);//#############################test only 

      resource = new FileDataSource(filename); 

      mimePart.setDataHandler(new DataHandler(resource)); 

      mimePart.setFileName(filename);//###########fix the long ugly name 


      multipart.addBodyPart(mimePart); 
      System.out.println("multipart contents: " + multipart.toString()); 
     } 


     message.setContent(multipart); 

     message.setSubject(emailSubject); 

     Transport.send(message); 

     System.out.println("Sent message successfully...."); 
    } 
    catch (MessagingException e) 
    { 
     throw new RuntimeException(e); 
    } 

出力は次のようになります。

The file is present! 
Sending cc to: [email protected] 
Sending bcc to: [email protected] 
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\test attachments.zip 
multipart contents: [email protected] 
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\axiom.jpeg 
multipart contents: [email protected] 
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\another attachment.png 
multipart contents: [email protected] 
Sent message successfully.... 
+0

'MimePart内=新しいMimeBodyPart();はforループの一部でなければなりません。ループが繰り返されるたびに同じオブジェクトを「再構成」しながら、同じオブジェクトを3回追加します。 –

+0

@ArnoMittelbachあなたは完全に正しいです!理解していただきありがとうございます。とても有難い! – Mike

答えて

0

は、あなたが同じオブジェクトを再利用しているし、それはループの反復ごとに上書きなっているように見えます。

は、すべての新しいファイルのためのMimeBodyPartの別のオブジェクトを作成します:あなたは次の操作を行うことができます

:あなたがメッセージを送信するときタントの唯一のエントリが解消されない理由が最後MimePart内で

 MimeBodyPart[] mimePart = new MimeBodyPart[itemsToAttach.length]; 

    String filename; //hold the current path 
    FileDataSource resource;//object to grab the physical resource 

    for(int i = 0; i < itemsToAttach.length; i++) 
     { 
     mimePart[i] = new MimeBodyPart(); 
     filename = itemsToAttach[i]; 
     System.out.println("Test: " + itemsToAttach[i]);//#############################test only 

     resource = new FileDataSource(filename); 

     mimePart[i].setDataHandler(new DataHandler(resource)); 

     mimePart[i].setFileName(filename);//###########fix the long ugly name 


     multipart.addBodyPart(mimePart[i]); 
     System.out.println("multipart contents: " + multipart.toString()); 
    } 
関連する問題