Enviar correos electrónicos sin usar un servidor de correo electrónico

11

JavaMail envía correos electrónicos utilizando un servidor de correo electrónico, generalmente a través de la interfaz SMTP de un proveedor de correo electrónico. ¿Es necesario usar un servidor de correo electrónico para enviar correos electrónicos?

Tengo un sitio web que enviará correos electrónicos y, si es posible, me gustaría enviarlos directamente desde el código del sitio web sin utilizar un servidor de correo electrónico. Las preguntas frecuentes de JavaMail dicen que se requiere un servidor de correo electrónico.

¿Hay alguna manera de enviar correos electrónicos sin usar un servidor de correo electrónico, ya sea con JavaMail u otra API?

Dean Schulze
fuente
No, no es posible. ¿Cómo se supone que los clientes de correo electrónico deben recibir el correo electrónico que les está enviando?
Oded
Una alternativa, que no necesariamente funcionará con JavaMail, es configurar un MTA como Postfix. No necesitará un servidor de correo remoto, porque tiene uno local.
user16764
Precisamente. Supongo que se podría decir que el antiguo Microsoft Mail MTA estaba "sin servidor" en el sentido de que todos los clientes de Microsoft Mail se ocupaban individualmente de recibir y enviar mensajes al / del almacén de correo central en el sistema de archivos (en un servidor de archivos , por el camino). Pero incluso entonces, la única forma de enviar el correo de ese sistema al de otra persona era a través de una puerta de enlace, que siempre involucra servidores. ¿Estás seguro de que has hecho la pregunta que pretendías?
Craig

Respuestas:

11

Puede enviar un correo electrónico directamente a uno de los servidores SMTP mencionados en el registro MX del dominio de la dirección. Sin embargo, generalmente es una mala idea:

Entregar el correo a un servidor local es rápido: puede continuar casi de inmediato y hacer otra cosa y dejar que el servidor se encargue de la entrega.

La entrega real puede llevar algún tiempo, por ejemplo, el servidor de correo remoto puede ser lento. O podría rechazar el correo primero: es una estrategia conocida contra el correo no deseado decirle al remitente que intente enviar un correo por segunda vez, lo que algunos bots de correo no deseado no harán.

Además, el servidor de correo puede volver a intentarlo fácilmente un día más tarde, cuando el servidor remoto esté inactivo, esto reduce el riesgo de pérdida de correo.

johannes
fuente
Gracias por la información sobre prevención de spam. Puedo ver cómo cambiar estas estrategias hace que el uso de un servidor de correo electrónico sea una buena idea.
Dean Schulze
2
técnicamente, hacer eso convierte su aplicación en un servidor de correo, por lo que todavía está usando un servidor de correo, aunque sea bastante básico.
Jwenting
@jwenting ¿cómo sería un servidor de correo si solo actuara como un cliente que se conecta a otros servidores? Prefiero ser un "servidor", tenía que tener al menos un "cliente" conectado a usted ...
Jason Goemaat
Además, es probable que el envío a servidores de correo remotos directamente desde su aplicación vaya en contra de las comprobaciones antispam SPF / DMARC.
Craig
1

Todo depende de lo que quiere decir con "uso" exactamente.

Si "usar" incluye solo el uso directo de un servidor de correo electrónico, entonces puede pasar el correo para enviarlo indirectamente a un servidor de correo electrónico a través de otro tipo de servicio . Para casos de uso práctico, esta parece ser una solución "Good Enough ™" para mí.

Sin embargo, si su pregunta significa literalmente " sin involucrar a ningún servidor de correo electrónico ", esto solo sería posible si su software es capaz de poner el correo en la bandeja de entrada del cliente de destino de alguna manera que elija, excepto POP3 o IMAP o cualquier otro protocolo relevante para el correo electrónico utilizado en el contexto del correo electrónico (porque, si usara dicho protocolo, ese programa en particular actuaría como el servidor de correo, lo cual no está permitido)

Para responder la pregunta: sí. Al menos en teoría.

JensG
fuente
Estoy preguntando si tengo que usar un servidor de correo electrónico para enviar el correo electrónico al servidor de correo electrónico de los destinatarios (2 servidores de correo electrónico). Estoy interesado en enviar directamente al servidor de correo electrónico de los destinatarios desde mi código (1 servidor de correo electrónico). No estoy tratando de omitir el servidor de correo electrónico de los destinatarios, solo el servidor de correo electrónico de envío.
Dean Schulze
Para enviar correos electrónicos, debe ser un cliente de correo o un servidor de correo. En la mayoría de los casos, para enviar correo como cliente, debe ser confiable, ya sea mediante una lista blanca o mediante autorización. Para enviar como servidor, las reglas de autorización son a menudo más estrictas. Realmente depende de las reglas que utilizan los servidores de correo electrónico de los destinatarios para autorizar remitentes válidos.
BobDalgleish
@BobDalgleish: si puedo administrar el acceso a su máquina, puedo hacer cualquier cosa. Incluyendo poner correos en su bandeja de entrada. Estoy de acuerdo en que esta es una opción meramente académica, pero la pregunta no fue tan clara.
JensG
@DeanSchulze: Creo que johannes ya respondió esa pregunta en particular y por qué no es una buena idea. Si yo fuera usted, favorecería la idea del servicio.
JensG
0

Si tenemos que enviar un correo a alguien desde el código Java, necesitamos tener acceso a algunas credenciales del servidor de correo. Pues no siempre.

Google ha proporcionado acceso gratuito a uno de sus servidores de correo y puede usarlo en código Java. Debajo del código escrito si es más como una nota para mí. Entonces, si lo necesito en algún momento, puede consultar aquí: 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.");
    }
}
usuario3350913
fuente