web-dev-qa-db-fra.com

Envoi d'e-mails sans utiliser de serveur de messagerie

JavaMail envoie des e-mails à l'aide d'un serveur de messagerie, généralement via l'interface SMTP d'un fournisseur de messagerie. Est-il nécessaire d'utiliser un serveur de messagerie pour envoyer des e-mails?

J'ai un site Web qui enverra des courriels et, si possible, j'aimerais envoyer les courriels directement à partir du code du site Web sans utiliser de serveur de courriel. Le JavaMail FAQ dit qu'un serveur de messagerie est requis.

Existe-t-il un moyen d'envoyer des e-mails sans utiliser de serveur de messagerie, avec JavaMail ou une autre API?

11
Dean Schulze

Vous pouvez envoyer un e-mail directement à l'un des serveurs SMTP mentionnés dans l'enregistrement MX du domaine de l'adresse. Habituellement, c'est une mauvaise idée, cependant:

La livraison du courrier à un serveur local est rapide - vous pouvez presque immédiatement continuer et faire autre chose et laisser le serveur gérer la livraison.

La livraison réelle peut prendre un certain temps, par exemple le serveur de messagerie distant peut être lent. Ou il peut d'abord rejeter le courrier - c'est une stratégie connue contre le spam pour dire à un expéditeur d'essayer d'envoyer un courrier une deuxième fois, ce que certains robots anti-spam ne feront pas.

De plus, le serveur de messagerie peut facilement réessayer un jour plus tard ou alors lorsque le serveur distant est en panne, cela réduit le risque de perte de courrier.

11
johannes

Tout dépend de ce que vous entendez par "utiliser" exactement.

Si "utilisation" comprend uniquement l'utilisation directe d'un serveur de messagerie, vous pouvez transmettre le courrier à envoyer via un autre type de service indirectement à un serveur de messagerie. Pour les cas d'utilisation pratiques, cela semble être une solution "Good Enough ™" pour moi.

Si, cependant, votre question signifie littéralement "sans impliquer aucun serveur de messagerie", cela ne serait possible que si votre logiciel est capable de mettre le courrier dans la boîte de réception du client cible d'une manière ou d'une autre de votre choix, mais à l'exception de POP3 ou IMAP ou de tout autre protocole pertinent pour le courrier électronique utilisé dans le contexte du courrier électronique (car, si vous utilisiez un tel protocole, ce programme particulier agirait comme serveur de messagerie, ce qui n'est pas autorisé)

Pour répondre à la question: Oui. Du moins en théorie.

1
JensG

Si nous devons envoyer un courrier à quelqu'un à partir de Java, nous devons avoir accès à certaines informations d'identification de serveur de messagerie. Enfin, pas toujours.

Google a fourni un accès gratuit à l'un de ses serveurs de messagerie et vous pouvez l'utiliser en Java. Ci-dessous le code écrit si plus comme une note à moi-même. Donc, si j'en ai besoin parfois, vous peut se référer ici: 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.");
    }
}
0
user3350913