通过 Java 发送电子邮件 - javax.mail.MessagingException:无法连接到 SMTP 主机:本地主机,端口:587;
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26087018/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Sending emails through Java - javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 587;
提问by Scarl
I'm currently working on a project that involves the creation of a .jar file. The following is to be achieved, I'm supposed to export/read the path of a friend's registry, once this is done I'm supposed to get the result back via email. The whole concept is in creating the jar file and once it's clicked I get the results through my email since I actually sent it through email.
我目前正在处理一个涉及创建 .jar 文件的项目。要实现以下目标,我应该导出/读取朋友注册表的路径,完成后我应该通过电子邮件获取结果。整个概念是创建 jar 文件,一旦点击它,我就会通过我的电子邮件获得结果,因为我实际上是通过电子邮件发送的。
(I hope this makes sense)
(我希望这是有道理的)
So first, I've combined the following code to actually read the registry and display the keys ( i got it from the popular post on stack overflow for read/write registries) so the reading process is working fine, now my problem is with the email code,
所以首先,我结合了以下代码来实际读取注册表并显示密钥(我从有关读/写注册表的堆栈溢出的流行帖子中得到它),因此读取过程工作正常,现在我的问题是电子邮件代码,
(I'm not quite sure who the original owner to this code is but full credit goes it him) I'm trying to get the basic concept of this email code to work so that I can continue working on sending my jar file as an attachment and link it to my code in a way when a user clicks on the jar file, the registry results will be emailed back to me.
(我不太确定此代码的原始所有者是谁,但完全归功于他)我正在尝试使此电子邮件代码的基本概念起作用,以便我可以继续将我的 jar 文件作为附件并以某种方式将其链接到我的代码,当用户单击 jar 文件时,注册表结果将通过电子邮件发送给我。
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 MailCode {
public static void main(String[] args) throws Exception {
final String smtp_host = "smtp.gmail.com";
final String smtp_username = "[email protected]";
final String smtp_password = "password";
final String smtp_connection = "TLS"; // Use 'TLS' or 'SSL' connection
final String toEmail="[email protected]";
final String fromEmail="**@gmail.com";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
if (smtp_connection.equals("TLS")) {
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.port", "587");
} else{
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.port", "465");
}
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(smtp_username, smtp_password);
}
});
try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(fromEmail, "NoReply"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(toEmail, "Mr. Recipient"));
msg.setSubject("Welcome To JavaMail API");
msg.setText("JavaMail API Test - Sending email example through remote smtp server");
Transport.send(msg);
System.out.println("Email sent successfully...");
} catch (AddressException e) {
throw new RuntimeException(e);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
This is the error message I'm getting:
这是我收到的错误消息:
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 587;
nested exception is:
java.net.SocketException: Permission denied: connect
回答by user207421
You're setting smtp_host
but you're never using it.
你在设置,smtp_host
但你从不使用它。
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 587;
You're trying to connect to 'localhost' instead of gmail.com. That's becase you're not setting mail.smtp.host
anywhere.
您正在尝试连接到“localhost”而不是 gmail.com。那是因为你没有mail.smtp.host
在任何地方设置。
And why are you setting an SSL socket factory in the non-TLS case?
为什么要在非TLS 情况下设置 SSL 套接字工厂?
回答by Anptk
The following code may help you to solve your problem, its working........
以下代码可以帮助您解决您的问题,它的工作原理......
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Email {
private static String USER_NAME = "username"; // GMail user name (just the part before "@gmail.com")
private static String PASSWORD = "password"; // GMail password
private static String RECIPIENT = "[email protected]";
public static void main(String[] args) {
String from = USER_NAME;
String pass = PASSWORD;
String[] to = { RECIPIENT }; // list of recipient email addresses
String subject = "Java send mail example";
String body = "hi ....,!";
sendFromGMail(from, pass, to, subject, body);
}
private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.trust", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
try {
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++ ) {
toAddress[i] = new InternetAddress(to[i]);
}
for( int i = 0; i < toAddress.length; i++) {
message.addRecipient(Message.RecipientType.TO, toAddress[i]);
}
message.setSubject(subject);
message.setText(body);
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
catch (AddressException ae) {
ae.printStackTrace();
}
catch (MessagingException me) {
me.printStackTrace();
}
}
}
回答by Karthik M
Please check your Antivirus/Malware.
请检查您的防病毒软件/恶意软件。
If you are using corporate developer machine please contact your administrator to remove that access protection rule.
如果您使用的是企业开发者机器,请联系您的管理员以删除该访问保护规则。
I had the same problem, my McAfee was blocking all the request.
我遇到了同样的问题,我的迈克菲阻止了所有请求。
Blocked by port blocking rule C:\PROGRAM FILES\JAVA\JDK1.8.0_74\BIN\JAVAW.EXE Anti-virus Standard Protection:Prevent mass mailing worms from sending mail 0:0:0:0:0:ffff:4a7d:7e6d:587
被端口阻塞规则阻塞 C:\PROGRAM FILES\JAVA\JDK1.8.0_74\BIN\JAVAW.EXE 反病毒标准保护:防止群发邮件蠕虫发送邮件 0:0:0:0:0:ffff:4a7d: 7e6d:587
found this in Access protection log and requested my admin to remove that rule.
在访问保护日志中发现了这一点,并要求我的管理员删除该规则。
Try this might help you.
试试这可能对你有帮助。