Senden Sie eine E-Mail mit einem PDF-Anhang über JavaMail

Überblick

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

PDF-Datei erstellen

Erstellen Sie eine PDF-Datei mit pdfbox.

Vorbereitung

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>

Code zur Erstellung von PDF-Dateien

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.

E-Mail senden

Senden Sie dann die E-Mail mit JavaMail.

Vorbereitung

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>

Installieren Sie FakeSMTP

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.

E-Mail-Sendecode

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

Senden Sie eine E-Mail mit einem PDF-Anhang über JavaMail
Senden Sie E-Mails von Google Mail mit Ruby
Senden Sie E-Mails mit JavaMail unter AWS
Ruby: Mail mit Starttls senden
[Spring Boot] Senden Sie eine E-Mail
Mail mit Spring Boot verschicken
[Version 2020] So senden Sie eine E-Mail mit Android Studio Javamail
Ruft die als Argument übergebene Zeichenfolge als Methode mit send auf
[Java] Senden Sie eine E-Mail mit Amazon SES
Senden Sie eine E-Mail, wenn ein Protokoll auf ERROR-Ebene mit SMTP Appender of Logback auftritt
Ich möchte eine E-Mail in Java senden.