Отправка электронной почты без использования почтового сервера

11

JavaMail отправляет электронные письма, используя почтовый сервер, как правило, через интерфейс SMTP поставщика электронной почты. Нужно ли использовать почтовый сервер для отправки электронной почты?

У меня есть веб-сайт, который будет отправлять электронные письма, и, если возможно, я хотел бы отправлять электронные письма непосредственно с кода веб-сайта без использования сервера электронной почты. В FAQ по JavaMail говорится, что требуется почтовый сервер.

Есть ли способ отправлять электронную почту без использования почтового сервера, с помощью JavaMail или другого API?

Декан шульце
источник
Нет, это невозможно. Как почтовые клиенты должны получать почту, которую вы им отправляете?
Одед
Альтернативой, которая не обязательно будет работать с JavaMail, является настройка MTA, такого как Postfix. Тогда вам не понадобится удаленный почтовый сервер, потому что у вас есть локальный.
user16764
Точно. Я полагаю, вы могли бы сказать, что старый Microsoft Mail MTA был «безсерверным» в том смысле, что все клиенты Microsoft Mail индивидуально имели дело с получением и отправкой сообщений в / из центрального почтового хранилища в файловой системе (на файловом сервере с помощью путь). Но даже тогда единственный способ отправить почту с этой системы на кого-то другого - через шлюз, который всегда включает серверы. Вы уверены, что задали вопрос, который вы хотели?
Крейг,

Ответы:

11

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

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

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

Также почтовый сервер может легко повторить попытку через день или около того, когда удаленный сервер не работает, это снижает риск потери почты.

Johannes
источник
Спасибо за информацию о предотвращении спама. Я вижу, как изменение этих стратегий делает использование почтового сервера хорошей идеей.
Дин Шульце
2
технически выполнение этого превращает ваше приложение в почтовый сервер, поэтому вы все еще используете почтовый сервер, хотя и довольно простой.
jwenting
@jwenting, как бы это был почтовый сервер, если бы он действовал только как клиент, который подключается к другим серверам? Я скорее считал себя «сервером», к которому нужно было подключить хотя бы одного «клиента» ...
Джейсон Гумаат
Кроме того, отправка на удаленные почтовые серверы непосредственно из вашего приложения может привести к потере антиспамовых проверок SPF / DMARC.
Крейг,
1

Все зависит от того, что именно вы подразумеваете под «использованием».

Если «использование» включает в себя только прямое использование почтового сервера, то вы можете передать почту для косвенной отправки через какой-либо вид службы на почтовый сервер. Для практического использования это решение мне кажется «Good Enough ™».

Однако, если ваш вопрос означает буквально « без участия какого-либо сервера электронной почты вообще », это было бы возможно только в том случае, если ваше программное обеспечение способно помещать почту в папку «Входящие» целевого клиента каким-либо способом по вашему выбору, кроме POP3. или IMAP или любой другой протокол, относящийся к электронной почте, используемый в контексте электронной почты (поскольку, если вы будете использовать такой протокол, эта конкретная программа будет действовать как почтовый сервер, что недопустимо)

Чтобы ответить на вопрос: да. По крайней мере, в теории.

JensG
источник
Я спрашиваю, должен ли я использовать почтовый сервер для отправки электронной почты на почтовый сервер получателя (2 почтовых сервера). Я заинтересован в отправке прямо на почтовый сервер получателя с моего кода (1 почтовый сервер). Я не пытаюсь обойти почтовый сервер получателей, просто отправляющий почтовый сервер.
Дин Шульце
Чтобы отправлять электронную почту, вы должны быть либо почтовым клиентом, либо почтовым сервером. В большинстве случаев, чтобы отправлять почту как клиент, вам нужно доверять, либо посредством белого списка, либо путем авторизации. Для отправки в качестве сервера правила авторизации часто более строгие. Это действительно зависит от правил, которые почтовые серверы получателей используют для авторизации действительных отправителей.
BobDalgleish
@BobDalgleish: если я могу управлять доступом к вашему компьютеру, я могу сделать все, что угодно. В том числе положить письма в ваш почтовый ящик. Я согласен, что это чисто академический вариант, но вопрос не был так четко определен.
JensG
@DeanSchulze: Я думаю, что Йоханнес уже ответил на этот конкретный вопрос и почему это не очень хорошая идея. На вашем месте я бы предпочел сервисную идею.
JensG
0

Если нам нужно отправить письмо кому-то из Java-кода, нам нужно иметь доступ к некоторым учетным данным почтового сервера. Ну не всегда.

Google предоставил бесплатный доступ к одному из своих почтовых серверов, и вы можете использовать его в коде Java. Ниже написан код, если больше похож на заметку к себе. Так что, если мне это когда-нибудь понадобится, вы можете обратиться сюда: http://www.computerbuzz.in/2014/02/how-to-send-email-in-java-using-gmail.html

private void setMailServerProperties()
    {
        Properties emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", "586");
        emailProperties.put("mail.smtp.auth", "true");
        emailProperties.put("mail.smtp.starttls.enable", "true");
        mailSession = Session.getDefaultInstance(emailProperties, null);
    }

    private MimeMessage draftEmailMessage() throws AddressException, MessagingException
    {
        String[] toEmails = { "computerbuzz@gmail.com" };
        String emailSubject = "Test email subject";
        String emailBody = "This is an email sent by http://www.computerbuzz.in.";
        MimeMessage emailMessage = new MimeMessage(mailSession);
        /**
         * Set the mail recipients
         * */
        for (int i = 0; i < toEmails.length; i++)
        {
            emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i]));
        }
        emailMessage.setSubject(emailSubject);
        /**
         * If sending HTML mail
         * */
        emailMessage.setContent(emailBody, "text/html");
        /**
         * If sending only text mail
         * */
        //emailMessage.setText(emailBody);// for a text email
        return emailMessage;
    }

    private void sendEmail() throws AddressException, MessagingException
    {
        /**
         * Sender's credentials
         * */
        String fromUser = "user-email@gmail.com";
        String fromUserEmailPassword = "*******";

        String emailHost = "smtp.gmail.com";
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromUser, fromUserEmailPassword);
        /**
         * Draft the message
         * */
        MimeMessage emailMessage = draftEmailMessage();
        /**
         * Send the mail
         * */
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        System.out.println("Email sent successfully.");
    }
}
user3350913
источник