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

11

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. La FAQ JavaMail indique 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?

Dean Schulze
la source
Non ce n'est pas possible. Comment les clients de messagerie sont-ils censés recevoir l'e-mail que vous leur envoyez?
Oded
Une alternative, qui ne fonctionnera pas nécessairement avec JavaMail, est de configurer un MTA tel que Postfix. Vous n'aurez donc pas besoin d'un serveur de messagerie distant, car vous en avez un local.
user16764
Précisément. Je suppose que vous pourriez dire que l'ancien Microsoft Mail MTA était "sans serveur" dans le sens où les clients Microsoft Mail s'occupaient tous individuellement de recevoir et de placer des messages vers / depuis la banque de messagerie centrale sur le système de fichiers (sur un serveur de fichiers , par le façon). Mais même dans ce cas, le seul moyen de transférer du courrier de ce système sur quelqu'un d'autre était via une passerelle, ce qui implique toujours des serveurs. Êtes-vous sûr d'avoir posé la question que vous vouliez?
Craig

Réponses:

11

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.

johannes
la source
Merci pour les informations concernant la prévention du spam. Je peux voir comment le fait de changer ces stratégies fait de l'utilisation d'un serveur de messagerie une bonne idée.
Dean Schulze
2
techniquement, cela transforme votre application en serveur de messagerie, vous utilisez donc toujours un serveur de messagerie, quoique assez dépouillé.
jwenting
@jwenting comment serait-il un serveur de messagerie s'il agissait uniquement comme un client qui se connecte à d'autres serveurs? Je pensais plutôt être un "serveur" il fallait qu'au moins un "client" se connecte à vous ...
Jason Goemaat
En outre, l'envoi vers des serveurs de messagerie distants directement à partir de votre application risque de se heurter aux contrôles anti-spam SPF / DMARC.
Craig
1

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 indirectement à un autre serveur de messagerie via un autre type de service . Pour les cas d'utilisation pratiques, cela semble être une solution «Good Enough ™» pour moi.

Si, cependant, votre question signifie littéralement " sans impliquer de serveur de messagerie du tout ", 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 tout autre protocole de messagerie utilisé dans le contexte de la messagerie (car, si vous utilisiez un tel protocole, ce programme particulier agirait comme le serveur de messagerie, ce qui n'est pas autorisé)

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

JensG
la source
Je demande si je dois utiliser un serveur de messagerie pour envoyer le courrier électronique au serveur de messagerie des destinataires (2 serveurs de messagerie). Je souhaite envoyer directement au serveur de messagerie des destinataires à partir de mon code (1 serveur de messagerie). Je n'essaye pas de contourner le serveur de messagerie des destinataires, juste le serveur de messagerie d'envoi.
Dean Schulze
Pour envoyer des e-mails, vous devez être un client de messagerie ou un serveur de messagerie. Dans la plupart des cas, pour envoyer du courrier en tant que client, vous devez faire confiance, soit par inscription sur liste blanche, soit par autorisation. Pour envoyer en tant que serveur, les règles d'autorisation sont souvent plus strictes. Cela dépend vraiment des règles que les serveurs de messagerie des destinataires utilisent pour autoriser les expéditeurs valides.
BobDalgleish
@BobDalgleish: Si je peux gérer l'accès à votre machine, je peux tout faire. Y compris mettre des mails dans votre boîte de réception. Je conviens qu'il s'agit d'une option purement académique, mais la question n'était pas aussi clairement définie.
JensG
@DeanSchulze: Je pense que johannes a déjà répondu à cette question particulière et pourquoi ce n'est pas une si bonne idée. Si j'étais vous, je favoriserais l'idée de service.
JensG
0

Si nous devons envoyer un courrier à quelqu'un à partir du code 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 code Java. Ci-dessous le code écrit si plus comme une note à moi-même. Donc, si j'en ai besoin un jour, vous pouvez vous 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.");
    }
}
user3350913
la source