Создание почтового сообщения на 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>
Вместо того чтобы каждый клиент самостоятельно создавал класс сообщения, попросите его получить объект сообщения из вашего служебного класса. Затем служебный класс может создать объект сообщения с желаемой информацией о сеансе.