2009-12-22 3 views
3

Je dois envoyer un simple message html avec JavaMail. Et quand j'ai essayé de trouver de beaux exemples avec des explications sur Internet, chaque exemple suivant m'a rendu plus en colère et en colère.Comment configurer l'environnement pour utiliser JavaMail?

Tous ces exemples idiots contiennent du code Java copié et collé qui ne diffère que par des commentaires et un bon avertissement que vous devez d'abord configurer votre serveur smtp et pop3. Je comprends que personne ne veut faire une publicité pour certains produits concrets mais la configuration du serveur est la partie la plus difficile. Alors, quelqu'un peut-il me donner des informations vraiment utiles (sans code java) sur la configuration du serveur concret (Kerio, par exemple, ou tout autre)?

Ce que j'est maintenant la prochaine exception:

250 2.0.0 Reset state 
javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
    com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Relaying to <[email protected]> denied (authentication required) 

UPD. La reformulation simple de tout le texte précédent est: imaginez que vous avez Windows, jdk, et rien d'autre. Et vous voulez faire un programme Java et l'exécuter sur votre machine. Et ce programme devrait envoyer "Bonjour tout le monde!" à votre compte Gmail. Listez vos étapes.

UPD2. Voici le code:

Properties props = new Properties(); 
props.setProperty ("mail.transport.protocol", "smtp"); 
props.setProperty ("mail.host", "smtp.gmail.com"); 
props.setProperty ("mail.user", "[email protected]"); 
props.setProperty ("mail.password", "password_from_email_above"); 

Session mailSession = Session.getDefaultInstance (props, null); 
mailSession.setDebug (true); 
Transport transport = mailSession.getTransport(); 

MimeMessage message = new MimeMessage (mailSession); 
message.setSubject ("HTML mail with images"); 
message.setFrom (new InternetAddress ("[email protected]")); 
message.setContent ("<h1>Hello world</h1>", "text/html"); 
message.addRecipient (Message.RecipientType.TO, 
     new InternetAddress ("[email protected]")); 

transport.connect(); 
transport.sendMessage (message, 
     message.getRecipients (Message.RecipientType.TO)); 

Et exception:

RSET 
250 2.1.5 Flushed 3sm23455365fge.10 
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. 3sm23455365fge.10 
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886) 
    at com.teamdev.imgmail.MailSender.main(MailSender.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    ... 
+0

Votre question est beaucoup trop vague pour y répondre en l'état. Pouvez-vous nous en dire plus sur vos hôtes et les composants qui fonctionnent dessus? Allez-y et nommez les marques, on s'en fout. Dites-nous ce que vous essayez de faire, ce qui fonctionne et ce qui ne l'est pas. –

+0

@Carl Smotricz: J'ai ajouté la section UPD. – Roman

+0

La mise à jour est une * beaucoup * meilleure question. Pour cela, il s'avère que vous n'avez même pas besoin d'un serveur SMTP, car Google est en train d'en exploiter un assez gros. –

Répondre

13

Si vous cherchez un tutoriel pour configurer un serveur SMTP, vous ne devriez pas être à la recherche JavaMail. Il suffit de chercher un tutoriel sur votre serveur de choix (Kerio, par exemple ... ou Exim, SendMail, Apache James, Postfix) ou demander sur Serverfault. Tout serveur compatible SMTP fonctionnera bien avec JavaMail. Vous pouvez également utiliser l'infrastructure du fournisseur de messagerie «standard». Vous pouvez également utiliser cette option. Par exemple, j'utilise un compte Google Apps avec l'infrastructure SMTP de Google pour envoyer du courrier à partir de nos applications Java. Using a Gmail account est un bon point de départ de toute façon si vous ne voulez pas configurer votre propre serveur SMTP afin de simplement tester JavaMail. En dernière option, vous pouvez même rechercher le MX Records pour un domaine et envoyer vos messages directement au serveur SMTP du destinataire. Il y a quelques pièges courants à contourner difficile.

Dernier point, vous devrez vous demander comment éviter que vos e-mails ne soient filtrés comme spam - ce qui est un sujet énorme en soi. Ici, il est utile de s'appuyer sur des fournisseurs standard qui vont traiter certains des problèmes que vous pourriez rencontrer lors de l'hébergement de votre propre serveur. Btw: Concernant le message d'erreur que vous avez posté: le serveur SMTP refuse le relais des messages. C'est si votre serveur SMTP (pense que ça) fonctionne sur example.com et que vous envoyez comme [email protected] à [email protected], vous demandez au serveur SMTP d'agir comme un relais. C'était une pratique courante il y a plusieurs années, jusqu'à ce que - vous l'aurez deviné - abusé par les spammeurs. Depuis lors, les maîtres de poste sont encouragés à refuser le relais. Vous avez deux choix: s'authentifier avant d'envoyer un e-mail ou envoyer à des comptes hébergés sur votre serveur uniquement (c'est-à-dire sur example.com, par exemple [email protected]).

Edit:

Voici un code pour vous aider à démarrer avec authenticationg (fonctionne avec les comptes Gmail mais devrait faire pour votre propre serveur ainsi)

private Session createSmtpSession() { 
    final Properties props = new Properties(); 
    props.setProperty("mail.smtp.host", "smtp.gmail.com"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.port", "" + 587); 
    props.setProperty("mail.smtp.starttls.enable", "true"); 
    // props.setProperty("mail.debug", "true"); 

    return Session.getDefaultInstance(props, new javax.mail.Authenticator() { 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("[email protected]", "mypassword"); 
    } 
    }); 
} 
+0

merci. ça marche –

1

Je peux voir une partie de votre problème. Il est correctement expliqué dans le message d'erreur.

Le serveur SMTP auquel vous envoyez votre courrier (c'est-à-dire l'une des adresses que vous avez configurées dans votre configuration JavaMail) refuse de transférer le courrier vers [email protected]. Ressemble à un problème de configuration dans votre serveur SMTP. Comme l'a indiqué sfussenegger, cela n'a rien à voir avec javamail.

Donc, vous ne déboguez pas sur tous les fronts en même temps, ce serait peut-être une bonne idée d'essayer d'adresser votre serveur SMTP à partir d'un client SMTP connu. Thunderbird irait bien, par exemple. Si vous pouvez envoyer du courrier via Thunderbird, il devrait y avoir un petit problème de JavaMail.


Mise à jour:

L'adresse correcte pour le serveur SMTP de Google est: smtp.gmail.com. Est-ce le serveur que vous avez configuré dans JavaMail? Pouvez-vous nous montrer le message d'erreur correspondant?

0

Cela devrait fonctionner:

import java.text.MessageFormat; 
import java.util.List; 
import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class Emailer { 

    public static void main(String[] args) { 

     String hostname = args[0]; 
     final String userName = args[1]; 
     final String passWord = args[2]; 
     String toEmail = args[3]; 
     String fromEmail = args[4]; 
     String subject = args[5]; 
     String body = ""; 
     // add rest of args as one body text for convenience 
     for (int i = 6; i < args.length; i++) { 
      body += args[i] + " "; 
     } 

     Properties props = System.getProperties(); 
     props.put("mail.smtp.host", hostname); 

     Session session = Session.getInstance(props, new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(userName, passWord); 
      } 
     }); 

     MimeMessage message = new MimeMessage(session); 
     try { 
      message.setFrom(new InternetAddress(fromEmail)); 
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); 
      message.setSubject(subject); 
      message.setText(body); 
      Transport.send(message); 

     } catch (MessagingException e) { 
      System.out.println("Cannot send email " + e); 
     } 
    } 
} 

