title: Need to make Javamail more secure for gmail authentication
body: <p>I have written a code for sending a simple mail from java(javamail/jaf). after I run the program I got an email from google that my account is being accessed by unsecured device/app. Then I had to change the settings of my gmail account to allow login for "less secure apps" option. Then I received my email from the program. </p>
  
  <p>I need to send email without changing the option allow "less secure apps" option in my account. Please help.</p>
  
  <p>My code is:</p>
  
  <pre><code>import java.util.Properties;
  import javax.mail.Message;
  import javax.mail.MessagingException;
  import javax.mail.PasswordAuthentication;
  import javax.mail.Session;
  import javax.mail.Transport;
  import javax.mail.internet.InternetAddress;
  import javax.mail.internet.MimeMessage;
  
  public class SendMailSSL {
      public static void main(String[] args) {
          Properties props = new Properties();
          props.put("mail.smtp.host", "smtp.gmail.com");
          props.put("mail.smtp.socketFactory.port", "465");
          props.put("mail.smtp.socketFactory.class",
                  "javax.net.ssl.SSLSocketFactory");
          props.put("mail.smtp.auth", "true");
          props.put("mail.smtp.port", "465");
  
          Session session = Session.getDefaultInstance(props,
              new javax.mail.Authenticator() {
                  protected PasswordAuthentication getPasswordAuthentication() {
                      return new PasswordAuthentication("*****@gmail.com","*******");
                  }
              });
  
          try {
  
              Message message = new MimeMessage(session);
              message.setFrom(new InternetAddress("*****@gmail.com"));
              message.setRecipients(Message.RecipientType.TO,
                      InternetAddress.parse("*****@gmail.com"));
              message.setSubject("Testing Subject");
              message.setText("Dear User," +
                      "\n\n No spam to my email, please!");
  
              Transport.send(message);
  
              System.out.println("Done");
  
          } catch (MessagingException e) {
              throw new RuntimeException(e);
          }
      }
  }
  </code></pre>