Как включить вложение с помощью загрузки файлов Apache - PullRequest
1 голос
/ 24 апреля 2010

Я использую API загрузки файлов Apache commons для сохранения файла из JSP в сервлеты во временном каталоге, но я не знаю, что мне делать дальше, чтобы отправить письмо в виде вложения с использованием API javamail.

Как я могу получить те файлы, которые записаны во временную директорию, используя Apache Fileupload API, чтобы отправить их как вложение на почтовый сервер. Как мне поможет запись этих файлов в память или на диск?

1 Ответ

1 голос
/ 24 апреля 2010

Вот пример:

private static void notify(String subject, String text,
        File attachment, String from, String to) throws Exception {
    Context context = new InitialContext();
    Session sess = (Session)context.lookup("java:comp/env/mail/session");
    MimeMessage message = new MimeMessage(sess);
    message.setSubject(subject, "UTF-8");
    if (attachment == null) {
        message.setText(text, "UTF-8");
    } else {
        MimeMultipart mp = null;
        MimeBodyPart part1 = new MimeBodyPart();
        part1.setText(text, "UTF-8");
        MimeBodyPart part2 = new MimeBodyPart();
        part2.setDataHandler(new DataHandler(new FileDataSource(attachement)));
        part2.setFileName(file.getName());
        mp = new MimeMultipart();
        mp.addBodyPart(part1);
        mp.addBodyPart(part2);
        message.setContent(mp);
   }

    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    Transport.send(message);
}

В этом примере используется FileDataSource, что означает, что вложение должно быть сначала сохранено как файл. Я иногда использую самодельный MemoryDataSource вместо этого. Вот код:

package com.lagalerie.mail;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataSource;

public class MemoryDataSource implements DataSource {
    private String name;
    private String contentType;
    private byte content[] = {};

    public MemoryDataSource(String name, String contentType) {
        this.name = name;
        this.contentType = contentType;
    }

    public String getContentType() {
        return contentType;
    }

    public InputStream getInputStream() {
        return new ByteArrayInputStream(content);
    }

    public String getName() {
        return name;
    }

    public OutputStream getOutputStream() {
        return new ByteArrayOutputStream() {
            @Override
            public void close() {
                content = toByteArray();
            }
        };
    }
}
...