Wysyłanie wiadomości e-mail bez korzystania z serwera e-mail

11

JavaMail wysyła wiadomości e-mail za pomocą serwera poczty e-mail, zwykle za pośrednictwem interfejsu SMTP dostawcy poczty e-mail. Czy do wysyłania wiadomości e-mail konieczne jest użycie serwera e-mail?

Mam stronę internetową, która wyśle ​​e-maile i jeśli to możliwe, chciałbym wysłać e-maile bezpośrednio z kodu strony internetowej bez korzystania z serwera e-mail. FAQ JavaMail mówi, że wymagany jest serwer e-mail.

Czy istnieje sposób wysyłania wiadomości e-mail bez korzystania z serwera poczty e-mail za pomocą JavaMail lub innego interfejsu API?

Dean Schulze
źródło
Nie, nie jest to możliwe. W jaki sposób klienci poczty e-mail powinni otrzymywać wysyłane wiadomości e-mail?
Oded
Alternatywą, która niekoniecznie będzie działać z JavaMail, jest skonfigurowanie MTA, takiego jak Postfix. Nie będziesz potrzebował zdalnego serwera poczty, ponieważ masz lokalny.
user16764
Dokładnie. Przypuszczam, że można powiedzieć, że stary MTA Microsoft Mail był „pozbawiony serwera” w tym sensie, że wszyscy klienci Microsoft Mail indywidualnie zajmowali się otrzymywaniem i wysyłaniem wiadomości do / z centralnego magazynu poczty w systemie plików (na serwerze plików przez droga). Ale nawet wtedy jedynym sposobem na przeniesienie poczty z tego systemu do innej osoby była brama, która zawsze obejmuje serwery. Czy na pewno zadałeś sobie pytanie?
Craig

Odpowiedzi:

11

Możesz dostarczyć wiadomość e-mail bezpośrednio na jeden z serwerów SMTP wymienionych w rekordzie MX domeny adresu. Zwykle jest to zły pomysł:

Dostarczanie poczty na lokalny serwer jest szybkie - możesz niemal natychmiast kontynuować i zrobić coś innego, a serwer może obsłużyć dostawę.

Rzeczywista dostawa może zająć trochę czasu, na przykład zdalny serwer pocztowy może być powolny. Lub może najpierw odrzucić pocztę - jest to znana strategia przeciwko spamowi, aby powiedzieć nadawcy, aby spróbował wysłać wiadomość po raz drugi, czego nie zrobią niektóre boty spamowe.

Również serwer pocztowy może łatwo spróbować ponownie dzień później, gdy zdalny serwer jest wyłączony, zmniejsza to ryzyko utraty poczty.

Johnnes
źródło
Dziękujemy za informacje dotyczące zapobiegania spamowi. Widzę, jak zmiana tych strategii sprawia, że ​​korzystanie z serwera poczty elektronicznej jest dobrym pomysłem.
Dean Schulze
2
technicznie rzecz biorąc, dzięki temu twoja aplikacja staje się serwerem pocztowym, więc nadal używasz serwera pocztowego, aczkolwiek dość gołego.
jwenting
@jwenting, jak by to był serwer pocztowy, gdyby działał tylko jako klient łączący się z innymi serwerami? Raczej myślałem, że jestem „serwerem”,
musiałeś
Ponadto wysyłanie na zdalne serwery pocztowe bezpośrednio z aplikacji prawdopodobnie spowoduje naruszenie kontroli antyspamowej SPF / DMARC.
Craig
1

Wszystko zależy od tego, co dokładnie rozumiesz przez „używanie”.

Jeśli „użycie” obejmuje tylko bezpośrednie użycie serwera e-mail, możesz przekazać pocztę, aby wysłać inną usługę pośrednio na serwer e-mail. W praktycznych przypadkach wydaje mi się, że jest to „Good Enough ™”.

Jeśli jednak twoje pytanie oznacza dosłownie „w ogóle nie angażując żadnego serwera pocztowego ”, byłoby to możliwe tylko wtedy, gdy twoje oprogramowanie jest w stanie umieścić pocztę w skrzynce odbiorczej klienta docelowego w dowolny sposób, ale z wyjątkiem POP3 lub IMAP lub inny odpowiedni protokół e-mail używany w kontekście wiadomości e-mail (ponieważ gdybyś używał takiego protokołu, ten konkretny program działałby jak serwer pocztowy, co jest niedozwolone)

Aby odpowiedzieć na pytanie: Tak. Przynajmniej w teorii.

JensG
źródło
Pytam, czy muszę użyć serwera e-mail, aby wysłać wiadomość e-mail do serwera e-mail odbiorców (2 serwery e-mail). Chcę wysłać bezpośrednio do serwera e-mail odbiorców z mojego kodu (1 serwer e-mail). Nie próbuję ominąć serwera poczty elektronicznej adresatów, tylko serwer poczty wysyłającej.
Dean Schulze
Aby wysłać wiadomość e-mail, musisz być klientem poczty lub serwerem poczty. W większości przypadków, aby wysłać pocztę jako klient, musisz mieć zaufanie, albo przez białe listy, albo przez autoryzację. Aby wysłać jako serwer, reguły autoryzacji są często bardziej rygorystyczne. To naprawdę zależy od reguł, których używają serwery e-mail odbiorców do autoryzacji prawidłowych nadawców.
BobDalgleish
@BobDalgleish: Jeśli mogę zarządzać dostępem do twojego komputera, mogę zrobić wszystko. W tym umieszczanie wiadomości e-mail w skrzynce odbiorczej. Zgadzam się, że jest to opcja wyłącznie akademicka, ale pytanie nie było tak jasno określone.
JensG
@DeanSchulze: Myślę, że johannes już odpowiedział na to pytanie i dlaczego nie jest to taki dobry pomysł. Gdybym był tobą, wolałbym pomysł na usługę.
JensG
0

Jeśli musimy wysłać komuś wiadomość e-mail z kodu Java, musimy mieć dostęp do niektórych poświadczeń serwera pocztowego. Cóż, nie zawsze.

Google zapewnił bezpłatny dostęp do jednego z serwerów poczty i można go używać w kodzie Java. Poniżej napisanego kodu, jeśli bardziej przypomina notatkę dla mnie. Więc jeśli kiedyś będę go potrzebować, możesz odwołać się tutaj: 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 = { "[email protected]" };
        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 = "[email protected]";
        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.");
    }
}
użytkownik3350913
źródło