Envoyer un e-mail avec une pièce jointe PDF via JavaMail

Aperçu

Envoyez un e-mail avec une pièce jointe PDF en utilisant JavaMail et pdfbox. Explique comment créer un fichier PDF et comment envoyer un e-mail.

environnement

Créer un fichier PDF

Créez un fichier PDF en utilisant pdfbox

Préparation

Tout d'abord, rendez pdfbox disponible sur maven.

pom.xml


<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.13</version>
</dependency>

Code de création de fichier PDF

Créons maintenant un fichier PDF. Nous présenterons le cas de l'utilisation du fichier réel et le cas de l'utilisation de InputStream. Cette fois, je souhaite envoyer un e-mail sans générer de fichier réel, je vais donc l'écrire avec une méthode qui renvoie ByteArrayInputStream.

public ByteArrayInputStream createDocument() {
	PDDocument document = null;
	TrueTypeCollection collection = null;
        ByteArrayInputStream inputStream;

	try {
        //Créez une base PDF. Cette fois avec A4.
		document = new PDDocument();
		PDPage page = new PDPage(PDRectangle.A4);
		document.addPage(page);

        //Le japonais ne peut pas être utilisé tant que la police n'est pas chargée, alors chargez-la.
        //Mac a un chemin différent.
		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);

        //Créer le contenu de la page
		PDPageContentStream contentStream = new PDPageContentStream(document, page);
        //Créez un texte unique en spécifiant la police et la position.
        //Le bas à gauche de la page est la base(0, 0)Sera.
		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();

		//Créez un fichier PDF.
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        document.save(out);
        inputStream = new ByteArrayInputStream(out.toByteArray());

        // ----Lors de la création d'un vrai fichier----
        // 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;
}

Si vous écrivez le code "Lors de l'exécution du fichier réel", le fichier PDF sera généré à ce stade.

envoyer un e-mail

Ensuite, utilisez JavaMail (https://javaee.github.io/javamail/) pour envoyer l'e-mail.

Préparation

Ceci est également ajouté afin qu'il puisse être utilisé dans maven.

pom.xml


<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.4.7</version>
</dependency>

Installez FakeSMTP

Nous utiliserons FakeSMTP comme serveur SMTP pour le développement cette fois. Veuillez vous référer à Link pour savoir comment l'utiliser.

En passant, j'ai arrêté d'utiliser Gmail car je ne pouvais pas m'authentifier à partir de l'environnement local sans réduire la sécurité.

Email d'envoi du code

Maintenant, écrivons le code pour envoyer le mail. Recevez le InputStream du PDF créé précédemment comme argument et utilisez-le.

public void sendRawMail(final String subject, ByteArrayInputStream attachement) {
        //Paramètres de propriété
		Properties properties = System.getProperties();
		//hôte
		properties.put("mail.smtp.host", HOST);
		//Authentification
		properties.put("mail.smtp.auth", "true");
		//Désignation du port (port de soumission)
		properties.put("mail.smtp.port", "25");
		//Chiffrement avec STARTTLS
		properties.put("mail.smtp.starttls.enable", "true");
		properties.put("mail.smtp.starttls.enable", "false");
		properties.put("mail.smtp.debug", "true");
		//temps libre
		properties.put("mail.smtp.connectiontimeout", "10000");
		properties.put("mail.smtp.timeout", "10000");

		try {
            //Créer une session.
			final Session session = Session.getInstance(properties , new javax.mail.Authenticator(){
                protected PasswordAuthentication getPasswordAuthentication(){
                    //Lorsque vous utilisez Gmail, etc., spécifiez le nom d'utilisateur et le mot de passe comme arguments.
                    return new PasswordAuthentication("", "");
                }
            });
			final Message message = new MimeMessage(session);

			//Informations de base
			message.setFrom(new InternetAddress("Adresse e-mail de l'expéditeur"));
			message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("Adresse e-mail de destination", false));
            //Titre
			message.setSubject(subject);

			//Texte
			final MimeMultipart multipart = new MimeMultipart("mixed");
            //Le corps du texte
			final MimeBodyPart textPart = new MimeBodyPart();
			textPart.setText("Le corps du texte", "UTF-8");

            //Pièce jointe
			final MimeBodyPart attPart = new MimeBodyPart();
            //Lors de l'utilisation d'un vrai fichier, créez une DataSource avec le vrai fichier
			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);

			//Envoyer
			Transport.send(message);
		} catch (Exception e) {
			e.printStackTrace();
			throw new InternalServerErrorException(e);
		}
	}

L'exécution de la méthode enverra un e-mail avec un PDF en pièce jointe.

Recommended Posts

Envoyer un e-mail avec une pièce jointe PDF via JavaMail
Envoyer des e-mails depuis Gmail avec Ruby
Envoyer des e-mails à l'aide de JavaMail sur AWS
Ruby: envoyer des e-mails avec Starttls
[Spring Boot] Envoyer un e-mail
Envoyer du courrier avec Spring Boot
[Version 2020] Comment envoyer un e-mail à l'aide d'Android Studio Javamail
Appelle la chaîne de caractères passée comme argument en tant que méthode avec send
[Java] Envoyer un e-mail à l'aide d'Amazon SES
Envoyer un e-mail lorsque le journal de niveau d'ERREUR se produit avec SMTP Appender de logback
Je souhaite envoyer un e-mail en Java.