Senden Sie E-Mails mit JavaMail unter AWS

Versuchen Sie es mit Javamail unter AWS

Dieses Mal werde ich versuchen, Java-Mail über Googles SMTP mit EC2 von AWS zu senden, das im vorherigen Artikel gestartet wurde

Führen Sie Java auf EC2 aus

Überprüfen Sie, ob EC2 Java enthält Ssh zu EC2 wurde letztes Mal gestartet ssh -i [pem-Datei] [email protected]

Stellen Sie sicher, dass Java nicht enthalten ist java -version -bash: java: Befehl nicht gefunden javac -version -bash: javac: Befehl nicht gefunden yum list installed | grep java ** Es wird nichts angezeigt

Lassen Sie openJDK mit yum fallen sudo yum update sudo yum -y install java-1.8.0-openjdk-devel

Rückbestätigung Sie können sehen, dass Java installiert ist 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

Schreiben wir ein Programm, um Hello World als Testversion anzuzeigen

public class HelloWorld {

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

}

javac HelloWorld.java ls HelloWorld.class HelloWorld.java

Bestätigung anzeigen java HelloWorld ————————— HelloWorld —————————

Erstellen Sie ein Mail-Sendeprogramm in der lokalen Umgebung

Schreiben Sie den Code zum Senden von E-Mails in Java Die Entwicklungsumgebung verwendet Eclipse und Standard OpenJDK 1.8 ~ JavaMail erfordert eine dedizierte Bibliothek, daher werde ich sie löschen Legen Sie es aus dem folgenden Bereich ab und verwenden Sie es https://www.oracle.com/technetwork/java/index-138643.html

Das Klassendesign ruft den Mail Builder vom Mail-Client auf und gibt den Einstellungswert an Sendeverarbeitung mit sendMail-Methode Die Mail Builder-Klasse hat eine innere / äußere Konfiguration Erstellen Sie einen Builder für die innere Klasse und eine MailSend-Klasse für die äußere Klasse

Mail-Client

import mail_builder.SendMail;

public class JavaMailClients {

  public static void main(String[] args) {

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

    mailBuilder.setTo("E-Mail-Zieladresse");
    mailBuilder.setFrom("E-Mail-Absenderadresse");
    mailBuilder.setPassword("Google Mail Passwort");
    mailBuilder.setUserName("Google Mail-Benutzername");
    mailBuilder.setSmtpHost("smtp.gmail.com"); //Verwendung des SMTP-Servers von Google
    mailBuilder.setSmtpPort("587");


    String subject = "Test Email";
    String contents = "Getriebe testen";
    mailBuilder.build().sendMail(subject, contents);

  }

}

E-Mail-Absender

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);
    }

  }


}

Ich habe es an mein Mobiltelefon gesendet, aber es ist eine Ausnahme aufgetreten Es scheint, dass Sie den Mailserverzugriff von anderen mit Ihrem Google-Konto zulassen müssen Schalten Sie es auf dem Bildschirm unten ein スクリーンショット 2019-11-03 1.54.15.png

Ergebnis der erneuten Ausführung

[From :]
 test_user
