1

ファイルのアップロードに apache commons fileupload を使用しています。このファイルをメールに添付したい。一時ファイルに書き込みたくありませんが、データをメモリに保持して添付ファイルとして送信したいです。ここからの指示が必要です。前もって感謝します

DiskFileItemFactory factory = new DiskFileItemFactory();
                PortletFileUpload upload = new PortletFileUpload(factory);
                List items = upload.parseRequest(request);

                Iterator iter = items.iterator();

                while(iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
                    if(item.isFormField()) {

                        String name = item.getFieldName();
                        String value = item.getString();
                        response.setRenderParameter(name, value);

                    } else {

                        String fieldName = item.getFieldName();
                        String fileName = item.getName();
                        //String contentType = item.getContentType();
                        boolean isInMemory = item.isInMemory();
                        long sizeInBytes = item.getSize();

                        InputStream uploadedStream = item.getInputStream();

                    }
                }

更新 添付ファイル付きの電子メールを送信するための次のメソッド署名があり、正常に機能しています。

sendWithFileAttachment (String[] recipients,
            String subject,
            File message,
            String from,
            String filename) {

            BodyPart messageBodyPart = new MimeBodyPart();

    // Fill the message
    messageBodyPart.setText("Pardon Ideas");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Part two is attachment
    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(message);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);

    // Put parts in message

    msg.setContent(multipart);

    Transport.send(msg);

}

更新 2: コードを実装した後、以下のエラーが発生します。これで私を助けてくれませんか

HIT ME! 15782
Jul 31, 2012 11:17:56 AM test.test.EmailUtility1$InputStreamMimeBodyPart getContentStream
SEVERE: null
Throwable occurred: java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:156)
    at java.io.BufferedInputStream.reset(BufferedInputStream.java:425)
    at test.test.EmailUtility1$InputStreamMimeBodyPart.getContentStream(EmailUtility1.java:174)
    at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:94)
    at javax.activation.DataHandler.writeTo(DataHandler.java:302)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:845)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:361)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:85)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:881)
    at javax.activation.DataHandler.writeTo(DataHandler.java:314)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1683)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:585)
    at javax.mail.Transport.send0(Transport.java:169)
    at javax.mail.Transport.send(Transport.java:98)
    at test.test.EmailUtility1.sendWithFileAttachment(EmailUtility1.java:155)
    at test.test.TestEmail.main(TestEmail.java:32)
Exception in thread "main" javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.IOException: Stream closed
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:625)
    at javax.mail.Transport.send0(Transport.java:169)
    at javax.mail.Transport.send(Transport.java:98)
    at test.test.EmailUtility1.sendWithFileAttachment(EmailUtility1.java:155)
    at test.test.TestEmail.main(TestEmail.java:32)
Caused by: java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:156)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:319)
    at java.io.FilterInputStream.read(FilterInputStream.java:101)
4

1 に答える 1

1

ストリームを介してコンテンツを取得できるようにするには、MimeBodyPart (おそらくこれを使用していると思います) をオーバーライドする必要があります。

public void sendWithFileAttachment(String recipient,
                String subject,
                InputStream message,
                String from,
                String filename) throws MessagingException {
    MimeMessage msg = new MimeMessage(getSession());

    // set the from and to address
    InternetAddress addressFrom = new InternetAddress(from);
    msg.setFrom(addressFrom);

    InternetAddress addressTo = new InternetAddress(recipient);
    msg.setRecipient(Message.RecipientType.TO, addressTo);

    BodyPart messageBodyPart = new MimeBodyPart();

    // Fill the message
    messageBodyPart.setText("Pardon Ideas");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Part two is attachment
    messageBodyPart = new InputStreamMimeBodyPart(message);
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);

    // Put parts in message

    msg.setContent(multipart);

    Transport.send(msg);
    // important: you need to close the message stream manually
    try {
        message.close();
    } catch (IOException ex) {
        // meh. So what.
    }

}

private class InputStreamMimeBodyPart extends MimeBodyPart {

private InputStream inputStream;

    public InputStreamMimeBodyPart(InputStream source) {
        this.inputStream = source;
        if(!inputStream.markSupported()) {
            throw new IllegalArgumentException("only streams with mark supported are ok");
        }
        inputStream.mark(Integer.MAX_VALUE); // remeber the whole stream.
    }

    @Override
    protected InputStream getContentStream() throws MessagingException {
        throw new IllegalStateException("getContentStream is not implemented on purpose.");
    }

    @Override
    public void writeTo(OutputStream os) throws IOException, MessagingException {
        System.out.println("writing to somewhere.");
        byte[] buf = new byte[32];
        int length;
        inputStream.reset();
        while((length = inputStream.read(buf)) > -1 ) {
            os.write(buf, 0, length);
        }
    }
}

private Session getSession() {
    // here you do authentication etc.
    Properties properties = new Properties();
    return Session.getInstance(properties);
}
于 2012-07-26T16:10:18.460 に答える