Not able to send mails to gmail account using java

2019-09-08 16:52发布

问题:

When I am trying to send a sample mail to gmail account, am getting com.sun.mail.smtp.SMTPAddressFailedException. Following is the code i have written... Please can somebody help me to resolve the issue?

    public class MultiMimes {

public static void main(String[] args) throws Exception{

    Properties props = System.getProperties();
    props.setProperty("mail.smtp.host", "mailservername");
    props.put("mail.debug", "true");
    Session session = Session.getDefaultInstance(props,null);
    Message message = new MimeMessage(session);
    try{
        message.setSubject("I am a multipart text/html email" );
        Address toAddress =new InternetAddress("my gmail address");
        Address fromAddress =new InternetAddress("my organization address");
        message.setFrom(fromAddress);
        message.addRecipient(Message.RecipientType.TO, toAddress);

        MimeMultipart multipart1 = new MimeMultipart("alternative");

        // Create text message part
        MimeBodyPart textPart = new MimeBodyPart();
        textPart.setContent("am text", "text/plain");
        textPart.setHeader("MIME-Version" , "1.0" );
        textPart.setHeader("Content-Type" , textPart.getContentType() );
          System.out.println("textPart.getContentType():"+textPart.getContentType());
        // Create html part
        MimeBodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent("<html><body><b>am html</b></body></html>", "text/html");
        htmlPart.setHeader("MIME-Version" , "1.0" );
        htmlPart.setHeader("Content-Type" , "text/html" );
        System.out.println("htmlPart.getContentType():"+htmlPart.getContentType());
        //adding multiparts to message
        multipart1.addBodyPart(htmlPart);
        multipart1.addBodyPart(textPart);
        message.setContent(multipart1);

        //sending message
        Transport.send(message);
        System.out.println("mail sent successfully");
    }catch(AddressException ae){
        System.out.println("address exception");
        ae.printStackTrace();
    }
    catch(MessagingException e){
        System.out.println("message exception");
        e.printStackTrace();
    }


}

When i am using an email id from same domain (for ex: somebody@test.com) instead of gmail id, I am receiving the email.

回答1:

First of all , you need to change your code part to this :

private static final String SMTP_HOST_NAME = "smtp.gmail.com";

Properties prop = new Properties();
prop.put("mail.smtp.host", SMTP_HOST_NAME);
prop.put("mail.smtp.starttls.enable", "true");
prop.put("mail.smtp.port", "587");
prop.put("mail.smtp.auth", "true");

Authenticator auth = new SMTPAuthenticator();
Session session = Session.getDefaultInstance(prop, auth);

session.setDebug(debug);

And here is the SMTPAuthenticator Class :

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
  * SimpleAuthenticator is used to do simple authentication
  * when the SMTP server requires it.
  */

public class SMTPAuthenticator extends Authenticator
{
  private static final String SMTP_AUTH_USER = "youremail@gmail.com";
  private static final String SMTP_AUTH_PASSWORD = "yourpassword";

  public PasswordAuthentication getPasswordAuthentication()
  {
    String username = SMTP_AUTH_USER;
    String password = SMTP_AUTH_PASSWORD;

   return new PasswordAuthentication(username,  password);
  }

}

And please do change your from address to gmail and to address to anything, since your SMTP Authentication is being done by gmail, so that part must belong to gmail.

Hope that might help.

Regards



回答2:

Thanks to all...As i am new to satckoverflow... I am not able to find exact way to add appropriate comments....

Here I am not trying to send mails via gmail server... I am just trying to send to some gmail user. with this code i am able to send mails to any one within the organization... but not to people outside the organization.

any ways... I found the solution to my problem with "Prophesy Awaits" suggestion... I modified my code as below:

    package com.trx;

    import java.util.Properties;

    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.FileDataSource;
    import javax.mail.Address;
    import javax.mail.Authenticator;
    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;

    public class MultiMimes {

public static void main(String[] args) throws Exception{

    Properties props = System.getProperties();
    props.setProperty("mail.smtp.host", "mymailserver");
    props.put("mail.smtp.port", "25");
    props.put("mail.smtp.auth", "true");
    props.put("mail.debug", "true");
    Authenticator auth = new SMTPAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);
    Message message = new MimeMessage(session);
    try{
        message.setSubject("I am a multipart text/html email" );
        Address toAddress =new InternetAddress("my gmail address");
        Address fromAddress =new InternetAddress("my organization address");
        message.setFrom(fromAddress);
        message.addRecipient(Message.RecipientType.TO, toAddress);
        MimeMultipart multipart1 = new MimeMultipart("alternative");

        // Create text message part
        MimeBodyPart textPart = new MimeBodyPart();
        textPart.setContent("am text", "text/plain");
        textPart.setHeader("MIME-Version" , "1.0" );
        textPart.setHeader("Content-Type" , textPart.getContentType() );
          System.out.println("textPart.getContentType():"+textPart.getContentType());
        // Create html part
        MimeBodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent("<html><body><b>am html</b></body></html>",  "text/html");
        htmlPart.setHeader("MIME-Version" , "1.0" );
        htmlPart.setHeader("Content-Type" , "text/html" );
        System.out.println("htmlPart.getContentType():"+htmlPart.getContentType());
        //adding multiparts to message

        multipart1.addBodyPart(textPart);
        multipart1.addBodyPart(htmlPart);
        message.setContent(multipart1);

        //sending message
        Transport.send(message);
        System.out.println("mail sent successfully");
    }catch(AddressException ae){
        System.out.println("address exception");
        ae.printStackTrace();
    }
    catch(MessagingException e){
        System.out.println("message exception");
        e.printStackTrace();
    }


        }

   }

and i used same SMTPAuthenticator class provided by him... now i am able to send the mails form my organizations mailserver to any email id... Thanks again.



回答3:

i think the host name is a problem so change mailservername to smtp.gmail.com

for more information use this link

http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/