Java подключение к локальному SMTP-серверу
Что не так с этим кодом? Я пытаюсь отправить электронное письмо на мой локальный хост с hMailServer, но это не работает. Пока этот код работает для SMTP-сервера Gmail... я могу подумать, что ошибка в моем hMailServer, но я не могу ее найти...
try{
String host = "127.0.0.1";
String from = "account@127.0.0.1";
String pass = "1q2w#E$R";
Properties props = System.getProperties();
props.put("mail.smtp.starttls.enable", "true"); // added this line
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "true");
String[] to = {"test@test.com"}; // added this line
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
InternetAddress[] toAddress = new InternetAddress[to.length];
// To get the array of addresses
for( int i=0; i < to.length; i++ ) { // changed from a while loop
toAddress[i] = new InternetAddress(to[i]);
}
for( int i=0; i < toAddress.length; i++) { // changed from a while loop
message.addRecipient(Message.RecipientType.TO, toAddress[i]);
}
message.setSubject("sending in a group");
message.setText("Welcome to JavaMail");
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
catch (Exception e) {
e.printStackTrace();
}
Это ошибка, которую я получаю:
javax.mail.MessagingException: Could not connect to SMTP host: 127.0.0.1, port: 25;
nested exception is:
java.net.SocketException: Permission denied: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1213)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:311)
at javax.mail.Service.connect(Service.java:233)
at javax.mail.Service.connect(Service.java:134)
at nl.company.cms.login.emailservice.TestMail.main(TestMail.java:71)
Я использую hMailServer..
4 ответа
Если вы используете Java 7, то при запуске приложения я бы попытался добавить это в качестве параметра JVM:
-Djava.net.preferIPv4Stack=true
Это может быть необходимо, потому что Java теперь пытается использовать IPv6, поэтому мы должны сказать ему, чтобы он предпочитал стек IPv4.
Если вы используете Xampp, убедитесь, что Mercury работает на вашем компьютере на вашем компьютере, потому что порт 25 не будет работать с javaMail, если mercury не запущен.
Я подтверждаю, что только этот параметр "-Djava.net.preferIPv4Stack=true", записанный в catalina.bat Tomcat, помог мне отправить электронное письмо из моего веб-приложения Spring в мой локальный экземпляр hMailServer. Окружающая среда: Windows 8, Java 7u60.
Я могу подтвердить, что только добавив аргумент VM для Tomcat:
-Djava.net.preferIPv4Stack = верно
Я мог отправить поддельное письмо с "Поддельным SMTP-сервером" на моем локальном хосте из моего веб-приложения через JavaMail API
Я могу подтвердить, что, только реализовав предложение @Quantas о добавлении параметра "-Djava.net.preferIPv4Stack=true" в "конфигурации запуска" в ECLIPSE, моя проблема получения почты об исключениях. Исключение сообщений теперь решено.
В последние 2 дня я получал следующее исключение, когда использовал " Fake SMTP mail server" для перехвата писем, отправляемых из моего приложения, запущенного в eclipse.
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
Теперь проблема была полностью решена, просто поместив этот маленький кусочек кода в "VM ARGUMENTS" в "конфигурации запуска" ECLIPSE LUNA.
-Djava.net.preferIPv4Stack=true
Как показано на снимке ниже
Это говорит о том, что Java предпочитает использовать стек IPV4 вместо IPV6 (который он предпочитает ранее)