【问题标题】:Eclipse Java, Send email from Gmail SMTP programaticallyEclipse Java,以编程方式从 Gmail SMTP 发送电子邮件
【发布时间】:2015-07-13 19:45:53
【问题描述】:

我正在尝试在 Eclipse 中使用 Java 以编程方式发送电子邮件。我使用最新的 JDK 1.8.0_45 正确设置了项目。我的意思是我已经包含了mailapi.jarsmtp.jar

我已经阅读了许多关于该主题的其他帖子,并且我知道我的 Java 构建路径必须包含 mail.jar。但是,当我搜索文件夹时,没有找到mail.jarmailapi.jar 是最接近的,并且似乎解决了我在没有它的情况下遇到的包含错误。

这是我的代码:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class emailer {

    private static String host = "smtp.gmail.com";
    private static String user = "**********";
    private static String pass = "***********";

    public static void sendEmail(String fromAddr, String toAddr, String subject, String body)
    {
        Properties prop = System.getProperties();
        prop.put("mail.smtp.starttls.enable", "true");
        prop.put("mail.smtp.host", host);
        prop.put("mail.smtp.user", user);
        prop.put("mail.smtp.password", pass);
        prop.put("mail.smtp.port", "465");
        prop.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(prop);
        MimeMessage message = new MimeMessage(session);

        try
        {
            message.setFrom(new InternetAddress(fromAddr));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddr));
            message.setSubject(subject);
            message.setText(body);
            Transport transport = session.getTransport("smtp");
            transport.connect(host, user, pass);
            transport.send(message, message.getAllRecipients()); 
            //The above line has a warning message
            //"The static method send(Message, Address[]) from the type Transport should be accessed in a static way"
            transport.close();
            System.out.println("done");
        }
        catch (AddressException e) {e.printStackTrace();}
        catch (MessagingException e) {e.printStackTrace();}
    }
}

代码编译没有错误,并且在运行时继续无限期地运行,永不中断或停止。所以很遗憾,我没有要显示的堆栈跟踪...任何帮助将不胜感激。

【问题讨论】:

标签: java eclipse email gmail jakarta-mail


【解决方案1】:

将传出端口更改为 587 而不是 465。这样就摆脱了无限超时(因为 Transport 没有超时值)。此外,使用静态 Transport.send() 将大大简化您的代码(使用非静态方法时我也确实遇到了一些错误)。所以像这样。

public class Emailer  //Class names should always be capitalized
{

private static String host = "smtp.gmail.com";
private static String user = "**********";
private static String pass = "***********";

public static void sendEmail(String fromAddr, String toAddr, String subject, String body)
{
    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", "587");
    Session.getInstance(props, null);

    MimeMessage message = new MimeMessage(session);

    try
    {
        message.setFrom(new InternetAddress(fromAddr));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddr));
        message.setSubject(subject);
        message.setText(body);
        Transport.send(message, user, pass);
    }
    catch (AddressException e) {e.printStackTrace();}
    catch (MessagingException e) {e.printStackTrace();}
}

【讨论】:

  • 谢谢!进行这些更改后,我得到以下堆栈跟踪。
  • 抱歉,错误 + 堆栈跟踪太大了,无法放入评论中。错误:javax.mail.AuthenticationFailedException 我不明白这一点,因为我已将我的 gmail 帐户设置为不太安全的应用程序访问,因此身份验证不应失败
  • 堆栈跟踪在 com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:893) 在 com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:814)在 com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:728) 在 javax.mail.Service.connect(Service.java:364) 在 javax.mail.Service.connect(Service.java:245) 在javax.mail.Service.connect(Service.java:265) 在 javax.mail.Transport.send0(Transport.java:251) 在 javax.mail.Transport.send(Transport.java:174) 在 emailer.sendEmail(emailer .java:32) 在 run.main(run.java:5)
  • 上面的代码对我来说很好用。您确定您的用户名和密码正确吗?
  • 我确定;有双重检查
【解决方案2】:

你可能想要包含 javax.mail.jar

你可以从这里下载它的主页

https://java.net/projects/javamail/pages/Home

【讨论】:

  • 完成上述操作,程序仍然只是连续运行而不会中断或完成......我知道我的代码正在尝试使用 gmail 的 smtp 服务器,因为我收到了来自 google 的电子邮件,通知我尝试访问我的帐户,此时我打开了不太安全的应用访问权限以允许我的程序访问 gmail smtp。
猜你喜欢
  • 2011-01-31
  • 2010-11-22
  • 1970-01-01
  • 2017-02-09
  • 2015-10-22
  • 2016-09-02
  • 2014-10-19
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多