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
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 —————————
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
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
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