Кто-нибудь знает библиотеку доставки почты (SMTP) для Java?
Я бы хотел отправить почту, не беспокоясь о SMTP-сервере, который используется для доставки.
Итак API JavaMail не работает для меня, потому что я должен указать SMTP-сервер для подключения.
Я хотел бы, чтобы библиотека самостоятельно выяснила, какой SMTP-сервер отвечает за какой адрес электронной почты, запросив запись MX домена почтового адреса.
Я ищу что-то вроде Aspirin. К сожалению, я не могу использовать сам аспирин, потому что развитие остановилось в 2004 году, и библиотека не смогла нормально общаться с современными серверами, защищенными от спама.
Вложенная версия James выполнила бы эту задачу. Но я не нашел документацию о том, возможно ли это.
Или кто-нибудь знает о других библиотеках, которые я мог бы использовать?
Ответы
Ответ 1
Это совершенно неверный способ справиться с этим.
Любой, кто подключен к Интернету, получит доступный им "законный" SMTP-сервер для отправки электронной почты - вашего интернет-провайдера, вашего офиса и т.д.
Вы ХОТИТЕ использовать, потому что они делают несколько вещей для вас.
1) они берут ваше сообщение и ответственность за обработку этого сообщения. После того, как вы отпустите его, это не ваша проблема.
2) Любые технологии рассылки спама обрабатываются сервером. Еще лучше, когда/если эти технологии меняются (ключи домена кому-нибудь?), Сервер обрабатывает его, а не ваш код.
3) Вы, как клиент этой почтовой системы, уже имеете все учетные данные, необходимые для общения с этим сервером. Основные SMTP-серверы блокируются через аутентификацию, диапазон IP и т.д.
4) Вы не изобретаете колесо. Используйте имеющуюся у вас инфраструктуру. Вы пишете приложение или почтовый сервер? Настройка почтового сервера - это ежедневная задача, которая обычно проста. Все эти случайные "немые" пользователи в Интернете смогли настроить электронную почту.
Ответ 2
Одно из возможных решений: возьмите запись MX самостоятельно и используйте API JavaMail.
Вы можете получить запись MX с помощью проекта dnsjava:
Зависимость Maven2:
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
<version>2.0.1</version>
</dependency>
Метод для извлечения записей MX:
public static String getMXRecordsForEmailAddress(String eMailAddress) {
String returnValue = null;
try {
String hostName = getHostNameFromEmailAddress(eMailAddress);
Record[] records = new Lookup(hostName, Type.MX).run();
if (records == null) { throw new RuntimeException("No MX records found for domain " + hostName + "."); }
if (log.isTraceEnabled()) {
// log found entries for debugging purposes
for (int i = 0; i < records.length; i++) {
MXRecord mx = (MXRecord) records[i];
String targetString = mx.getTarget().toString();
log.trace("MX-Record for '" + hostName + "':" + targetString);
}
}
// return first entry (not the best solution)
if (records.length > 0) {
MXRecord mx = (MXRecord) records[0];
returnValue = mx.getTarget().toString();
}
} catch (TextParseException e) {
throw new RuntimeException(e);
}
if (log.isTraceEnabled()) {
log.trace("Using: " + returnValue);
}
return returnValue;
}
private static String getHostNameFromEmailAddress(String mailAddress) throws TextParseException {
String parts[] = mailAddress.split("@");
if (parts.length != 2) throw new TextParseException("Cannot parse E-Mail-Address: '" + mailAddress + "'");
return parts[1];
}
Отправка почты через код JavaMail:
public static void sendMail(String toAddress, String fromAddress, String subject, String body) throws AddressException, MessagingException {
String smtpServer = getMXRecordsForEmailAddress(toAddress);
// create session
Properties props = new Properties();
props.put("mail.smtp.host", smtpServer);
Session session = Session.getDefaultInstance(props);
// create message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(fromAddress));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddress));
msg.setSubject(subject);
msg.setText(body);
// send message
Transport.send(msg);
}
Ответ 3
Не.
Отправка электронной почты намного сложнее, чем кажется. Серверы электронной почты превосходят надежную доставку (или должны превосходить).
Создайте отдельный почтовый сервер, если вам нужно - это будет по сути то же самое, что и реализация на Java (я сомневаюсь, что вы найдете библиотеки для этой задачи - они будут по существу полными почтовыми серверами), но гораздо проще.