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éez un fichier PDF en utilisant pdfbox
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>
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.
Ensuite, utilisez JavaMail (https://javaee.github.io/javamail/) pour envoyer l'e-mail.
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>
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é.
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