在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);