2

複数の部分を含むメールを送信するための次のコードがあります

 public void sendEmail(String emailAddress, List<String> attachment) throws Exception{
    Properties props = new Properties();

    props.put("mail.transport.protocol", "smtps");
    props.put("mail.smtps.host", SMTP_HOST_NAME);
    props.put("mail.smtps.auth", "true");

    Session mailSession = Session.getDefaultInstance(props);
    mailSession.setDebug(true);
    Transport transport = mailSession.getTransport();

    MimeMessage message = new MimeMessage(mailSession);
    // message subject
    message.setSubject("Automated email from Kieran Herley about Assignments");

    message.addRecipient(Message.RecipientType.TO,
         new InternetAddress(emailAddress));

    Multipart multipart = new MimeMultipart();
    MimeBodyPart messageBodyPart = new MimeBodyPart();

    // message body
    messageBodyPart.setText("This is just a message to say your assignment has been graded.\nAttached is a file with some pointers about your assignment");
    multipart.addBodyPart(messageBodyPart);

    messageBodyPart = new MimeBodyPart();

    for (String singleFile : attachment) {
        DataSource source = new FileDataSource(singleFile);
        messageBodyPart.setDataHandler(new DataHandler(source));
        String nameOfFile = singleFile.substring(singleFile.lastIndexOf('\\') + 1);
        messageBodyPart.setFileName(nameOfFile);
        multipart.addBodyPart(messageBodyPart);
    }
    message.setContent(multipart);


    transport.connect(SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD);

    transport.sendMessage(message,
        message.getRecipients(Message.RecipientType.TO));
    transport.close();
}

すべてが正常に機能していますが、私が抱えている問題はforループにあります

for (String singleFile : attachment) {
        DataSource source = new FileDataSource(singleFile);
        messageBodyPart.setDataHandler(new DataHandler(source));
        String nameOfFile = singleFile.substring(singleFile.lastIndexOf('\\') + 1);
        messageBodyPart.setFileName(nameOfFile);
        multipart.addBodyPart(messageBodyPart);
    }
    message.setContent(multipart);

私が抱えている問題は、アプリケーションがforループを3回ループすると、電子メールに添付されているすべてのファイルに、3回目にループを通過したファイルの名前が付けられることです。これは、電子メールの添付ファイル自体と同じです。3つの添付ファイルを送信している場合でも、すべて同じ名前が付けられます。

これは、3つの添付ファイルすべてが同じ変数を使用して名前を付けて取得するため、3つすべてについて名前を付け、ループを通過した最後の添付ファイルとして設定しているためです。

すべてに同じ名前変数と添付ファイル変数を使用して各電子メールの名前と添付ファイルを設定する方法はありますか、またはこれを行うにはどうすればよいですか?

この場合、

String singleFile --- for the attachment
String nameOfFile --- for the name of each file
4

2 に答える 2

3

何が必要かわかりませんが、次の行を使用するのはおそらく理にかなっています。

messageBodyPart = new MimeBodyPart();

以前ではなく、forループ内。現時点では、同じボディパーツをに追加し続けていますmultipart

于 2012-09-07T14:42:00.257 に答える
3

これは、for-eachループの文字列には何の問題もないように見えます。messageBodyPartdatahandlerとfilenameを割り当てるときに常に同じインスタンスを使用しているのではないかと心配しています。messageBodyPart = new MimeBodyPart()ループ内を移動してみてください。

于 2012-09-07T14:42:25.277 に答える