feat(email): initial commit
This commit is contained in:
parent
d03f366ac6
commit
0a1acbfee3
|
@ -0,0 +1,31 @@
|
|||
|
||||
# Files
|
||||
.classpath
|
||||
.externalToolBuilders
|
||||
.gradle
|
||||
.project
|
||||
.pydevproject
|
||||
.settings
|
||||
.sonar
|
||||
*~
|
||||
*.ipr
|
||||
*.iml
|
||||
*.iws
|
||||
*.swp
|
||||
*.DS_Store
|
||||
*.snap.debug
|
||||
dependency-reduced-pom.xml
|
||||
|
||||
# Directories
|
||||
.idea/
|
||||
.run/
|
||||
.venv/
|
||||
_site/
|
||||
build/
|
||||
dist/
|
||||
docs/_build/
|
||||
gen-java/
|
||||
gen-javabean/
|
||||
gen-py/
|
||||
node_modules/
|
||||
target/
|
|
@ -0,0 +1,7 @@
|
|||
# Overview
|
||||
|
||||
This project can serve as starting point for an Email project.
|
||||
|
||||
# Links
|
||||
|
||||
[Sending Email With Java](https://www.baeldung.com/java-email)
|
|
@ -0,0 +1,103 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<name>email</name>
|
||||
<description>description</description>
|
||||
<url>https://swingbe.de</url>
|
||||
<groupId>de.swingbe</groupId>
|
||||
<artifactId>email</artifactId>
|
||||
<version>0.0.1</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>GNU General Public License</name>
|
||||
<url>https://www.gnu.org/licenses/gpl-3.0.txt</url>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<scm>
|
||||
<url>https://github.com/Software-Ingenieur-Begerad/sandbox-java</url>
|
||||
</scm>
|
||||
|
||||
<properties>
|
||||
<!-- Other properties -->
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies><!-- https://mvnrepository.com/artifact/javax.mail/mail -->
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>1.5.0-b01</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.15</version>
|
||||
</dependency>
|
||||
<!--required for Logger class-->
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<version>2.17.2</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.10.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<filters>
|
||||
<filter>
|
||||
<!-- exclude signatures from merged JAR to avoid invalid signature messages -->
|
||||
<artifact>*:*</artifact>
|
||||
<excludes>
|
||||
<exclude>META-INF/*.SF</exclude>
|
||||
<exclude>META-INF/*.DSA</exclude>
|
||||
<exclude>META-INF/*.RSA</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
<!-- The shaded JAR will not be the main artifact for the project, it will be attached
|
||||
for deployment in the way source and docs are. -->
|
||||
<shadedArtifactAttached>true
|
||||
</shadedArtifactAttached>
|
||||
<shadedClassifierName>shaded</shadedClassifierName>
|
||||
<transformers>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<manifestEntries>
|
||||
<Main-Class>de.swingbe.email.Main
|
||||
</Main-Class>
|
||||
</manifestEntries>
|
||||
</transformer>
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -0,0 +1,19 @@
|
|||
package de.swingbe.email;
|
||||
|
||||
/**
|
||||
* Send an email.
|
||||
*/
|
||||
public interface Email {
|
||||
/**
|
||||
* Send an email.
|
||||
*
|
||||
* @param sender sender of the email
|
||||
* @param receiver recipient of the email
|
||||
* @param subject subject of the email
|
||||
* @param content content of the email
|
||||
* @param host host used to send email
|
||||
* @param user user from which the email is sent
|
||||
* @param key key of the user
|
||||
*/
|
||||
void send(String sender, String receiver, String subject, String content, String user, String key, String host, String contentType);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package de.swingbe.email;
|
||||
|
||||
/**
|
||||
* Factory for creating instance of {@link Email}
|
||||
*/
|
||||
public class EmailFactory {
|
||||
|
||||
/**
|
||||
* Create an instance of {@link Email}
|
||||
*
|
||||
* @return the created instance
|
||||
*/
|
||||
public static Email createEmail() {
|
||||
return new EmailImpl();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
package de.swingbe.email;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.*;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeBodyPart;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import javax.mail.internet.MimeMultipart;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
|
||||
public class EmailImpl implements Email {
|
||||
private final static Logger LOG = LoggerFactory.getLogger(EmailImpl.class);
|
||||
|
||||
@Override
|
||||
public void send(String sender, String receiver, String subject, String content, final String user, final String key, String host, String contentType) {
|
||||
|
||||
//TODO Java version 11 and later are working only with TLSv1.2 with this implementation
|
||||
SSLContext context = null;
|
||||
try {
|
||||
context = SSLContext.getInstance("TLS");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
LOG.error("ERROR getting Instance TLS");
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
context.init(null, null, null);
|
||||
} catch (KeyManagementException e) {
|
||||
LOG.error("ERROR initialising context");
|
||||
e.printStackTrace();
|
||||
}
|
||||
String[] supportedProtocols = context.getDefaultSSLParameters().getProtocols();
|
||||
LOG.debug("supportedProtocols: " + Arrays.toString(supportedProtocols));
|
||||
String sslProtocols = supportedProtocols[supportedProtocols.length - 1];
|
||||
LOG.debug("sslProtocols: " + sslProtocols);
|
||||
|
||||
/**
|
||||
* configure the library with our email service provider's credentials
|
||||
* then, create a Session that is used in constructing a message for sending
|
||||
* the configuration is via a Java Properties object
|
||||
*/
|
||||
|
||||
Properties prop = new Properties();
|
||||
prop.put("mail.smtp.starttls.enable", "true");
|
||||
prop.put("mail.smtp.host", host);
|
||||
prop.put("mail.smtp.user", user);
|
||||
prop.put("mail.smtp.password", key);
|
||||
prop.put("mail.smtp.auth", "true");
|
||||
prop.put("mail.smtp.port", "587");
|
||||
prop.put("mail.smtp.ssl.trust", host);
|
||||
prop.put("mail.smtp.ssl.protocols", sslProtocols);
|
||||
|
||||
//create a session with username and key
|
||||
Session session = Session.getInstance(prop, new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(user, key);
|
||||
}
|
||||
});
|
||||
|
||||
//create a MimeMessage for sending
|
||||
Message message = new MimeMessage(session);
|
||||
try {
|
||||
message.setFrom(new InternetAddress(sender));
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR setting From");
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver));
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR setting Recipient");
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
message.setSubject(subject);
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR setting Subject");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
MimeBodyPart mimeBodyPart = new MimeBodyPart();
|
||||
try {
|
||||
mimeBodyPart.setContent(content, contentType);
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR setting Content");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
Multipart multipart = new MimeMultipart();
|
||||
try {
|
||||
multipart.addBodyPart(mimeBodyPart);
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR adding Body");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
message.setContent(multipart);
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR setting Content");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
Transport.send(message);
|
||||
} catch (MessagingException e) {
|
||||
LOG.error("ERROR sending message");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package de.swingbe.email;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.*;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeBodyPart;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import javax.mail.internet.MimeMultipart;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
|
||||
public class Main {
|
||||
|
||||
private final static Logger LOG = LoggerFactory.getLogger(Main.class);
|
||||
|
||||
/**
|
||||
* The mail host from which the emails are sent.
|
||||
*/
|
||||
private final static String mailHost = "mail.vbn.de";
|
||||
|
||||
/**
|
||||
* The mail user from which the emails are sent.
|
||||
*/
|
||||
private final static String mailUser = "Tarifmatrix";
|
||||
|
||||
/**
|
||||
* The mail address from which the emails are sent.
|
||||
*/
|
||||
private final static String mailSender = "no_reply_tm@vbn.de";
|
||||
|
||||
private final static String mailReceiver = "sbegerad@posteo.de";
|
||||
|
||||
/**
|
||||
* The mail user password from which the emails are sent.
|
||||
*/
|
||||
private static final String password;
|
||||
|
||||
static {
|
||||
//TODO make parameter accessible using configuration
|
||||
// password = new String(Base64.decodeBase64((new BufferedReader(new FileReader("." + File.separator + "credentials" + File.separator + "email.txt"))).readLine().getBytes()));
|
||||
password = new String(Base64.decodeBase64("cHRlVjlsVTdrekoyZEYwMTlKNDM="));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
LOG.debug("Hello world!");
|
||||
EmailFactory.createEmail().send(mailSender, mailReceiver, "Subject", "This is my first email using JavaMailer", mailUser, password, mailHost, "text/html; charset=utf-8");
|
||||
LOG.debug("Bye!");
|
||||
return;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Configuration status="INFO">
|
||||
<Appenders>
|
||||
# Rolling appender
|
||||
<RollingFile name="rollingFile"
|
||||
fileName="log.txt"
|
||||
filePattern="log-%d{yyyy-MM-dd}-%i.txt.gz"
|
||||
ignoreExceptions="false">
|
||||
<PatternLayout>
|
||||
<Pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1} %m%n
|
||||
</Pattern>
|
||||
</PatternLayout>
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="21MB"/>
|
||||
</Policies>
|
||||
<DefaultRolloverStrategy max="50"/>
|
||||
</RollingFile>
|
||||
|
||||
# Console appender
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
# Pattern of log message for console appender
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1} - %msg%n"/>
|
||||
</Console>
|
||||
</Appenders>
|
||||
|
||||
<Loggers>
|
||||
# Override log level for specified package
|
||||
<Logger name="de.swingbe" level="all">
|
||||
<appender-ref ref="rollingFile" level="all"/>
|
||||
</Logger>
|
||||
<Root level="all" additivity="false">
|
||||
<appender-ref ref="console"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
|
||||
</Configuration>
|
Loading…
Reference in New Issue