У меня есть простое веб-приложение, в которое могут входить разные пользователи. Одной из важных функций является то, что пользователь может получить доступ к документу и отправить электронное письмо с его содержимым постороннему лицу, например третьему лицу. Ниже показано, как выглядит электронное письмо, чтобы дать представление:
Это довольно понятно, и я могу отправить нескольким пользователям, если захочу, как [email protected],[email protected],...
в показанном поле поля. При всем этом я использую Java Mail API, чтобы заставить его работать, и после нажатия кнопки отправки он отправляет непосредственно получателю. Никаких проблем.
Теперь я хочу изменить это, выполнив эту функцию электронной почты в качестве службы. Это означает, что когда я отправляю электронное письмо, заполненный контент и информация будут храниться в таблице в MYSQL, и служба (работающая в фоновом режиме) выберет встать из-за стола и сделать посылку.
Это моя функция:
public void sendEmail(String recipient, String subject, String content,
String host, String port, final String senderaddress,
final String password) {
try {
System.out.println("Please Wait, sending email...");
/*Setup mail server */
Properties props = new Properties();
props.put("mail.smtp.host", host); //SMTP Host
props.put("mail.smtp.port", port); //TLS Port
props.put("mail.smtp.auth", "true"); //enable authentication
props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
//create Authenticator object to pass in Session.getInstance argument
Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(senderaddress, password);
}
};
Session session = Session.getInstance(props, auth);
session.setDebug(true);
// Define message
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(senderaddress));
message.addRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipient));
// Set Subject: header field
message.setSubject(subject);
// Now set the actual message
message.setText(content);
try {
Transport.send(message);
} catch (AddressException addressException) {
addressException.printStackTrace();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
Можно ли это сделать так, как я хочу, потому что я не уверен, как заставить это работать?
(О, я понял. Этот вопрос не о коде, который вы разместили. Он касается кода, который вы еще не написали. Вопрос: почему вы включили этот код... если он не имеет отношения к вашему вопросу? )
Ответ: да, это можно сделать так, как вы хотите. 1) Периодически запрашивайте базу данных для извлечения писем для отправки. 2) Отправьте каждую строку по очереди. 3) Отправить письмо. 4) Удалить строку или пометить строку как отправленную. Обратите внимание, что это не гарантирует, что электронные письма действительно будут доставлены, и не касается адресов электронной почты, которые могут быть неправильно отформатированы.
@Cray Да, это правильно, можешь рассказать больше? Потому что я планирую создать еще один модуль (main, java), чтобы обрабатывать это как услугу.
@StephenC Да, речь идет о коде, который я не писал. Я подумал, что включение кода даст представление о том, как я отправляю электронное письмо напрямую.
@StephenC Понятно. Я еще создал таблицу и думаю, сколько столбцов подойдет для этого случая?
Ну, у вас есть 2 вещи: 1. сохранить электронные письма в БД, 2. запланированный отправитель электронной почты. Проведите некоторое исследование того, как сделать любой из них, и если вы получите ошибки, попросите о помощи.
Один столбец для каждого поля, относящегося к электронному письму (например, тема, получатель, содержание и т. д.), а также столбцы для записи уникального идентификатора, временных меток и статуса. Вы должны быть в состоянии работать с нашими требованиями.
Понимаю. С точки зрения дизайна, если служба получает электронное письмо и отправляет его, эта запись должна быть удалена из этой таблицы, без каких-либо причин для статуса, временной метки и т. д. Будет ли столбец содержимого проблемой, если сообщение длинное?
Это зависит от базы данных и типа, который вы используете для столбца. Для MySQL столбец varchar
может содержать до 4096 символов. Кроме того, вам нужно будет использовать clob
, что усложняется. Но вам действительно нужно начать искать эти вещи для себя в документации MySQL, документации JDBC (или учебнике) и так далее.
1) После нажатия кнопки «Отправка почты» из пользовательского интерфейса вам необходимо вызвать метод для сохранения данных, например получатель, тема, содержание, в БД.
2) Напишите службу отправителя электронной почты, которая извлекает почту не доставлено / в ожидании из таблицы БД и отправляет ее через Java Mail API.
3) Запланированная служба отправителя электронной почты с помощью ScheduledExecutorService
Какие столбцы должны быть в моей таблице?
@Daredevil, вы можете сделать столбец, например, получатель, тема, контент, mailStaus
Нужен ли mailstatus? Я думал, что после планирования службы она удалит запись из таблицы после отправки.
@Daredevil столбец mailStatus может иметь значение Доставленный (если служба отправителя почты уже отправляет вызов) или В ожидании (если запись новая, а служба отправителя почты еще не вызывала эту запись)
То есть не нужно удалять записи при закачке данных в таблицу?
@Daredevil, если вы удаляете запись после отправки, тогда столбец mailStatus не нужен, но для вас это очень надежно, если вы храните записи в течение определенного времени в БД даже после отправки почты (вы можете написать другую службу для удаления старой записи из БД и Секулировал это еженедельно )
Какой подход лучше?
Давайте продолжить обсуждение в чате.
Я так понимаю ваше основное приложение его сохраняет и не вызывает службу отправки почты? Вы можете использовать запланированное задание, чтобы забрать недавно сохраненные электронные письма и отправить их.