Senden Sie eine E-Mail mit einem PDF-Anhang mit JavaMail und pdfbox. Erklärt, wie Sie eine PDF-Datei erstellen und eine E-Mail senden.
Umgebung
Erstellen Sie eine PDF-Datei mit pdfbox.
Stellen Sie zunächst pdfbox auf maven zur Verfügung.
pom.xml
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.13</version>
</dependency>
Jetzt erstellen wir eine PDF-Datei. Wir werden den Fall der Verwendung der eigentlichen Datei und den Fall der Verwendung des InputStream vorstellen. Dieses Mal möchte ich eine E-Mail senden, ohne eine tatsächliche Datei zu generieren, daher schreibe ich sie mit einer Methode, die ByteArrayInputStream zurückgibt.
public ByteArrayInputStream createDocument() {
PDDocument document = null;
TrueTypeCollection collection = null;
ByteArrayInputStream inputStream;
try {
//Erstellen Sie eine PDF-Basis. Diesmal mit A4.
document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
//Japanisch kann nur verwendet werden, wenn die Schriftart geladen ist. Laden Sie sie daher.
//Mac hat einen anderen Weg.
PDFont font = PDType1Font.TIMES_BOLD;
File file = new File("C:/Windows/Fonts/msmincho.ttc");
collection = new TrueTypeCollection(file);
PDFont font2 = PDType0Font.load(document, collection.getFontByName("MS-Mincho"), true);
//Erstellen Sie den Inhalt der Seite
PDPageContentStream contentStream = new PDPageContentStream(document, page);
//Erstellen Sie einen einzelnen Text, indem Sie die Schriftart und Position angeben.
//Unten links auf der Seite befindet sich die Basis(0, 0)Wird sein.
contentStream.beginText();
contentStream.newLineAtOffset(0, PDRectangle.A4.getHeight() - 12f);
contentStream.setFont(font, 12);
contentStream.showText("firstText");
contentStream.endText();
contentStream.beginText();
contentStream.newLine();
contentStream.setFont(font2, 15);
contentStream.showText("secondText");
contentStream.endText();
contentStream.close();
//Erstellen Sie eine PDF-Datei.
ByteArrayOutputStream out = new ByteArrayOutputStream();
document.save(out);
inputStream = new ByteArrayInputStream(out.toByteArray());
// ----Beim Erstellen einer echten Datei----
// document.save("sample.pdf");
// --------------------------------
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document != null) {
try {
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (collection != null) {
try {
collection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return inputStream;
}
Wenn Sie den Code "Beim Ausführen der eigentlichen Datei" schreiben, wird die PDF-Datei zu diesem Zeitpunkt generiert.
Senden Sie dann die E-Mail mit JavaMail.
Dies wird auch hinzugefügt, damit es in Maven verwendet werden kann.
pom.xml
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
Wir werden dieses Mal FakeSMTP als SMTP-Server für die Entwicklung verwenden. Informationen zur Verwendung finden Sie unter Link.
Übrigens habe ich Google Mail nicht mehr verwendet, weil ich mich nicht in der lokalen Umgebung authentifizieren konnte, ohne die Sicherheit zu verringern.
Schreiben wir nun den Code zum Senden der Mail. Empfangen Sie den InputStream der zuvor erstellten PDF als Argument und verwenden Sie ihn.
public void sendRawMail(final String subject, ByteArrayInputStream attachement) {
//Eigenschafteneinstellungen
Properties properties = System.getProperties();
//Gastgeber
properties.put("mail.smtp.host", HOST);
//Authentifizierung
properties.put("mail.smtp.auth", "true");
//Hafenbezeichnung (Submission Port)
properties.put("mail.smtp.port", "25");
//Verschlüsselung mit STARTTLS
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.starttls.enable", "false");
properties.put("mail.smtp.debug", "true");
//Auszeit
properties.put("mail.smtp.connectiontimeout", "10000");
properties.put("mail.smtp.timeout", "10000");
try {
//Sitzung erstellen.
final Session session = Session.getInstance(properties , new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication(){
//Geben Sie bei Verwendung von Google Mail usw. den Benutzernamen und das Kennwort als Argumente an.
return new PasswordAuthentication("", "");
}
});
final Message message = new MimeMessage(session);
//Grundinformation
message.setFrom(new InternetAddress("Absender-E-Mail-Adresse"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("Ziel-E-Mail-Adresse", false));
//Titel
message.setSubject(subject);
//Text
final MimeMultipart multipart = new MimeMultipart("mixed");
//Hauptteil
final MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("Hauptteil", "UTF-8");
//Angehängte Datei
final MimeBodyPart attPart = new MimeBodyPart();
//Erstellen Sie bei Verwendung einer realen Datei eine DataSource mit der realen Datei
final DataSource dataSource = new ByteArrayDataSource(attachement, "application/pdf");
attPart.setDataHandler(new DataHandler(dataSource));
attPart.setFileName("test.pdf");
multipart.addBodyPart(textPart);
multipart.addBodyPart(attPart);
message.setContent(multipart);
//Senden
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
throw new InternalServerErrorException(e);
}
}
Die Methodenausführung sendet eine E-Mail mit einem angehängten PDF.
Recommended Posts