在JAVA中通过gmail smtp服务器发送电子邮件

这个代码有什么问题? 不知何故,它正在进入Transport.send(message);行无限循环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); } 

在这里,我正在做一些改变,对我来说工作很好:

 Session session = Session.getInstance(props,null); 

你像实例一样实例化消息对象。 最后:

 Transport transport = session.getTransport("smtp"); String mfrom = "yourGmailUsernameWithout@"// 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(); } } } 

好。 这是比我第一次更复杂一点…要总结我所得到的:

  • 有一个非常有用的命令: session.setDebug(true); 。 如果你把这个设置为true,那么每个重要的过程都会被debugging到控制台。 我build议使用它。
  • 第二台计算机只能使用安全选项,你可以切换这个: Transport transport = session.getTransport("smtps"); 而不是非安全的smtp … JavaMail API传输对象也将照顾的端口(分别为smtp:587,smtps:465)
  • 您也可以使用Transport类的静态方法来发送消息(以前保存,非静态的sendMessage方法不会保存消息),但是这次您需要在创build会话时使用javax.mail.Authenticator,喜欢这个:

     Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("login", "password"); } 

    });

1.4.2 JavaMailApi有另一个exception比这个问题的1.4.7版本…

如果您不使用它,则无法使用静态方法进行身份validation。 如果你使用实例方法,你可以。

  • 一台电脑有maven,并得到了JavaMail API的1.4.2版本。 第二台电脑有一个下载的库,版本是1.4.7,我猜也是这样
  • 第一个补丁Netbeans,第二个补丁Intellij … +1)在互联网上有很多旧的和坏的示例代码,这使得更难以正确使用这个API。

所以相当混乱,但有一些基本的概念,应该集中…

我可以重现您的问题中描述的行为并修复它。

send方法卡住了

 SMTPTransport(Service).connect(String, int, String, String) line: 308 

连接不成功,因为您的gmail smtp主机有错误的端口: 465

将其更改为587

 props.put("mail.smtp.port", "587"); 

它会工作。

使用Simple Java Mail应该很简单:

 Email email = new Email(); email.setFromAddress("lollypop", "lol.pop@somemail.com"); email.addRecipient("C.Cane", "candycane@candyshop.org", 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); 

如果您启用了双因子login,则需要从您的Google帐户中生成特定于应用程序的密码 。