Invia email usando java


Answers

Il seguente codice ha funzionato per me.

import java.io.UnsupportedEncodingException;
import java.util.Properties;

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


public class SendMail {

    public static void main(String[] args) {

        final String username = "your_user_name@gmail.com";
        final String password = "yourpassword";

        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("your_user_name@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to_email_address@domain.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}
Question

Sto cercando di inviare una mail usando Java:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail {

   public static void main(String [] args) {

      // Recipient's email ID needs to be mentioned.
      String to = "abcd@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "web@gmail.com";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Sto ottenendo l'errore:

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:java.net.ConnectException: Connection refused: connect
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)

Questo codice funzionerà per inviare e-mail?




Il seguente codice funziona molto bene. Provalo come un'applicazione java con javamail-1.4.5.jar

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class MailSender
{
final String senderEmailID = "typesendermailid@gmail.com";
final String senderPassword = "typesenderpassword";
final String emailSMTPserver = "smtp.gmail.com";
final String emailServerPort = "465";
String receiverEmailID = null;
static String emailSubject = "Test Mail";
static String emailBody = ":)";
public MailSender(String receiverEmailID, String emailSubject, String emailBody)
{
this.receiverEmailID=receiverEmailID;
this.emailSubject=emailSubject;
this.emailBody=emailBody;
Properties props = new Properties();
props.put("mail.smtp.user",senderEmailID);
props.put("mail.smtp.host", emailSMTPserver);
props.put("mail.smtp.port", emailServerPort);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", emailServerPort);
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
SecurityManager security = System.getSecurityManager();
try
{
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setText(emailBody);
msg.setSubject(emailSubject);
msg.setFrom(new InternetAddress(senderEmailID));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(receiverEmailID));
Transport.send(msg);
System.out.println("Message send Successfully:)");
}
catch (Exception mex)
{
mex.printStackTrace();
}
}
public class SMTPAuthenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(senderEmailID, senderPassword);
}
}
public static void main(String[] args)
{     
MailSender mailSender=new
MailSender("typereceivermailid@gmail.com",emailSubject,emailBody);
}
}



Ho avuto la stessa eccezione di te. Motivo per questo non è avere ed eseguire il server smpt nella tua macchina (dal momento che il tuo host è localhost). Se usi Windows 7 non ha un server SMTP. quindi dovrai scaricare, installare e configurare con dominio e creare account. Ho usato hmailserver come server smtp installato e configurato nel mio computer locale. https://www.hmailserver.com/download




Ho messo la mia classe gava gmail funzionante su pastebin per la tua revisione, presta particolare attenzione al metodo "startSessionWithTLS" e potresti essere in grado di regolare JavaMail per fornire la stessa funzionalità. http://pastebin.com/VE8Mqkqp




La risposta breve - No.

La risposta lunga - no, poiché il codice si basa sulla presenza di un server SMTP in esecuzione sul computer locale e sull'ascolto sulla porta 25. Il server SMTP (tecnicamente MTA o Mail Transfer Agent) è responsabile della comunicazione con l'agente utente di posta (MUA, che in questo caso è il processo Java) per ricevere e-mail in uscita.

Ora, gli MTA di solito sono responsabili della ricezione di posta da parte degli utenti per un particolare dominio. Pertanto, per il dominio gmail.com, i server di posta di Google sono responsabili dell'autenticazione degli agenti di posta elettronica e quindi del trasferimento di posta elettronica nelle caselle di posta in arrivo sui server GMail. Non sono sicuro che GMail si fidi dei server di inoltro della posta, ma non è certamente un compito facile eseguire l'autenticazione per conto di Google e quindi inoltrare la posta ai server GMail.

Se leggi le domande JavaMail sull'uso di JavaMail per accedere a GMail , noterai che il nome host e la porta puntano ai server GMail e certamente non a localhost. Se si intende utilizzare la macchina locale, è necessario eseguire l'inoltro o l'inoltro.

Probabilmente dovrai capire a fondo il protocollo SMTP se intendi arrivare ovunque quando si tratta di SMTP. È possibile iniziare con l' articolo di Wikipedia su SMTP , ma qualsiasi ulteriore progresso richiederà effettivamente la programmazione su un server SMTP.




Effettivamente 465 funziona e l'eccezione che si sta ottenendo potrebbe essere dovuta alla porta SMTP aperta 25. Per impostazione predefinita il numero di porta è 25. Tuttavia è possibile configurarlo utilizzando l'agente di posta disponibile come open source - Mercury

Per semplicità, basta usare la seguente configurazione e starai bene.

// Setup your mail server
props.put("mail.smtp.host", SMTP_HOST); 
props.put("mail.smtp.user",FROM_NAME);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.port", "25");
props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");  
props.setProperty("mail.smtp.socketFactory.fallback", "false");  
props.setProperty("mail.smtp.port", "465");  
props.setProperty("mail.smtp.socketFactory.port", "465");

Per ancora di più: controlla l'esempio di lavoro completo da zero qui




Hai bisogno di un server SMTP per l'invio di e-mail. Ci sono server che puoi installare localmente sul tuo pc oppure puoi usare uno dei tanti server online. Uno dei server più conosciuti è Google:

Ho appena testato con successo le configurazioni di Google SMTP consentite utilizzando il primo esempio di Simple Java Mail :

    final Email email = new Email();
    email.setFromAddress("lollypop", "lol.pop@somemail.com");
    email.addRecipient("C.Cane", "candycane@candyshop.org", RecipientType.TO);
    email.setText("We should meet up!");
    email.setTextHTML("<b>We should meet up!</b>");
    email.setSubject("hey");

    new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
    new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
    new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);

Osserva i vari porti e le strategie di trasporto (che gestiscono tutte le proprietà necessarie per te).

Curiosamente, Google richiede TLS anche sulla porta 25, anche se le istruzioni di Google dicono diversamente .