Senden von E-Mails ohne Verwendung eines E-Mail-Servers

11

JavaMail sendet E-Mails über einen E-Mail-Server, normalerweise über die SMTP-Schnittstelle eines E-Mail-Anbieters. Ist es notwendig, einen E-Mail-Server zum Senden von E-Mails zu verwenden?

Ich habe eine Website, auf der E-Mails gesendet werden, und wenn möglich, möchte ich die E-Mails direkt aus dem Website-Code senden, ohne einen E-Mail-Server zu verwenden. In den JavaMail-FAQ heißt es, dass ein E-Mail-Server erforderlich ist.

Gibt es eine Möglichkeit, E-Mails ohne Verwendung eines E-Mail-Servers zu senden, entweder mit JavaMail oder einer anderen API?

Dean Schulze
quelle
Nein, das ist nicht möglich. Wie sollen E-Mail-Clients die E-Mail erhalten, die Sie ihnen senden?
Oded
Eine Alternative, die mit JavaMail nicht unbedingt funktioniert, besteht darin, einen MTA wie Postfix einzurichten. Sie benötigen dann keinen Remote-Mailserver, da Sie einen lokalen haben.
user16764
Genau. Ich nehme an, man könnte sagen , dass die alte Microsoft Mail MTA in dem Sinne „serverless“ war , dass die Microsoft Mail - Clients alle einzeln behandelt bekommen und Nachrichten an / von dem zentralen Mail - Speicher auf dem Dateisystem (auf einer Datei setzen Server , durch die Weg). Aber selbst dann war die einzige Möglichkeit, E-Mails von diesem System auf das eines anderen zu übertragen, ein Gateway, an dem immer Server beteiligt sind. Sind Sie sicher, dass Sie die von Ihnen beabsichtigte Frage gestellt haben?
Craig

Antworten:

11

Sie können eine E-Mail direkt an einen der im MX-Datensatz der Adressdomäne genannten SMTP-Server senden. Normalerweise ist das jedoch eine schlechte Idee:

Die Zustellung der E-Mails an einen lokalen Server ist schnell - Sie können fast sofort fortfahren und etwas anderes tun und den Server die Zustellung überlassen.

Die eigentliche Zustellung kann einige Zeit dauern, z. B. kann der Remote-Mailserver langsam sein. Oder es wird die E-Mail zuerst abgelehnt - es ist eine bekannte Strategie gegen Spam, einen Absender anzuweisen, eine E-Mail ein zweites Mal zu senden, was einige Spam-Bots nicht tun.

Außerdem kann der Mailserver einen Tag später problemlos erneut versuchen, wenn der Remote-Server nicht verfügbar ist. Dies verringert das Risiko von Mailverlust.

johannes
quelle
Vielen Dank für die Informationen zur Spam-Prävention. Ich kann sehen, wie eine Änderung dieser Strategien die Verwendung eines E-Mail-Servers zu einer guten Idee macht.
Dean Schulze
2
Technisch gesehen verwandelt dies Ihre Anwendung in einen Mailserver, sodass Sie immer noch einen Mailserver verwenden, wenn auch einen eher nackten.
Jwenting
@jwenting Wie wäre es ein Mailserver, wenn er nur als Client fungieren würde, der eine Verbindung zu anderen Servern herstellt? Ich dachte eher, ein "Server" zu sein, bei dem mindestens ein "Client" eine Verbindung zu Ihnen herstellen musste ...
Jason Goemaat
Außerdem kann das Senden an Remote-Mailserver direkt von Ihrer App aus gegen SPF / DMARC-Anti-Spam-Prüfungen verstoßen.
Craig
1

Es hängt alles davon ab, was Sie unter "verwenden" genau verstehen.

Wenn "Verwendung" nur die direkte Verwendung eines E-Mail-Servers umfasst, können Sie die E-Mail weiterleiten, um sie über einen anderen Dienst indirekt an einen E-Mail-Server zu senden . Für praktische Anwendungsfälle scheint dies für mich eine "Good Enough ™" -Lösung zu sein.

Wenn Ihre Frage jedoch wörtlich " ohne E-Mail-Server " bedeutet, ist dies nur möglich, wenn Ihre Software die E-Mails auf eine Weise Ihrer Wahl in den Posteingang des Zielclients stellen kann, außer POP3 oder IMAP oder ein anderes E-Mail-relevantes Protokoll, das im E-Mail-Kontext verwendet wird (denn wenn Sie ein solches Protokoll verwenden würden, würde dieses bestimmte Programm als Mailserver fungieren, was nicht zulässig ist).

Um die Frage zu beantworten: Ja. Zumindest theoretisch.

JensG
quelle
Ich frage, ob ich einen E-Mail-Server verwenden muss, um die E-Mail an den E-Mail-Server des Empfängers zu senden (2 E-Mail-Server). Ich möchte von meinem Code (1 E-Mail-Server) direkt an den E-Mail-Server des Empfängers senden. Ich versuche nicht, den E-Mail-Server des Empfängers zu umgehen, sondern nur den sendenden E-Mail-Server.
Dean Schulze
Um E-Mails zu senden, müssen Sie entweder ein Mail-Client oder ein Mail-Server sein. In den meisten Fällen müssen Sie zum Senden von E-Mails als Client vertrauenswürdig sein, entweder durch Whitelisting oder durch Autorisierung. Beim Senden als Server sind die Autorisierungsregeln häufig strenger. Dies hängt wirklich von den Regeln ab, nach denen die E-Mail-Server der Empfänger gültige Absender autorisieren.
BobDalgleish
@ BobDalgleish: Wenn ich den Zugriff auf Ihren Computer verwalten kann, kann ich alles tun. Einschließlich des Einfügens von E-Mails in Ihren Posteingang. Ich stimme zu, dass dies eine rein akademische Option ist, aber die Frage war nicht so klar.
JensG
@ DeanSchulze: Ich denke, Johannes hat diese spezielle Frage bereits beantwortet und warum es keine so gute Idee ist. Wenn ich Sie wäre, würde ich die Service-Idee bevorzugen.
JensG
0

Wenn wir eine E-Mail aus Java-Code an jemanden senden müssen, müssen wir Zugriff auf einige Mail-Server-Anmeldeinformationen haben. Nun, nicht immer.

Google hat freien Zugriff auf einen seiner Mailserver bereitgestellt, und Sie können ihn in Java-Code verwenden. Unten geschriebener Code, wenn eher eine Notiz an mich. Wenn ich es irgendwann brauche, können Sie hier nachschlagen : 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.");
    }
}
user3350913
quelle