Qual è il problema con questo codice? In qualche modo sta entrando in un ciclo infinito sulla riga Transport.send(message);
linea, nessun messaggio di errore, nessuna eccezione, solo forse ciclo infinito (non so perché non aspetto più di 5-10 minuti)
final String username = ""; final String password = ""; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "465"); 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("@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("@gmail.com")); message.setSubject("Test Subject"); message.setText("Test"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); }
Qui sto dando alcuni cambiamenti, che funzionano bene per me:
Session session = Session.getInstance(props,null);
Istanziate l’object messaggio come avete fatto. E infine:
Transport transport = session.getTransport("smtp"); String mfrom = "[email protected]"// example laabidiraissi transport.connect("smtp.gmail.com", mfrom, "thepassword"); transport.sendMessage(message, message.getAllRecipients());
Modifica, potresti darmi un favore e copiare / incollare e provare questo esempio e mostrare ciò che mostra:
package com.test; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.junit.Test; public class EmailService { @Test public void test(){ Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", true); // added this line props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.user", "username"); props.put("mail.smtp.password", "password"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", true); Session session = Session.getInstance(props,null); MimeMessage message = new MimeMessage(session); System.out.println("Port: "+session.getProperty("mail.smtp.port")); // Create the email addresses involved try { InternetAddress from = new InternetAddress("username"); message.setSubject("Yes we can"); message.setFrom(from); message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail")); // Create a multi-part to combine the parts Multipart multipart = new MimeMultipart("alternative"); // Create your text message part BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("some text to send"); // Add the text part to the multipart multipart.addBodyPart(messageBodyPart); // Create the html part messageBodyPart = new MimeBodyPart(); String htmlMessage = "Our html text"; messageBodyPart.setContent(htmlMessage, "text/html"); // Add html part to multi part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message message.setContent(multipart); // Send message Transport transport = session.getTransport("smtp"); transport.connect("smtp.gmail.com", "username", "password"); System.out.println("Transport: "+transport.toString()); transport.sendMessage(message, message.getAllRecipients()); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Ok. È un po ‘più complesso di quanto pensassi per la prima volta … Per riassumere ciò che ho ottenuto:
session.setDebug(true);
. Se si imposta true, ogni processo importante verrà sottoposto a debug sulla console. Raccomando di usarlo. Transport transport = session.getTransport("smtps");
con: Transport transport = session.getTransport("smtps");
piuttosto dello smtp non sicuro … L’object di trasporto dell’API JavaMail si occuperà anche delle porte (rispettivamente smtp: 587, smtps: 465) È ansible utilizzare anche il metodo statico della class Transport per inviare il messaggio e (salvandolo prima, il metodo sendMessage non statico non salverà il messaggio), ma questa volta è necessario utilizzare javax.mail.Authenticator durante la creazione della sessione, come questo:
Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("login", "password"); }
});
1.4.2 JavaMailApi ha un’altra eccezione della versione 1.4.7 per questo problema …
Se non lo si utilizza, non è ansible eseguire l’autenticazione con il metodo statico. Se si utilizza il metodo di istanza, è ansible.
Quindi piuttosto incasinato, ma c’erano alcuni concetti di base che dovrebbero essere focalizzati …
Potrei riprodurre il comportamento descritto nella tua domanda e risolverlo.
Il metodo di send
rimane bloccato
SMTPTransport(Service).connect(String, int, String, String) line: 308
La connessione non riesce perché hai la porta sbagliata per l’host smtp di gmail: 465
cambiarlo in 587
props.put("mail.smtp.port", "587");
e funzionerà.
Utilizzando Simple Java Mail dovrebbe essere semplice:
Email email = new Email(); email.setFromAddress("lollypop", "[email protected]"); email.addRecipient("C.Cane", "[email protected]", RecipientType.TO); email.setText("We should meet up!"); email.setTextHTML("We should meet up!"); 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);
Se hai triggersto l’accesso a due fattori, devi generare una password specifica per l’applicazione dal tuo account Google.