Отправка электронной почты через gmail smtp-сервер в JAVA
В чем проблема с этим кодом? Каким-то образом он попадает в цикл бесконечности на линии Transport.send(message);
, нет сообщения об ошибке, без исключения, просто возможно бесконечный цикл (я не знаю, потому что я не жду больше 5-10 минут)
final String username = "<mail_name>";
final String password = "<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("<mail_from>@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("<mail_to>@gmail.com"));
message.setSubject("Test Subject");
message.setText("Test");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
Ответы
Ответ 1
Здесь я даю некоторые изменения, которые отлично работают для меня:
Session session = Session.getInstance(props,null);
Вы создаете объект сообщения так же, как и вы. И наконец:
Transport transport = session.getTransport("smtp");
String mfrom = "[email protected]"// example laabidiraissi
transport.connect("smtp.gmail.com", mfrom, "thepassword");
transport.sendMessage(message, message.getAllRecipients());
Отредактируйте, пожалуйста, дайте мне услугу и скопируйте/вставьте, попробуйте этот пример и покажите, что он отображает:
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();
}
}
}
Ответ 2
Ok. Это немного сложнее, чем я в первый раз... Чтобы выразить то, что я получил:
- Существует очень полезная команда:
session.setDebug(true);
. Если вы установите это значение true, каждый важный процесс будет отлажен на консоль. Я рекомендую использовать его.
- Второй компьютер может работать только с безопасным параметром, вы можете переключить его с помощью
Transport transport = session.getTransport("smtps");
скорее из небезопасного smtp... Транспортный объект JavaMail API также будет заботиться о портах (соответственно smtp: 587, smtps: 465)
-
Вы также можете использовать статический метод класса Transport для отправки сообщения и (сохранение его раньше, не статический метод sendMessage не сохранит сообщение), но на этот раз вам нужно использовать javax.mail. Аутентификатор при создании сеанса, например:
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("login", "password");
}
});
1.4.2 JavaMailApi имеет другое исключение, чем версия 1.4.7 для этой проблемы...
Если вы не используете его, вы не можете аутентифицироваться с помощью статического метода. Если вы используете метод экземпляра, вы можете.
- Один компьютер имеет maven и получил версию API JavaMail версии 1.4.2. Второй компьютер имеет загруженную библиотеку с версией 1.4.7, которая, как я полагаю, также путается с вещами
- Первый comp Netbeans, второй comp Intellij...
+1) В Интернете много старого и плохого примера кода, что усложняет использование этого API должным образом.
Так красиво испортилось, но была какая-то базовая концепция, которая должна быть сфокусирована...
Ответ 3
Я мог бы воспроизвести поведение, описанное в вашем вопросе, и исправить его.
Метод send
застревает в
SMTPTransport(Service).connect(String, int, String, String) line: 308
Соединение не выполняется, потому что у вас есть неправильный порт для хоста gmail smtp: 465
измените его на 587
props.put("mail.smtp.port", "587");
и он будет работать.
Ответ 4
Используя Простую Java-почту, это должно быть простым:
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("<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);
Если вы включили двухфакторный вход, вам нужно создать специальный пароль приложения из своей учетной записи Google.