在JAVA中通过gmail smtp服务器发送电子邮件
这个代码有什么问题?不知何故,它进入了一个无限循环,行在JAVA中通过gmail smtp服务器发送电子邮件,java,smtp,jakarta-mail,Java,Smtp,Jakarta Mail,这个代码有什么问题?不知何故,它进入了一个无限循环,行Transport.send(message)行,没有错误消息,没有异常,只是可能是无限循环(我不知道,因为我没有等待超过5-10分钟) final String username=”“; 最终字符串密码=”; Properties props=新属性(); props.put(“mail.smtp.auth”,“true”); props.put(“mail.smtp.starttls.enable”、“true”); put(“mail.
Transport.send(message)代码>行,没有错误消息,没有异常,只是可能是无限循环(我不知道,因为我没有等待超过5-10分钟)
final String username=”“;
最终字符串密码=”;
Properties props=新属性();
props.put(“mail.smtp.auth”,“true”);
props.put(“mail.smtp.starttls.enable”、“true”);
put(“mail.smtp.host”、“smtp.gmail.com”);
props.put(“mail.smtp.port”,“465”);
会话=会话.getInstance(props,
新的javax.mail.Authenticator(){
受保护的密码身份验证getPasswordAuthentication(){
返回新密码身份验证(用户名、密码);
}
});
试一试{
Message Message=新的mimessage(会话);
message.setFrom(新的互联网地址(@gmail.com));
message.setRecipients(message.RecipientType.TO,
InternetAddress.parse(“@gmail.com”);
message.setSubject(“测试对象”);
message.setText(“测试”);
传输。发送(消息);
系统输出打印项次(“完成”);
}捕获(消息异常e){
抛出新的运行时异常(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();
}
}
}
我可以重现你问题中描述的行为并加以纠正
send
方法在
SMTPTransport(Service).connect(String, int, String, String) line: 308
连接未成功,因为您的gmail smtp主机端口错误:465
将其更改为587
props.put("mail.smtp.port", "587");
它会工作的。好的。这比我第一次想象的要复杂一点。。。总结一下我得到的:
- 有一个非常有用的命令:
session.setDebug(true)代码>
。如果将此设置为true,则每个重要进程都将调试到控制台。我建议使用它
- 第二台计算机只能使用安全选项,您可以使用以下选项切换此计算机:
Transport-Transport=session.getTransport(“smtps”)代码>而不是非安全smtp。。。JavaMail API传输对象还将负责端口(分别为smtp:587、smtps:465)
- 您还可以使用Transport类的静态方法发送消息和(在之前保存,非静态sendMessage方法不会保存消息),但这次您需要在会话创建时使用javax.mail.Authenticator,如下所示:
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并获得了JavaMail API的1.4.2版本。第二台计算机有一个下载的库,版本为1.4.7,我想这也会弄乱东西
- 第一个组件Netbeans,第二个组件Intellij。。。
+1) 互联网上有很多旧的、糟糕的示例代码,这使得正确使用此API变得更加困难
非常混乱,但是有一些基本的概念需要关注…使用它应该很简单:
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);
电子邮件=新电子邮件();
email.setFromAddress(“lollypop”,“lol。pop@somemail.com");
email.addRecipient(“C.Cane”candycane@candyshop.org“,RecipientType.TO);
email.setText(“我们应该见面!”);
setexthtml(“我们应该见面了!”);
email.setSubject(“嘿”);
新邮件(“smtp.gmail.com”,25,“您的用户”,“您的密码”,TransportStrategy.smtp_TLS);
新邮件(“smtp.gmail.com”,587,“您的用户”,“您的密码”,TransportStrategy.smtp_TLS);
新邮件(“smtp.gmail.com”,465,“您的用户”,“您的密码”,TransportStrategy.smtp\u SSL).sendMail(电子邮件);
如果您启用了双因素登录,则需要从您的Google帐户生成一个。我建议在MessaginException
之后添加一个catch(Exception e){}
,以查看是否引发了其他类型的异常。还添加一个最后
块。您还可以添加log4j.xml
,并将javax.mail
类设置为DEBUG
,以查看还会发生什么。很好的提示,谢谢!将测试iTunes是否仍在传输线上等待。发送(消息)线路。。。有人可以验证此代码的正确性?谢谢,但是mail.smtp.auth属性已经存在。。。我也尝试过使用其他端口。啊,很抱歉使用auth属性,这是我的错,我没有看到。如果尝试使用25或587端口,请检查您的解决方案。。。线程“main”java.lang.RuntimeException中出现异常:javax.mail.MessaginException:无法连接到SMTP主机:SMTP.gmail.com,端口:25;嵌套异常是:java.net.ConnectException:连接被拒绝:connect仍然是同一个异常,是不是我的网络配置不正确?好消息,我们终于遇到了一些异常。你的例外是经典的:是的,我不知道为什么我使用465端口,但无论如何,它仍然不起作用:(您现在遇到了什么异常/错误?您的java.exe是否允许通过防火墙?此:java.lang.RuntimeException:javax.mail.MessaginException:无法连接到SMTP主机:SMTP.gmail.com,端口:25;嵌套异常是:java.net.ConnectException:连接被拒绝:连接我关闭了整个windows防火墙..似乎您的应用程序不支持SSL。smtp.gmail.com
需要安全连接,否则您将不得不选择另一个主机。您可能需要通过获取支持安全协议smtps
的Transport
实例来显式指定它,并使用它发送您的邮件。请参阅
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);