[Subject :]
*Ich kann es aus irgendeinem Grund nicht sehen
[Content:]
$B%F%9%HAw?.(B

Verstümmelte Zeichen treten auf $B%F%9%HAw?.(B

Versuchen Sie, die Einstellungen für den fest codierten Zeichencode zu ändern. x-windows-iso2022jp (Ich habe dies verwendet, aber es wurde bereits im beschriebenen Code geändert ↓ ISO-2022-JP

Ergebnis

[From :]
 test_user
[Subject :]
Test Email
[Content:]
Getriebe testen

Ergebnisbestätigung abgeschlossen Daten mit Eclipse fegen Im Archivformat an den Server senden スクリーンショット 2019-11-03 2.02.11.png スクリーンショット 2019-11-03 2.03.00.png

Auf EC2 ausführen

Zum EC2-Server [local]

scp -i [PEM-Datei] SendMail.zip [email protected]:~;
ssh -i [PEM-Datei] [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)

Ich war lokal erfolgreich, aber aus irgendeinem Grund habe ich einen Fehler erhalten

In der lokalen Umgebung habe ich es in Eclipse ausgeführt, mich jedoch für MacOS entschieden Installieren Sie Java 8 mit HomeBrew [lokales Terminal]

/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.

Ich bekomme sogar bei Brew einen Fehler Anscheinend gibt es kein Java8 im Repository

Selbst wenn ich versuche, es offiziell fallen zu lassen, wird es ärgerlich sein, weil ich mich registrieren muss, nachdem ich zu Orakel gewechselt bin Ich habe nach openjdk für MacOS gesucht, konnte es aber nicht finden ...

Ich war ungefähr 2 Stunden lang klebrig, aber ich wurde süchtig

Betrachten Sie den Inhalt der Ausnahme, da die Javax-Mail-Klasse nicht gelesen werden kann Googeln über Klassenpfadeinstellungen Wenn Sie eine JAR-Datei einfügen, wissen Sie, dass Sie das JAR im Klassenpfad festlegen müssen

Erneut ausführen java -cp .:./javax.mail-1.6.2.jar JavaMailClients

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

Ein weiterer Fehler ... Es scheint, dass die Zugriffsauthentifizierung für den Mailserver fehlgeschlagen ist Als ich darüber gegoogelt habe, wurde die Einstellungsmethode auf der folgenden Site geschrieben https://stackoverflow.com/questions/34433459/gmail-returns-534-5-7-14-please-log-in-via-your-web-browser/34433953

Erneut einstellen und ausführen java -cp .:./javax.mail-1.6.2.jar JavaMailClients

Es hat sicher funktioniert. Da es nie mit dem Java-Befehl ausgeführt wird, Ich war dort süchtig, aber ich habe es geschafft.

das ist alles

Recommended Posts

Senden Sie E-Mails mit JavaMail unter AWS
[Version 2020] So senden Sie eine E-Mail mit Android Studio Javamail
[Java] Senden Sie eine E-Mail mit Amazon SES
Senden Sie eine E-Mail mit einem PDF-Anhang über JavaMail
[Spring Boot] Senden Sie eine E-Mail
Senden Sie E-Mails von Google Mail mit Ruby
Erstellen Sie eine Umgebung mit Docker unter AWS
Ich möchte eine E-Mail in Java senden.
Senden Sie E-Mails mit Amazon SES SMTP in Java
Verfahren zum Veröffentlichen einer Anwendung mit AWS (5) Veröffentlichen einer Anwendung
Erstellen Sie eine Laravel-Umgebung auf einer AWS-Instanz
So installieren Sie Ruby auf einer EC2-Instanz von AWS
Ich habe eine Ubuntu-Umgebung unter Windows 10 mit WSL2 erstellt.
Bereitstellen von Laravel mit Docker auf EC2 unter AWS ① (EC2-Instanz erstellen)
Verwenden Sie JDBC unter Linux
Erstellen eines Docker-Hosts in AWS mit Docker Machine (persönliches Memorandum)
Stellen Sie Laravel mit Docker auf EC2 unter AWS bereit (Elastic IP Acquisition-Linking).
Ruby on Rails Einstellung der automatischen E-Mail-Sendefunktion (über Google Mail)
So erstellen Sie einen Anwendungsserver auf einer EC2-Instanz von AWS
Starten Sie eine Anwendung in Code Engine mit IBM Cloud Shell
Stellen Sie Laravel mit Docker auf EC2 unter AWS bereit (Git Clone-Deployment, Migration).
Verfahren zum Veröffentlichen einer Anwendung mit AWS (4) Erstellen einer Datenbank
Ich möchte manuell eine Autorisierungs-E-Mail mit Devise senden