可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
while sending mail I am getting this error
java.lang.RuntimeException: javax.mail.SendFailedException: Sending failed; nested exception is: class javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465, response: -1
my code is:
Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("email","password"); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("email")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(this.to)); message.setSubject("Testing"); message.setText("Hey, this is the testing email."); Transport.send(message);
Any help would be appreciated.
Thanks in Advance.
回答1:
You need to tell it that you are using SSL:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
In case you miss anything, here is working code:
String d_email = "address@gmail.com", d_uname = "Name", d_password = "urpassword", d_host = "smtp.gmail.com", d_port = "465", m_to = "toAddress@gmail.com", m_subject = "Indoors Readable File: " + params[0].getName(), m_text = "This message is from Indoor Positioning App. Required file(s) are attached."; Properties props = new Properties(); props.put("mail.smtp.user", d_email); props.put("mail.smtp.host", d_host); props.put("mail.smtp.port", d_port); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.debug", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.socketFactory.port", d_port); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); SMTPAuthenticator auth = new SMTPAuthenticator(); Session session = Session.getInstance(props, auth); session.setDebug(true); MimeMessage msg = new MimeMessage(session); try { msg.setSubject(m_subject); msg.setFrom(new InternetAddress(d_email)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to)); Transport transport = session.getTransport("smtps"); transport.connect(d_host, Integer.valueOf(d_port), d_uname, d_password); transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); } catch (AddressException e) { e.printStackTrace(); return false; } catch (MessagingException e) { e.printStackTrace(); return false; }
回答2:
I have been experiencing this issue when debugging using NetBeans, even executing the actual jar file. Antivirus would block sending email. You should temporarily disable your antivirus during debugging or exclude NetBeans and the actual jar file from being scanned. In my case, I'm using Avast.
See this link on how to Exclude : How to Add File/Website Exception into avast! Antivirus 2014
It works for me.
回答3:
What i did was i commented out the
props.put("mail.smtp.starttls.enable","true");
Because apparently for G-mail you did not need it. Then if you haven't already done this you need to create an app password in G-mail for your program. I did that and it worked perfectly. Here this link will show you how: https://support.google.com/accounts/answer/185833.
回答4:
Port 465 is for "smtp over SSL".
http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html
[...] For example, use props.put("mail.smtp.port", "888"); to set the mail.smtp.port property, which is of type int. Note that if you're using the "smtps" protocol to access SMTP over SSL, all the properties would be named "mail.smtps.*"
回答5:
In my case it was Avast Antivirus interfering with the connection. Actions to disable this feature: Avast -> Settings-> Components -> Mail Shield (Customize) -> SSL scanning -> uncheck "Scan SSL connections".