Envoyer des e-mails à l'aide de JavaMail sur AWS

Essayez d'utiliser Javamail sur AWS

Cette fois, j'essaierai d'envoyer du courrier Java via le SMTP de Google en utilisant EC2 d'AWS lancé dans l'article précédent

Exécutez Java sur EC2

Vérifiez si EC2 contient Java Ssh à EC2 lancé la dernière fois ssh -i [fichier pem] [email protected]

Assurez-vous que Java n'est pas inclus java -version -bash: java: commande introuvable javac -version -bash: javac: commande introuvable yum list installed | grep java ** Rien ne s'affiche

Déposez openJDK avec yum sudo yum update sudo yum -y install java-1.8.0-openjdk-devel

reconfirmation Vous pouvez voir que Java est installé java -version openjdk version "1.8.0_222" OpenJDK Runtime Environment (build 1.8.0_222-b10) OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

javac -version javac 1.8.0_222

Écrivons un programme pour afficher Hello World comme un essai

public class HelloWorld {

  public static void main(String[] args) {
    System.out.println("HelloWorld");
  }

}

javac HelloWorld.java ls HelloWorld.class HelloWorld.java

Afficher la confirmation java HelloWorld ————————— HelloWorld —————————

Créer un programme d'envoi de courrier dans l'environnement local

Ecrire le code d'envoi de mail en Java L'environnement de développement utilise Eclipse et OpenJDK 1.8 standard ~ JavaMail nécessite une bibliothèque dédiée, je vais donc la supprimer Déposez-le de la zone suivante et utilisez-le https://www.oracle.com/technetwork/java/index-138643.html

La conception de classe appelle le générateur de courrier à partir du client de messagerie et donne la valeur de paramètre Traitement des envois avec la méthode sendMail La classe de générateur de courrier a une configuration interne / externe Construire un générateur pour la classe interne et une classe MailSend pour la classe externe

Client de messagerie

import mail_builder.SendMail;

public class JavaMailClients {

  public static void main(String[] args) {

    SendMail.MailBuilder mailBuilder = new SendMail.MailBuilder();

    mailBuilder.setTo("Adresse e-mail de destination");
    mailBuilder.setFrom("Adresse de l'expéditeur de l'e-mail");
    mailBuilder.setPassword("mot de passe google mail");
    mailBuilder.setUserName("nom d'utilisateur google mail");
    mailBuilder.setSmtpHost("smtp.gmail.com"); //Utilisation du serveur SMTP de Google
    mailBuilder.setSmtpPort("587");


    String subject = "E-mail test";
    String contents = "Test de transmission";
    mailBuilder.build().sendMail(subject, contents);

  }

}

Expéditeur de l'e-mail

package mail_builder;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Address;
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 SendMail {

  // mail contents
  private String to = "";               // send target
  private String from = "";             // mail from

  // mail user settings
  private String userName = "";         // mail account(example google account)
  private String password = "";         // mail account password
  private String smtpHost = "";
  private String smtpPort = "";
  private final String smtpAuth = "true";
  private final String starttls = "true";
  private final String connectionTimeoutValue = "10000";
  private final String timeoutValue = "10000";

  // others
  private final String charSet = "ISO-2022-JP";
  private final String encoding = "base64";


  // smtp settings
  private Properties mailProperties = new Properties();
  private final String SMTP_HOST = "mail.smtp.host";
  private final String SMTP_PORT = "mail.smtp.port";
  private final String SMTP_AUTH = "mail.smtp.auth";
  private final String SMTP_START_TLS = "mail.smtp.starttls.enable";
  private final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout";
  private final String SMTP_TIMEOUT = "mail.smtp.timeout";


  public static class MailBuilder {

    private String to = "";
    private String from = "";
    private String userName = "";
    private String password = "";
    private String smtpHost = "";
    private String smtpPort = "";

    public MailBuilder setTo(String to) {
      this.to = to;
      return this;
    }

    public MailBuilder setFrom(String from) {
      this.from = from;
      return this;
    }

    public MailBuilder setUserName(String userName) {
      this.userName = userName;
      return this;
    }

    public MailBuilder setPassword(String password) {
      this.password = password;
      return this;
    }

    public MailBuilder setSmtpHost(String smtpHost) {
      this.smtpHost = smtpHost;
      return this;
    }

    public MailBuilder setSmtpPort(String smtpPort) {
      this.smtpPort = smtpPort;
      return this;
    }

    public SendMail build() {
      return new SendMail(this);
    }

  }



  private SendMail(MailBuilder mailBuilder) {
    this.to = mailBuilder.to;
    this.from = mailBuilder.from;
    this.userName = mailBuilder.userName;
    this.password = mailBuilder.password;
    this.smtpHost = mailBuilder.smtpHost;
    this.smtpPort = mailBuilder.smtpPort;
  }



  public void sendMail(String subject, String contents) {

    mailProperties.setProperty(SMTP_HOST, smtpHost);
    mailProperties.setProperty(SMTP_PORT, smtpPort);
    mailProperties.setProperty(SMTP_AUTH, smtpAuth);
    mailProperties.setProperty(SMTP_START_TLS, starttls);
    mailProperties.setProperty(SMTP_CONNECTION_TIMEOUT, connectionTimeoutValue);
    mailProperties.setProperty(SMTP_TIMEOUT, timeoutValue);

    Session session = Session.getInstance(mailProperties,
      new javax.mail.Authenticator() {
         protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password);
         }
      }
    );

    try {
      MimeMessage message = new MimeMessage(session);

      message.setFrom(new InternetAddress(from, "test_user"));
      message.setReplyTo(new Address[]{ new InternetAddress(from) });
      message.setRecipient( Message.RecipientType.TO, new InternetAddress(to) );
      message.setSubject(subject, charSet);
      message.setText(contents, charSet);
      message.setHeader("Content-Transfer-Encoding", encoding);

      Transport.send(message);

    } catch (MessagingException e) {
      throw new RuntimeException(e);
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }

  }


}

