2

我正在尝试从我的 Java 应用程序向任何特定的电子邮件地址发送电子邮件。我正在使用 Java Mail API,但不幸的是我收到了 SMTPSendFailedException 错误。任何人都可以告诉我我在哪里做错了。这是我的代码

import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

//import SeconMail.Authenticator;

public class SendMail
{

   public static void main(String [] args)
   {    

      // Recipient's email ID needs to be mentioned.
      String to = "to@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "from@expertflow.com";

      // Assuming you are sending email from localhost
      String host = "smtp.gmail.com";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server

      properties.setProperty("mail.smtp.host", host);


      properties.put("mail.smtp.starttls.enable", "true");

      properties.put("mail.smtp.auth", "false");
      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);
      session.setDebug(true);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}
4

8 回答 8

6
properties.setProperty("mail.smtp.user", "abc");
properties.setProperty("mail.smtp.password", "xyz");
properties.setProperty("mail.smtp.auth", "true"); 

请尝试使用这个

于 2013-12-26T07:04:07.020 回答
2

在创建会话时覆盖一个方法PasswordAuthentication并在其中提供用户名和密码。

    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() 
    {
        protected PasswordAuthentication getPasswordAuthentication() 
        {
            return new PasswordAuthentication("pqr@gmail.com","xyz@123");
        }
   });
于 2013-12-26T07:01:43.483 回答
2

试试这些

String login = "myemailhere";
String pass = "mypasshere";
properties.setProperty("mail.smtp.user", login);
properties.setProperty("mail.smtp.password", pass);
properties.setProperty("mail.smtp.auth", "true");      

Transport transport = session.getTransport("smtp");
transport.connect(null, login, pass);
于 2013-12-26T07:02:20.330 回答
1

如果它仍然不适合你试试这个:

properties.setProperty("mail.smtps.ssl.enable", "true");
properties.setProperty("mail.smtps.auth", "true"); 
于 2014-11-27T19:52:14.020 回答
1

这对我有用:

final Properties properties = System.getProperties();

// Setting up mail server
properties.setProperty("mail.smtp.host", EMAIL_SMTP_HOST);
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.auth", "true");

Session session = Session.getInstance(properties, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(EMAIL_USERNAME,
                EMAIL_PASSWORD);
    }
});
session.setDebug(true);
于 2018-11-01T15:06:32.810 回答
1

我最近遇到了同样的问题。我尝试使用 API 密钥 + 密码验证通过 Gmail 服务器发送电子邮件。Transport.send(message)对我不起作用,我对其进行了调试,发现它忽略了附加到message.

现在,我通过 SMTP Gmail 服务器使用身份验证和 TLS 发送电子邮件。我用了com.sun.mail:javax.mail-1.6.1

    String host = "your-email-server-host"; // define your server host here
    int port = 587; // standard port for TLS connection

    // config session properties, here the SMTP protocol is used
    Properties properties = new Properties();
    properties.setProperty("mail.smtp.host", host);
    properties.setProperty("mail.smtp.port", String.valueOf(port));
    properties.setProperty("mail.smtp.auth", "true"); // enable auth
    properties.setProperty("mail.smtp.starttls.enable", "true"); // enable TLS

    // get session instace baed on the settings defined above
    Session session = Session.getInstance(properties);

    // `prepareMessage` implementation is omitted, construct your own message here
    MimeMessage mimeMessage = prepareMessage(email, session);

    // your credentials       
    String username = "your-username@gmail.com"; // or API key, I used API key
    String password = "your-password";

    // get the transport instance from the freshly created session
    // pass the valid protocol name, here the SMTP is used
    Transport transport = session.getTransport("stmp");

    // connect to the transport instance with your credentials
    transport.connect(host, port, username,password);

    // send the message
    transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
于 2018-03-13T13:19:13.967 回答
1

也试试

Transport.send(message, user, pass);

我在运输类文档中找到了这个

使用指定的用户名和密码向邮件服务器进行身份验证。

public static void send(Message msg, String user, String password) throws MessagingException {

    msg.saveChanges();
    send0(msg, msg.getAllRecipients(), user, password);
}

我正在使用 JavaMail v 1.6.1 和MailTrap SMTP 服务器

于 2018-03-07T08:02:35.013 回答
0
properties.setProperty("mail.smtp.user", "abc");
properties.setProperty("mail.smtp.password", "xyz");
properties.setProperty("mail.smtp.auth", "true");

成功了,解决我的问题

于 2021-06-22T03:05:06.903 回答