Кто-то знает библиотеку доставки почты (SMTP) для Java? - PullRequest
10 голосов
/ 07 ноября 2008

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

Так что JavaMail API не работает для меня, потому что мне нужно указать SMTP-сервер для подключения.

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

Я ищу что-то вроде Аспирин . К сожалению, я не могу использовать сам Aspirin, потому что разработка остановилась в 2004 году, и библиотека не может правильно взаимодействовать с современными защищенными от спама серверами.

Встраиваемая версия Джеймс сделает эту задачу. Но я не нашел документации относительно того, возможно ли это.

Или кто-нибудь знает о других библиотеках, которые я мог бы использовать?

Ответы [ 3 ]

16 голосов
/ 07 ноября 2008

Одно из возможных решений: получить запись MX самостоятельно и использовать JavaMail API .

Вы можете получить запись 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);
}
2 голосов
/ 07 ноября 2008

Это совершенно неправильный способ справиться с этим.

Любой, кто подключен к Интернету, будет иметь в своем распоряжении «законный» SMTP-сервер для отправки электронной почты - ваш провайдер, офис и т. Д.

Вы ХОТИТЕ использовать рычаги, потому что они делают для вас несколько вещей.

1) они принимают ваше сообщение и несут ответственность за его обработку. После того, как вы его бросите, это больше не ваша проблема.

2) Любые технологии удаления нежелательной почты обрабатываются сервером. Еще лучше, когда / если эти технологии меняются (ключи домена кто-нибудь?), Сервер обрабатывает это, а не ваш код.

3) Вы, как клиент этой почтовой системы, уже имеете все необходимые учетные данные для связи с этим сервером. Основные SMTP-серверы заблокированы с помощью аутентификации, диапазона IP-адресов и т. Д.

4) Вы не изобретаете велосипед. Используйте имеющуюся у вас инфраструктуру. Вы пишете приложение или почтовый сервер? Настройка почтового сервера - это повседневная задача, которую обычно легко выполнить. Всем этим случайным «тупым» пользователям в Интернете удалось настроить электронную почту.

2 голосов
/ 07 ноября 2008

Не.

Отправка электронной почты намного сложнее, чем кажется. Почтовые серверы превосходят (или должны превосходить) надежную доставку.

Создайте отдельный почтовый сервер, если вам нужно - это будет по сути то же самое, что и реализация Java на Java (я сомневаюсь, что вы найдете библиотеки для этой задачи - они были бы по существу законченными почтовыми серверами), но гораздо проще.

...