Создание почтового сообщения на Java без почтового сеанса

Я хотел бы создать в моем приложении служебный метод, который принимает сообщение электронной почты в качестве аргумента и знает, как его отправить. Этот служебный метод будет отвечать за знание того, какой SMTP-сервер использовать, какие учетные данные он должен использовать для подключения к нему.

Проблема, с которой я сталкиваюсь javax.mail это то, что javax.mail.Message класс и javax.mail.MimeMessageкласс ожидать javax.mail.Session Объект в качестве аргумента для конструктора. Так что я не могу иметь подпись метода, как

private static void sendMail(javax.mail.Message);

потому что мои клиентские классы не смогут составить Сообщение без всех деталей, которые я пытаюсь абстрагировать. Они должны знать, как создать сеанс, подключившись к почтовому серверу.

Есть ли способ создать сообщение без сеанса или, альтернативно, класс, который инкапсулирует сообщение электронной почты, не требующее сеанса?

4 ответа

Решение

Используя Apache Commons Email, любой метод из следующего может быть добавлен в метод sendMail в зависимости от того, где вы хотите что-то установить.

    HtmlEmail email = new HtmlEmail();
    //email.setDebug(debugMode);
    email.setBounceAddress("bouce@domain.biz");
    email.setHostName("mySMTPHost");


    email.setFrom("myAddress@mydomain.com");
    email.addTo(emailAddress);
    email.addBcc("bccAddres");

    email.setSubject("Your Subject");
    email.setAuthentication("recipient@snailmail.org", "password");
    email.setSSL(true);
    email.setSmtpPort(465);
    email.setHtmlMsg(html);

public static void sendMail(org.apache.commons.mail.HtmlEmail email)
{       
    email.send();
}

MimeMessage класс примет нулевую сессию. Если вы создаете такое сообщение, Transport.send возможно, не сможет отправить MimeMessage Чтобы обойти это, вы просто должны управлять своим собственным сеансом и транспортными объектами, а затем использовать нестатический Transport.sendMessage метод.

public void forward(Session session, Message m) throws MessagingException {
    Address[] all = m.getAllRecipients();
    if (all == null) { //Don't pass null to sendMessage.
        all = new InternetAddress[0];
    }

    Transport t;
    try {
        if (all.length != 0) {
            t = session.getTransport(all[0]);
        } else {
            t = session.getTransport("smtp");
        }
    } catch (NoSuchProviderException tryDefault) {
        try {
            t = session.getTransport();
        } catch (NoSuchProviderException fail) {
            if (fail.setNextException(tryDefault)) {
                throw fail;
            } else {
                tryDefault.setNextException(fail);
                throw tryDefault;
            }
        }
    }


    m.saveChanges();

    t.connect("host", 25, "user", "pass");
    try {
        t.sendMessage(m, all);
    } finally {
        try {
            t.close();
        } catch (MessagingException warning) {
        }
    }
}

Если вы используете Spring Framework / Spring Boot, вы можете внедрить Spring JavaMailSenderImpl в ваш класс и сделать это (очевидно, вам понадобятся свойства SMTP-сервера, также введенные в отправителя почты):

MimeMessage mimeMessage = javaMailSender.createMimeMessage();

Вам нужно добавить следующую зависимость в ваше приложение, чтобы это работало:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

Вместо того чтобы каждый клиент самостоятельно создавал класс сообщения, попросите его получить объект сообщения из вашего служебного класса. Затем служебный класс может создать объект сообщения с желаемой информацией о сеансе.

Другие вопросы по тегам