Vous devez mettre le mail.jar JavaMail sur votre chemin de classe pour les dépendances de javax.mail. Je ne sais pas si Google vous permet d'envoyer des e-mails comme vous le souhaitez. Que diriez-vous d'essayer un autre fournisseur de messagerie, comme vos FAI?

+0

Google me permet d'envoyer du courrier partout où je veux (y compris via l'API) tant que je spécifie ma bonne adresse de retour (ou l'une de celles que j'ai enregistrées avec Google). –

2

Un exemple de travail combinant les réponses ci-dessus, en utilisant activation 1.1.jar et vente par correspondance 1.4.1.jar et l'hôte SMTP est Gmail.

  1. Remplacer [email protected] et user_pw en ligne return new PasswordAuthentication("[email protected]", "user_pw");

  2. , vous voulez aussi remplacer [email protected] par l'adresse électronique à laquelle vous souhaitez recevoir l'e-mail.

    package com.test.sendEmail; 
    import java.util.Properties; 
    import javax.mail.*; 
    import javax.mail.internet.*; 
    
    public class sendEmailTest { 
    
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        sendEmailTest emailer = new sendEmailTest(); 
        //the domains of these email addresses should be valid, 
        //or the example will fail: 
        emailer.sendEmail(); 
    } 
    
    /** 
        * Send a single email. 
        */ 
    public void sendEmail(){ 
    Session mailSession = createSmtpSession(); 
    mailSession.setDebug (true); 
    
    try { 
        Transport transport = mailSession.getTransport(); 
    
        MimeMessage message = new MimeMessage (mailSession); 
    
        message.setSubject ("HTML mail with images"); 
        message.setFrom (new InternetAddress ("[email protected]")); 
        message.setContent ("<h1>Hello world</h1>", "text/html"); 
        message.addRecipient (Message.RecipientType.TO, new InternetAddress ("[email protected]")); 
    
        transport.connect(); 
        transport.sendMessage (message, message.getRecipients (Message.RecipientType.TO)); 
    } 
    catch (MessagingException e) { 
        System.err.println("Cannot Send email"); 
        e.printStackTrace(); 
    } 
    } 
    
    private Session createSmtpSession() { 
    final Properties props = new Properties(); 
    props.setProperty ("mail.host", "smtp.gmail.com"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.port", "" + 587); 
    props.setProperty("mail.smtp.starttls.enable", "true"); 
    props.setProperty ("mail.transport.protocol", "smtp"); 
    // props.setProperty("mail.debug", "true"); 
    
    return Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]", "user_pw"); 
        } 
    }); 
    } 
    
    } 
    
Questions connexes