Esta vez solo hablé sobre la función de envío de correo electrónico, pero tenía miedo de la falta de contenido, así que agregué algunas explicaciones de la función de compresión de archivos.
Primero, se envía el correo electrónico. La función de correo electrónico tiene dependencias correspondientes en SpringBoot. Este:
<Spendency> <MoupRoMID> org.springframework.boot </groupid> <artifactId> spring-boot starter-mail </arfactid> </pendency>
El desarrollo de la función de correo electrónico es bastante simple en Springboot. Aquí resumiré el contenido de desarrollo:
A> Agregar paquete de dependencia
B> Configurar los parámetros básicos del correo (en YMal o propiedad)
C> inyectar Javamailsender al servicio y llamar a los métodos relevantes
Sin embargo, puede haber un problema aquí, es decir, cuando se implementa el servidor específico, el servidor bloqueará el puerto de servicio de correo electrónico y los problemas ordinarios de seguridad de correo electrónico. Daré una solución al explicar aquí.
Primero, debe presentar el componente de correo electrónico en el pom.xml del proyecto. La versión del componente debe corresponder a la versión SpringBoot (no puede escribirla, la omito aquí):
<Spendency> <MoupRoMID> org.springframework.boot </groupid> <artifactId> spring-boot starter-mail </arfactid> </pendency>
Lo siguiente es configurar los parámetros básicos del correo electrónico en el archivo de configuración:
Primavera: Correo: Host: Smtp.exmail.qq.com Nombre de usuario: [email protected] Contraseña: Contraseña predeterminada: Ecodificación: UTF-8 SSL: fideicomiso: fideicomiso: smtp.exmail.qq.com Propiedades: correo: smtp: autenticación verdadera #DOES La autenticación necesita factory: class: javax.net.ssl.sslsocketsocketssl #ssl #ssl #ssl certificator socketory Puerto SMTP465
Al configurar los parámetros, debe prestar atención a la sangría, porque doy formato de configuración YAML. Si se trata de una configuración de propiedad, es más o menos así (ejemplo): spring.mail.host:smtp.exmail.qq.com. Cada niño está en un formato completo. Al principio, omití la configuración debajo del elemento de propiedades (grave, SSL, puerto). Más tarde, descubrí que el servidor bloqueó el puerto 25 del correo, por lo que es posible localmente, pero no funciona en el servidor, por lo que debe especificar que el puerto de servicio de correo sea 465. Estoy usando un buzón QQ aquí. Si usa 163 u otros buzones, debe verificar los puertos compatibles con el proveedor de servicios usted mismo. En cuanto a los problemas de seguridad por correo electrónico, dos deben declararse aquí, uno es SSL Trust y la fábrica de correo de Socket. Para más detalles, consulte la sección Roja anterior. La configuración anterior solo es válida para los buzones QQ, y no garantiza que otros buzones también sean aplicables.
Ok, la configuración se completa, aquí comenzamos a escribir la clase de implementación específica:
importar xxx.common.util.dateUtil; import org.apache.commons.lang3.stringutils; import org.slf4j.logger; import org.slf4j.loggerFactory; importar org.springframework.beans.factory.Annotation.aUtowired; import org.springframework.beans.beans.factory org. java.util.date; import java.util.list; import java.util.map; @ServicePublic Class MailService {Private estático Final Logger log = loggerFactory.getLogger (MailService.class); @Value ("$ {spring.mail.username}") cadena privada send_user_addr; @Autowired Javamailsender Mailsender de Javamailsender; /*** Enviar correo electrónico simple* @param Recibir el destinatario* @param obj Enviar tema* @param Content Correo electrónico Contenido*/public void sendsimplemail (string recibe, string obj, string content) {if (! StringUtils.isnotblank (content) || Message.setFrom (send_user_addr); if (recibir.contains (";")) Message.setto (recibe.split (";")); else Message.setto (recibir); Message.setsubject (obj); Message.settext (contenido); intente {Mailsender.send (mensaje); Log.info ("Simple envíe el éxito!"); } catch (Exception e) {log.error ("SendSimplemail Error!", E); }} private StringBuilder strBuilder; / *** El formulario de envío de html Mail Multi-List List* @param Recibe destinatario* @param obj Enviar tema (tema)* @param Content Content Content*/ public void sendhtmlmailByList (string recibe, string obj, list <s map> content) {if (content.isEmpty () || Mimemessage msg = mailsender.createMeMessage (); Pruebe {MimemessageHelper Helper = new MimemessageHelper (msg, true, "utf-8"); // Resolver el problema confuso helper.setFrom (send_user_addr); if (recibir.contains (";")) helper.setto (recibe.split (";")); else Helper.setto (recibir); helper.setsubject (obj); strBuilder = new StringBuilder (); strBuilder.Append ("<! DocType html> <html> <lEad> <meta http-oquiv =/" content-type/"content =/" text/html; charset = utf-8/"> </head> <body style =/" remo: 3% 2%;/">"); strBuilder.append ("<H2> Este mensaje se envía automáticamente al sistema. </h2>"); strBuilder.append ("<H2> Fecha de envío por" +dateUtil.getDateFormat (new Date (), dateUtil.datetime_default_format) +"</h2>"); strBuilder.append ("<H2> Los siguientes son los detalles: </h2>"); strBuilder.append ("<table border =/" 2px sólido rojo/"width =/" 100%/">"); // cabeza strbuilder.append ("<th>"+st [i]+"</th>"); strBuilder.append ("</tr>"); strBuilder.append ("</tr>"); Objeto [] st = content.get (0) .KeySet (). ToArray (); para (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>"); for (map item: content) {strBuilder.append ("<tr>"); para (objeto str: st) strBuilder.append ("<TD>"+item.get (str)+"</td>"); strBuilder.append ("</tr>"); } strBuilder.append ("</tbody>"); strBuilder.Append ("</table>"); strBuilder.Append ("</table>"); strBuilder.append ("<h3 style =/" text-align: right/"> Los mejores deseos </h3>"); strBuilder.append ("</body> </html>"); //Log.info (strBuilder.ToString ()); Helper.settext (strBuilder.ToString (), true); } catch (excepción e) {log.error ("SendHtmlMail Error:", e); } mailsender.send (msg); } / *** Enviar html formulario de registro de columna de una sola columna* @param Recibir el destinatario* @param obj enviar tema (título)* @param Content Correo electrónico Contenido* / public void sendhtmlmailByitem (string recibe, string obj, list <string> content) {if (content.isEmpty () || Mimemessage msg = mailsender.createMeMessage (); Pruebe {MimemessageHelper Helper = new MimemessageHelper (msg, true, "utf-8"); // Resolver el problema confuso helper.setFrom (send_user_addr); if (recibir.contains (";")) helper.setto (recibe.split (";")); else Helper.setto (recibir); helper.setsubject (obj); strBuilder = new StringBuilder (); strBuilder.Append ("<! DocType html> <html> <lEad> <meta http-oquiv =/" content-type/"content =/" text/html; charset = utf-8/"> </head> <body style =/" remo: 3% 2%;/">"); strBuilder.append ("<H3> Este mensaje se envía automáticamente al sistema. </h3>"); strBuilder.append ("<h3> Enviar fecha por" +dateUtil.getDateFormat (new Date (), dateUtil.datetime_default_format) +"</h3>"); strBuilder.append ("<H3> Los siguientes son los detalles: </h3>"); strBuilder.append ("<table border =/" 2px sólido rojo/"width =/" 100%/">"); // Head strBuilder.append ("<table border =/" 2px sólido rojo/"width =/" 100%/">"); // Head strBuilder.append ("<th>"+obj.touppercase ()+"detalle </th>"); strBuilder.append ("<th>"+obj.touppercase ()+"detalle </th>"); strBuilder.Append ("</table>"); // Body strBuilder.append ("<Tbody>"); for (string item: content) {strBuilder.append ("<tr> <td>"+item+"</td> </tr>"); } strBuilder.append ("</tbody>"); strBuilder.Append ("</table>"); strBuilder.append ("<h3 style =/" text-align: right; font-weight: normal;/"> mis mejores deseos </h3>"); strBuilder.append ("</body> </html>"); strBuilder.append ("</body> </html>"); strBuilder.append ("</body> </html>"); strBuilder.append ("</body> </html>"); Log.info (strBuilder.ToString ()); Helper.settext (strBuilder.ToString (), true); } catch (excepción e) {log.error ("SendHtmlmail Error:", e); } mailsender.send (msg); }}
Lo anterior es encapsular la función de correo electrónico en una clase de servicio. Al usarlo, solo necesita inyectar la clase actual y llamarla directamente. Lo anterior encapsula dos métodos: uno es un envío de correo electrónico simple y el otro es un correo electrónico con una tabla HTML. Si necesita enviar archivos adjuntos, debe colocar los archivos adjuntos en el método MimemessageHelper (llamado Addattachment ("Nombre de archivo", archivo)). Debido a que no hay un requisito real aquí, se omite. Bien, la función de envío de correo electrónico se ha completado. Veamos el efecto real aquí:
Se ha implementado la función de correo electrónico. Ahora hablaré sobre la función de compresión del archivo. Hay aproximadamente cuatro tipos de implementaciones de funciones de compresión, a saber:
A> usar la compresión API proporcionada por java.util.zip
B> Use la compresión API proporcionada por el paquete Ant de Apache (org.apache.tools.ant.taskdefs.zip)
C> Use la compresión API proporcionada por ZIP4J (net.lingala.zip4j)
D> Llame a la compresión del comando shell del host
Hay tres problemas que deben mencionarse aquí:
Un código de confusión chino comprimido por correo electrónico ordinario (no compatible en chino)
B> no se puede descomprimir después de la compresión (error de descompresión)
C> problema de agregar contraseñas comprimidas para la compresión del archivo
La función de compresión realmente se ha desarrollado. Los tres puntos anteriores son particularmente problemáticos para los novatos. Aquí compartiré los problemas que encontré en el desarrollo de la función de compresión antes.
Utilizando la compresión proporcionada por el paquete nativo de java.util, si el archivo comprimido se usa en chino, se verá confuso (se dice que es un error en JDK), y el código implementado por la compresión es relativamente complejo (especialmente configurar contraseñas), especialmente para la compresión directora transversal y la compresión multifile.
Aunque el uso de la herramienta ZIP proporcionada por Apache evita los problemas anteriores, debe tenerse en cuenta que este paquete de hormigas entra en conflicto con WebLogic (se informará un error durante la implementación) y no puede comprimir la contraseña. Si está utilizando WebLogic en lugar de Tomocat, debe prestar atención a este problema.
Usar Java para llamar al comando shell del host también es una buena opción, pero requiere escribir comandos de shell. No es muy amigable implementar en la plataforma de Windows, y Porting es más problemático.
Finalmente, para los problemas anteriores, recomiendo Zip4J aquí. La siguiente es también una explicación de la implementación de compresión de ZIP4J.
Primero, debe introducir paquetes de dependencia:
<
Además, encapsula una clase de herramienta de compresión/descompresión para su uso fácil:
importar net.lingala.zip4j.core.zipfile; import net.lingala.zip4j.exception.zipexception; import net.lingala.zip4j.model.zipparameters; import net.lingala.zip4j.util.zip4jconstants; import og.springframeWork.utililia; java.io.file;/*** Esta clase de herramientas usa ZIP4J para compresión y descompresión*/public class Ziputil {// Declarar el objeto comprimido Private Static Zipparameters Parámetros; // descompresión de archivo objeto privado static zipfile zipfile; / ** * * @param SourceFilePath La ruta del archivo comprimido (archivo único, carpeta) * @param zipfilepath ruta de archivo comprimido * @param contraseña contraseña comprimida * @return comprimido correctamente: true, compresión fallida: false */ public static singleanfileComPress (string SourceFilePath, string ZipfilePath Carry Zipparameters (); parámetros.setCompressionMethod (zip4jconstants.comp_deflate); // Método de compresión (método predeterminado) Parámetros.setCompressionLevel (zip4jconstants.deflate_level_normal); // Nivel de compresión (nivel predeterminado) // Configuración de cifrado de compresión if (! StringUtils.isEmpty (contraseña)) {parameters.setEntryptFiles (true); // si se establece el cifrado de archivo (predeterminado es no) parámetros.setEnrryptionMethod (zip4jconstants.enc_method_standard); // Método de cifrado (aquí es compresión estándar) Parameters.setPassword (contraseña.toCarArray ()); } try {zipfile zipfile = new ZipFile (ZipFilePath); // Si es un archivo, comprimirlo directamente. Si se trata de una carpeta, atraviese los archivos y los comprime todos if (new File (SourceFilePath) .ISFILE ()) {ZIPFILE.SETFILENAMECHARSET ("GBK"); ZipFile.AddFile (nuevo archivo (SourceFilePath), parámetros); devolver verdadero; } // archivo ff = nuevo archivo (fuenteFilePath); Archivo [] flst = nuevo archivo (SourceFilePath) .ListFiles (); System.out.println ("número de archivos =>"+flst.length); for (archivo f: flst) {zipfile.setFileNAMECHARSET ("GBK"); zipfile.addfile (f, parámetros); } return verdadero; } catch (ZipException e) {E.PrintStackTrace (); devolver falso; } catch (ID de excepción) {id.printStackTrace (); devolver falso; }} public static boolean unzip (string zipfile, string unzipdir) {try {ziputil.zipfile = new zipfile (zipfile); Ziputil.zipfile.setFileNameCharSet ("gbk"); // Establezca el formato de codificación // Use el método incorporado para verificar si el archivo zip es legal, incluido si el archivo existe, si es un archivo zip, si es un archivo zip, si es una corrupción, etc. si (! Ziputil.zipfile.isvalidzipfile () {) {throLle {throL ZipException ("El archivo es ilegal o no existe"); } // En comparación con la propia ruta incorporada de Java, la ruta del archivo se generará automáticamente sin juzgar ziputil.zipfile.extractall (unzipdir); devolver verdadero; } catch (ZipException e) {return false; }}} El método de compresión anterior viene con la función de compresión de contraseña, que puede comprimir archivos únicos o archivos de directorio. En comparación con la implementación nativa, es muy refrescante de repente. Lo único que se debe tener en cuenta aquí es que el archivo de destino comprimido no debe ser penetrado antes de la compresión, ¡de lo contrario se informará un error! Además, al descomprimir, debe prestar atención a la codificación del archivo y determinar si el archivo existe.
Resumir
Lo anterior es la implementación de SpringBoot de agregar funciones de envío y compresión de correo electrónico que el editor le presentó. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje. ¡El editor le responderá a tiempo!