Je l'ai envoyé sur mon téléphone portable, mais une exception s'est produite Il semble que vous deviez autoriser l'accès au serveur de messagerie à d'autres personnes avec votre compte Google Allumez-le sur l'écran ci-dessous スクリーンショット 2019-11-03 1.54.15.png

Résultat de la réexécution

[From :]
 test_user
[Subject :]
*Je ne peux pas le voir pour une raison quelconque
[Content:]
$B%F%9%HAw?.(B

Des caractères déformés se produisent $B%F%9%HAw?.(B

Essayez de modifier les paramètres du code de caractère codé en dur. x-windows-iso2022jp (j'ai utilisé ceci, mais il a déjà été changé dans le code décrit ↓ ISO-2022-JP

résultat

[From :]
 test_user
[Subject :]
E-mail test
[Content:]
Test de transmission

Confirmation du résultat terminée Balayer les données avec Eclipse Envoyer au serveur au format archive スクリーンショット 2019-11-03 2.02.11.png スクリーンショット 2019-11-03 2.03.00.png

Exécuter sur EC2

Vers le serveur EC2 [local]

scp -i [fichier pem] SendMail.zip [email protected]:~;
ssh -i [fichier pem] [email protected]

[ec2]

unzip SendMail.zip 
ls
bin  src
cd bin
ls
JavaMailClients.class  javax.mail-1.6.2.jar  mail_builder

java JavaMailClients
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
	at mail_builder.SendMail$MailBuilder.build(SendMail.java:86)

J'ai réussi localement, mais pour une raison quelconque, j'ai eu une erreur

Dans l'environnement local, je l'ai exécuté dans Eclipse, mais j'ai décidé de l'exécuter sous MacOS Installez Java 8 avec HomeBrew [terminal local]

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew cask install adoptopenjdk8
Error: Cask 'adoptopenjdk8' is unavailable: No Cask with this name exists.

J'obtiens une erreur même avec Brew Apparemment, il n'y a pas de java8 dans le référentiel

Même si j'essaie de le déposer officiellement, ce sera ennuyeux car je dois m'enregistrer après être passé à oracle J'ai cherché openjdk pour MacOS mais je n'ai pas pu le trouver ...

J'étais collant pendant environ 2 heures, mais je suis devenu accro

En regardant le contenu de l'exception, car la classe de messagerie javax ne peut pas être lue Recherche sur Google des paramètres de chemin de classe Si vous incluez un fichier jar, vous savez que vous devez définir le fichier jar dans le classpath

Ré-exécuter java -cp .:./javax.mail-1.6.2.jar JavaMailClients

Exception in thread "main" java.lang.RuntimeException: javax.mail.AuthenticationFailedException: 534-〜〜〜〜

Une autre erreur ... Il semble que l'authentification d'accès au serveur de messagerie ait échoué Quand j'ai cherché sur Google, la méthode de paramétrage a été écrite sur le site suivant https://stackoverflow.com/questions/34433459/gmail-returns-534-5-7-14-please-log-in-via-your-web-browser/34433953

Réglez à nouveau et exécutez java -cp .:./javax.mail-1.6.2.jar JavaMailClients

Cela a fonctionné en toute sécurité. Puisqu'il n'est jamais exécuté à l'aide de la commande java, Je suis devenu accro, mais j'ai réussi à le faire.

c'est tout

Recommended Posts

Envoyer des e-mails à l'aide de JavaMail sur AWS
[Version 2020] Comment envoyer un e-mail à l'aide d'Android Studio Javamail
[Java] Envoyer un e-mail à l'aide d'Amazon SES
Envoyer un e-mail avec une pièce jointe PDF via JavaMail
[Spring Boot] Envoyer un e-mail
Envoyer des e-mails depuis Gmail avec Ruby
Créer un environnement avec Docker sur AWS
Je souhaite envoyer un e-mail en Java.
Envoyer des e-mails à l'aide d'Amazon SES SMTP en Java
Procédure de publication d'une application à l'aide d'AWS (5) Publier une application
Créer un environnement Laravel sur une instance AWS
Comment installer Ruby sur une instance EC2 d'AWS
J'ai construit un environnement Ubuntu sur Windows 10 en utilisant WSL2.
Déployer laravel à l'aide de docker sur EC2 sur AWS ① (Créer une instance EC2)
Utiliser JDBC sous Linux
Création d'un hôte Docker sur AWS à l'aide de Docker Machine (mémorandum personnel)
Déployez laravel à l'aide de docker sur EC2 sur AWS ② (Elastic IP acquisition-binding)
Ruby on Rails Paramètre de la fonction d'envoi automatique des e-mails (avec Gmail)
Comment créer un serveur d'applications sur une instance EC2 d'AWS
Lancer une application sur Code Engine à l'aide d'IBM Cloud Shell
Déployer laravel à l'aide de docker sur EC2 sur AWS ④ (git clone-deploy, migration)
Procédure de publication d'une application à l'aide d'AWS (4) Création d'une base de données
Je souhaite envoyer manuellement un e-mail d'autorisation avec Devise