Cette fois, je n'ai parlé que de la fonction d'envoi d'e-mail, mais j'avais peur du manque de contenu, j'ai donc ajouté quelques explications de la fonction de compression de fichiers.
Tout d'abord, le courrier électronique est envoyé. La fonction e-mail a des dépendances correspondantes dans Springboot. Ce:
<dependency> <proupId> org.springframework.boot </proupId> <ArtefactId> printemp-boot-starter-Mail </retifactid> </dEpendency>
Le développement de la fonction de messagerie est assez simple à Springboot. Ici, je résumerai le contenu de développement:
A> Ajouter un package de dépendance
B> Configurer les paramètres de base du courrier (en ymal ou propriété)
C> Injecter JavamailSender en service et appeler des méthodes pertinentes
Cependant, il peut y avoir un problème ici. Je donnerai une solution lorsque je explique ici.
Tout d'abord, vous devez introduire le composant de messagerie dans le pom.xml du projet. La version composante doit correspondre à la version Springboot (vous ne pouvez pas l'écrire, je l'omet ici):
<dependency> <proupId> org.springframework.boot </proupId> <ArtefactId> printemp-boot-starter-Mail </retifactid> </dEpendency>
Ensuite, il s'agit de configurer les paramètres de base de l'e-mail dans le fichier de configuration:
Spring: Mail: Hôte: Smtp.exmail.qq.com Nom d'utilisateur: [email protected] Mot de passe: Mot de passe par défaut-codage: UTF-8 SSL: Trust: SMTP.Exmail.qq.com Propriétés: Mail: SMTP: Auth: True #Does Authentication Need SocketFactory: Class: Javax.net.ssl. 465 #User le port SMTP465
Lors de la configuration des paramètres, vous devez faire attention à l'indentation, car je donne le format de configuration YAML. S'il s'agit d'une configuration de propriété, c'est à peu près comme ça (exemple): printemps.mail.host:smtp.exmail.qq.com. Chaque enfant est dans un format complet. Au début, j'ai omis la configuration sous l'élément de propriétés (sérieux, SSL, port). Plus tard, j'ai constaté que le serveur a bloqué le 25e port du courrier, il est donc possible localement mais qu'il ne fonctionne pas sur le serveur, il doit donc spécifier le port de service de messagerie pour être 465. J'utilise une boîte aux lettres QQ ici. Si vous utilisez 163 ou autres boîtes aux lettres, vous devez vérifier vous-même les ports pris en charge par le fournisseur de services. En ce qui concerne les problèmes de sécurité par e-mail, deux doivent être déclarés ici, l'un est SSL Trust et la Socket Factory of Mail. Pour plus de détails, veuillez consulter la section rouge ci-dessus. La configuration ci-dessus n'est valable que pour les boîtes aux lettres QQ, et elle ne garantit pas que d'autres boîtes aux lettres sont également applicables.
Ok, la configuration est terminée, ici nous commençons à écrire la classe d'implémentation spécifique:
import xxx.common.util.dateutil; import org.apache.commons.lang3.stringutils; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; org.springframework.beans.factory.annotation.value; import org.springframework.mail.simplemailMessage; import org.springframework.mail.javamail.javamailsender; import org.springframework.mail.javamail.mimessagehelper; import; org.springframework.sterreotype.service; importer javax.mail.internet.mimeMessage; import java.util.date; import java.util.list; import java.util.map; @ServicePublic class MailService. @Value ("$ {printemps.mail.username}") String privé send_user_addr; @Autowired Private JavamailSender MailSender; / ** * Envoyer un e-mail simple * @param recevoir le destinataire * @param obj Envoyer un sujet * @param contenu contenu e-mail * / public void sendsimplemail (String Recea, String obj, string contenu) {if (! StringUtils.isnotblank (contenu) ||! StringUtils.isnotblank (recevoir)) return; // ne pas envoyer de messagerie vide simpleMailMessage Message. message.setFrom (send_user_addr); if (recese.contains (";")) message.setto (recese.split (";")); else Message.SetTo (recevoir); Message.SetSubject (OBJ); message.seTText (contenu); essayez {MailSender.Send (message); Log.info ("SIMPLE SIMPS SUPPORT!"); } catch (exception e) {log.error ("Error SendSimplemail!", e); }} private StringBuilder strBuilder; / ** * Le formulaire de la liste multi-list HTML Mail Multi-list * @param recevoir le destinataire * @param obj Send Topic (Topic) * @param Contenu Courriel Content * / public void SendhtmlmailByList (String Receive, String obj, list <maph contenu) {if (content.isempty () ||! StringUtils.isnotblank (recevoir) || null == Obj) retour; MimeMessage msg = MailSender.CreateMiMEMessage (); essayez {mimeMessageHelper helper = new mimeMessageHelper (msg, true, "utf-8"); // Résoudre le problème brouillé helper.setFrom (send_user_addr); if (recese.contains (";")) helper.setto (recese.split (";")); else helper.setto (recevoir); helper.setsubject (obj); strBuilder = new StringBuilder (); strbuilder.append ("<! doctype html> <html> <éad- head> <meta http-equiv = /" contenu-type / "contenu = /" text / html; charset = utf-8 / "> </ head> <style corporel = /" padding: 3% 2%; / ">"); strbuilder.append ("<h2> Ce message est automatiquement envoyé au système. </h2>"); strbuilder.append ("<h2> envoyer la date par" + dateUtil.getDateFormat (new Date (), dateUtil.datetime_default_format) + "</h2>"); strbuilder.append ("<h2> Ce qui suit est les détails: </h2>"); strbuilder.append ("<Table Border = /" 2px solide rouge / "width = /" 100% / ">"); // tête strbuilder.append ("<th>" + st [i] + "</th>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); Objet [] st = content.get (0) .KeySet (). ToArray (); pour (int i = 0; i <st.Length; i ++) strbuilder.append ("<th>" + st [i] + "</th>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); // Body strbuilder.append ("<tbody>"); pour (élément de carte: contenu) {strbuilder.append ("<tr>"); pour (objet str: st) strbuilder.append ("<td>" + item.get (str) + "</td>"); strbuilder.append ("</tr>"); } strbuilder.append ("</tbody>"); strbuilder.append ("</s table>"); strbuilder.append ("</s table>"); strbuilder.append ("<h3 style = /" text-align: right / "> meilleurs souhaits </h3>"); strbuilder.append ("</ody> </html>"); //Log.info (strbuilder.toString ()); helper.setText (strbuilder.toString (), true); } catch (exception e) {log.Error ("Erreur Sendhtmlmail:", e); } MailSender.Send (msg); } / ** * Envoyer le formulaire d'enregistrement de colonne unique HTML Mail * @param recevoir le destinataire * @param obj Send Topic (Title) * @param Content Email Content * / public void SendhtmlmailByitem (String Receive, String obj, list <String> Content) {if (content.isempty () ||! StringUtils.isnotblank (recevoir) || null == obj) MimeMessage msg = MailSender.CreateMiMEMessage (); essayez {mimeMessageHelper helper = new mimeMessageHelper (msg, true, "utf-8"); // Résoudre le problème brouillé helper.setFrom (send_user_addr); if (recese.contains (";")) helper.setto (recese.split (";")); else helper.setto (recevoir); helper.setsubject (obj); strBuilder = new StringBuilder (); strbuilder.append ("<! doctype html> <html> <éad- head> <meta http-equiv = /" contenu-type / "contenu = /" text / html; charset = utf-8 / "> </ head> <style corporel = /" padding: 3% 2%; / ">"); strbuilder.append ("<h3> Ce message est automatiquement envoyé au système. </h3>"); strbuilder.append ("<h3> envoyer la date par" + dateUtil.getDateFormat (new Date (), dateUtil.datetime_default_format) + "</h3>"); strbuilder.append ("<h3> Ce qui suit est les détails: </h3>"); strbuilder.append ("<Table Border = /" 2px solide rouge / "width = /" 100% / ">"); // tête strbuilder.append ("<Table Border = /" 2px Solid Red / "width = /" 100% / ">"); // tête strbuilder.append ("<th>" + obj.touppercase () + "Detail </th>"); strbuilder.append ("<th>" + obj.touppercase () + "Detail </th>"); strbuilder.append ("</s table>"); // Body strbuilder.append ("<tbody>"); for (String item: Content) {strbuilder.append ("<tr> <td>" + item + "</td> </tr>"); } strbuilder.append ("</tbody>"); strbuilder.append ("</s table>"); strbuilder.append ("<h3 style = /" text-align: droite; Font-weight: normal; / "> meilleurs souhaits </h3>"); strbuilder.append ("</ody> </html>"); strbuilder.append ("</ody> </html>"); strbuilder.append ("</ody> </html>"); strbuilder.append ("</ody> </html>"); Log.info (strBuilder.ToString ()); helper.setText (strbuilder.toString (), true); } catch (exception e) {log.Error ("Erreur Sendhtmlmail:", e); } MailSender.Send (msg); }}
Ce qui précède consiste à résumer la fonction de messagerie dans une classe de service. Lorsque vous l'utilisez, vous n'avez qu'à injecter la classe actuelle et à l'appeler directement. Ce qui précède résume deux méthodes: l'une est un e-mail simple, et l'autre est un e-mail avec une table HTML. Si vous avez besoin d'envoyer des pièces jointes, vous devez mettre les pièces jointes dans MIMEMESSAGEHELPER (appelée AddAttachment ("nom de fichier", fichier)). Parce qu'il n'y a pas d'exigence réelle ici, elle est omise. D'accord, la fonction d'e-mail d'envoi a été remplie. Voyons l'effet réel ici:
La fonction de messagerie a été mise en œuvre. Je vais maintenant parler de la fonction de compression de fichiers. Il existe environ quatre types d'implémentations de fonctions de compression, à savoir:
A> Utilisez la compression de l'API fournie par java.util.zip
B> Utilisez la compression de l'API fournie par le package Ant d'Apache (org.apache.tools.ant.taskdefs.zip)
C> Utiliser la compression de l'API fournie par Zip4j (net.lingala.zip4j)
D> Appelez la compression de la commande shell de l'hôte
Il y a trois problèmes qui doivent être mentionnés ici:
A> Email ordinaire Code brouillé chinois compressé (non pris en charge en chinois)
B> ne peut pas décompresser après la compression (erreur de décompression)
C> Problème d'ajouter des mots de passe compressés pour la compression de fichiers
La fonction de compression a été développée. Les trois points ci-dessus sont particulièrement gênants pour les novices. Ici, je partagerai les problèmes que j'ai rencontrés dans le développement de la fonction de compression auparavant.
En utilisant la compression fournie par le package Java.util natif, si le fichier compressé est utilisé en chinois, il sera brouillé (il serait un bogue dans JDK), et le code implémenté par la compression est relativement complexe (en particulier la définition de mots de passe), en particulier pour la compression et la compression multi-fichiers multi-répertoires.
Bien que l'utilisation de l'outil zip fourni par Apache évite les problèmes ci-dessus, il convient de noter que ce package de fourmis entre en conflit avec WebLogic (une erreur sera signalée pendant le déploiement) et ne peut pas compresser le mot de passe. Si vous utilisez WebLogic au lieu de Tomocat, vous devez prêter attention à ce problème.
L'utilisation de Java pour appeler la commande shell de l'hôte est également un bon choix, mais il nécessite des commandes de shell d'écriture. Il n'est pas très convivial de déployer sur la plate-forme Windows, et le portage est plus gênant.
Enfin, pour les problèmes ci-dessus, je recommande ZIP4J ici. Ce qui suit est également une explication de la mise en œuvre de la compression de Zip4j.
Tout d'abord, vous devez introduire des packages de dépendance:
<! - Compression: prise en charge de la compression du chiffrement -> <dependency> <proupId> net.lingala.zip4j </prôdId> <ArtefactId> zip4j </retifactid> <version> 1.3.2 </ version> </Dependance>
De plus, encapsulez une classe d'outils de compression / décompression pour une utilisation facile:
import net.lingala.zip4j.core.zipfile; import net.lingala.zip4j.exception.zipexception; import net.lingala.zip4j.model.zipparameters; import net.lingala.zip4j.util.zip4jconstants; import org.springframework.util.stringUls; java.io.file; / ** * Cette classe d'outils utilise Zip4j pour la compression et la décompression * / classe publique Ziputil {// Déclare l'objet compressé paramètres zipparameters statiques privés; // Décompressez l'objet de fichier privé statique zipfile zipfile; / ** * * @param sourceFilePath le chemin du fichier compressé (fichier unique, dossier) * @param zipfilepath Fichier compressé Chemin de fichier * @param mot de passe compressé * @return compressé avec succès: true, compression a échoué: false * / public static mot de passe) {paramètres de la chaîne = new zipparaMers (); Paramètres.SetCompressionMethod (zip4jconstants.comp_deflate); // Méthode de compression (méthode par défaut) Paramètres.SetCompressionLevel (zip4jconstants.deflate_level_normal); // Niveau de compression (niveau par défaut) // Paramètres de cryptage de compression if (! StringUtils.isempty (mot de passe)) {Paramètres.SetCryptFiles (true); // s'il faut définir le cryptage de fichiers (par défaut est non) Paramètres.SetCryptionMethod (zip4jconstants.enc_method_standard); // Méthode de chiffrement (voici la compression standard) Paramètres.SetPassword (mot de passe.toCharArray ()); } essayez {zipfile zipfile = new ZipFile (zipFilePath); // S'il s'agit d'un fichier, compressez-le directement. S'il s'agit d'un dossier, traversez les fichiers et compressez-les tous if (nouveau fichier (sourceFilePath) .isfile ()) {zipfile.setFileNameCaSet ("gbk"); zipfile.addfile (nouveau fichier (sourceFilePath), paramètres); Retour Vrai; } // file ff = new File (sourceFilePath); File [] flst = nouveau fichier (sourceFilePath) .ListFiles (); System.out.println ("Nombre de fichiers =>" + flst.length); pour (fichier f: flST) {zipfile.setFileNameChaRset ("gbk"); zipfile.addfile (f, paramètres); } return true; } catch (zipException e) {e.printStackTrace (); retourne false; } catch (exception id) {id.printStackTrace (); retourne false; }} public static boolean unzip (string zipfile, string unzipdir) {try {ziputil.zipfile = new ZipFile (zipfile); Ziputil.zipfile.setFileNameCaSetSet ("gbk"); // Définissez le format de codage // Utilisez la méthode intégrée pour vérifier si le fichier zip est légal, y compris si le fichier existe, qu'il s'agisse d'un fichier zip ZipException ("Le fichier est illégal ou n'existe pas"); } // Par rapport à la propre intégration de Java, le chemin de fichier sera généré automatiquement sans juger ziputil.zipfile.extractall (unzipdir); Retour Vrai; } catch (zipException e) {return false; }}} La méthode de compression ci-dessus est livrée avec la fonction de compression de mot de passe, qui peut compresser des fichiers uniques ou des fichiers de répertoire. Par rapport à la mise en œuvre native, il est beaucoup rafraîchissant tout d'un coup. La seule chose à noter ici est que le fichier cible compressé ne doit pas être pénétré avant la compression, sinon une erreur sera signalée! De plus, lors de la décompression, vous devez prêter attention au codage des fichiers et déterminer si le fichier existe.
Résumer
Ce qui précède est la mise en œuvre de Springboot de l'ajout de fonctions d'envoi et de compression des e-mails que l'éditeur vous a introduits. J'espère que cela vous sera utile. Si vous avez des questions, laissez-moi un message. L'éditeur vous répondra à temps!