Desta vez, falei apenas sobre a função de envio de email, mas tinha medo da falta de conteúdo, então adicionei algumas explicações da função de compactação de arquivos.
Primeiro, o email é enviado. A função de email possui dependências correspondentes no Springboot. Esse:
<Depencency> <PuerpId> org.springframework.boot </frugiD> <Artifactid> Spring-boot-Starter-Mail
O desenvolvimento da função de email é bastante simples no Springboot. Aqui vou resumir o conteúdo do desenvolvimento:
A> Adicionar pacote de dependência
B> Configure os parâmetros básicos do correio (em YMAL ou propriedade)
C> Injete Javamailsender em serviço e chamar métodos relevantes
No entanto, pode haver um problema aqui, ou seja, quando o servidor específico é implantado, o servidor bloqueará a porta de serviço de email e os problemas de segurança de email comuns. Vou dar uma solução ao explicar aqui.
Primeiro, você precisa apresentar o componente de email no Pom.xml do projeto. A versão componente precisa corresponder à versão Springboot (você não pode escrevê -la, eu omito aqui):
<Depencency> <PuerpId> org.springframework.boot </frugiD> <Artifactid> Spring-boot-Starter-Mail
Em seguida, é configurar os parâmetros básicos do email no arquivo de configuração:
spring: mail: host: smtp.exmail.qq.com username: [email protected] password: Password default-encoding: UTF-8 ssl: trust: smtp.exmail.qq.com properties: mail: smtp: auth: true #Does authentication need socketFactory: class: javax.net.ssl.SSLSocketFactory #SSL certificate Socket factory port: 465 #Use Smtp465 Port
Ao configurar os parâmetros, você deve prestar atenção ao recuo, porque eu dou formato de configuração da YAML. Se for uma configuração de propriedade, é aproximadamente assim (exemplo): spring.mail.host:smtp.exmail.qq.com. Cada criança está em um formato completo. No início, omiti a configuração abaixo do item de propriedades (sério, SSL, porta). Mais tarde, descobri que o servidor bloqueou a 25ª porta do correio, por isso é possível localmente, mas não funciona no servidor, por isso precisa especificar a porta do serviço de correio para 465. Estou usando uma caixa de correio QQ aqui. Se estiver usando 163 ou outras caixas de correio, você precisa verificar as portas suportadas pelo provedor de serviços sozinho. Quanto aos problemas de segurança por email, dois precisam ser declarados aqui, um é o SSL Trust e a fábrica de correio. Para detalhes, consulte a seção vermelha acima. A configuração acima é válida apenas para caixas de correio QQ e não garante que outras caixas de correio também sejam aplicáveis.
OK, a configuração é concluída, aqui começamos a escrever a classe de implementação específica:
importar xxx.common.util.dateUtil; importar org.apache.commons.lang3.stringutils; importar org.slf4j.logger; importar org.slf4j.anggerFactory; importação org.springframework.beanS.anTation.aUTow; importest; org.springframework.mail.simplemailMessage; importar org.springframework.mail.javamail.javamailsender; importar org.springframework.mail.javamail.mimemessageHelper; ImmportmemMeMMATMEMMAIMPEMMAIM; REMEMMAIMIMIMEstRIEN; Immign; ImmportmemMeMeMMAIM; java.util.date; importar java.util.list; importar java.util.map; @ServicePublic Class MailService {private estático Logger final = loggerFactory.getLogger (MailService.class); @Value ("$ {spring.mail.username}") private string send_user_addr; @Autowired Private Javamailsender Mailsender; /*** Envie um e -mail simples* @param receptor* @param obj Enviar tópico* @param Conteúdo do conteúdo do e -mail*/public void SendSimpleMail (string receba, string obj, string content) {if (! StringUtils.isnotblank (content) ||!!! message.setFrom (send_user_addr); if (recebe.contains (";")) message.Setto (receba.split (";")); else message.setTo (recebimento); message.SetSubject (OBJ); message.settext (content); tente {MailSender.send (mensagem); Log.info ("Mail simples envie sucesso!"); } catch (Exceção e) {Log.error ("Erro de envio de sinplemail!", e); }} private stringbuilder strbuilder; / *** O formulário de envio da lista HTML Mail Multi-List* @param recebe receptor* @param obj envia tópico (tópico)* @param Conteúdo Conteúdo do e-mail conteúdo*/ public void sendHtmlmailByList (string retutil.isnotBlank <pap> content) {if (content.isempty () ||! Mimemessage msg = MailSender.Createmimemessage (); tente {MimemessageHelper Helper = new MimemessageHelper (MSG, True, "UTF-8"); // Resolva o problema Helper.setFrom (send_user_addr); if (recebe.contains (";")) helper.setto (receba.split (";")); else helper.setto (recebimento); Helper.SetSubject (OBJ); strbuilder = new StringBuilder (); strbuilder.append ("<! Doctype html> <html> <head> <meta http-equiv =/" content-type/"content =/" text/html; charset = utf-8/"> </wead> <estilo de corpo =/" encadeamento: 3% 2%/">"); strbuilder.append ("<H2> Esta mensagem é enviada automaticamente ao sistema. </h2>"); strbuilder.append ("<H2> Enviar data por" +dateUtil.getDateFormat (new Date (), dateUtil.dateTime_default_format) +"</h2>"); strbuilder.append ("<H2> a seguir estão os detalhes: </h2>"); strbuilder.append ("<tabela borda =/" 2px vermelho sólido/"largura =/" 100%/">"); // cabeça 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.Lengen; i ++) strbuilder.append ("<th>"+st [i]+"</th>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); // body strbuilder.append ("<tbody>"); para (Item do mapa: conteúdo) {strbuilder.append ("<tr>"); for (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/"> best votos </h3>"); strbuilder.append ("</body> </html>"); //Log.info (strbuilder.toString ()); helper.Settext (strbuilder.toString (), true); } catch (Exceção e) {Log.error ("SendHtmlmail Erro:", e); } MailSender.send (msg); } / *** Enviar formulário de registro de coluna única HTML* @param receptor* @param obj envia tópico (título)* @param conteúdo email Conteúdo* / public void sendHtmlmailByitem (string recepj) obj, list <brin> content) {if (content.isempty () ||!! Mimemessage msg = MailSender.Createmimemessage (); tente {MimemessageHelper Helper = new MimemessageHelper (MSG, True, "UTF-8"); // Resolva o problema Helper.setFrom (send_user_addr); if (recebe.contains (";")) helper.setto (receba.split (";")); else helper.setto (recebimento); Helper.SetSubject (OBJ); strbuilder = new StringBuilder (); strbuilder.append ("<! Doctype html> <html> <head> <meta http-equiv =/" content-type/"content =/" text/html; charset = utf-8/"> </wead> <estilo de corpo =/" encadeamento: 3% 2%/">"); strbuilder.append ("<H3> Esta mensagem é enviada automaticamente ao sistema. </h3>"); strbuilder.Append ("<H3> Enviar data por" +dateUtil.getDateFormat (new Date (), dateUtil.dateTime_default_format) +"</h3>"); strbuilder.append ("<H3> A seguir, são apresentados os detalhes: </h3>"); strbuilder.append ("<tabela borda =/" 2px vermelho sólido/"largura =/" 100%/">"); // cabeça strbuilder.append ("<borda da tabela =/" 2px vermelho sólido/"largura =/" 100%/">"); // cabeça strbuilder.append ("<th>"+obj.toupppercase ()+"detalhe </th>"); strbuilder.append ("<th>"+obj.touppercase ()+"detalhe </th>"); strbuilder.append ("</ table>"); // body strbuilder.append ("<tbody>"); para (string item: content) {strbuilder.append ("<tr> <t>"+item+"</td> </tr>"); } strbuilder.append ("</tbody>"); strbuilder.append ("</ table>"); strbuilder.append ("<h3 style =/" text-align: direita; font-weight: normal;/"> os melhores desejos </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 (Exceção e) {Log.error ("SendHtmlmail Erro:", e); } MailSender.send (msg); }}
O exposto acima é encapsular a função de email em uma classe de serviço. Ao usá -lo, você só precisa injetar a classe atual e chamá -la diretamente. O acima encapsula dois métodos: um é o envio de email simples e o outro é um email com uma tabela HTML. Se você precisar enviar anexos, precisará colocar os anexos no método MimemessageHelper (chamado Addattachment ("Nome do arquivo", arquivo)). Como não há requisito real aqui, ele é omitido. Ok, a função de envio de email foi concluída. Vamos ver o efeito real aqui:
A função de email foi implementada. Agora vou falar sobre a função de compactação do arquivo. Existem aproximadamente quatro tipos de implementações da função de compressão, a saber:
A> Use a compressão da API fornecida por java.util.zip
B> Use a compactação da API fornecida pelo pacote Ant da Apache (org.apache.tools.ant.taskdefs.zip)
C> Use a compressão da API fornecida por zip4j (net.lingala.zip4j)
D> Chame a compactação do comando Shell do host
Há três questões que precisam ser mencionadas aqui:
Um e -mail comum em e -mail comprimido Código Grilhado Chinesa (não suportado em chinês)
B> não pode descomprimir após a compressão (erro de descompressão)
C> Problema de adicionar senhas compactadas para compactação de arquivo
A função de compressão foi realmente desenvolvida. Os três pontos acima são particularmente problemáticos para os iniciantes. Aqui vou compartilhar os problemas que encontrei no desenvolvimento da função de compressão antes.
Usando a compactação fornecida pelo pacote nativo java.util, se o arquivo compactado for usado em chinês, ele será iluminado (é considerado um bug no JDK), e o código implementado pela compressão é relativamente complexo (especialmente para definir senhas), especialmente para compressão cruzada e compressão multi-arquivo.
Embora o uso da ferramenta ZIP fornecida pelo Apache evite os problemas acima, deve -se notar que esse pacote de formigas entra em conflito com o WebLogic (um erro será relatado durante a implantação) e não pode comprimir a senha. Se você estiver usando o WebLogic em vez do Tomocat, deve prestar atenção a esse problema.
Usar Java para chamar o comando Shell do host também é uma boa escolha, mas requer a gravação de comandos do shell. Não é muito amigável implantar na plataforma do Windows, e a porte é mais problemática.
Finalmente, para as edições acima, recomendo o ZIP4J aqui. O seguinte também é uma explicação da implementação de compressão do ZIP4J.
Primeiro, você precisa introduzir pacotes de dependência:
<!-Compressão: Suporte para Compressão de Criptografia-> <Ependency> <GroupId> net.lingala.zip4j </groupid> <stifactId> zip4j </stifactId> <versão> 1.3.2 </version> </pendence>
Além disso, encapsular uma classe de ferramentas de compressão/descompressão para facilitar o uso:
importação net.lingala.zip4j.core.zipfile; importação net.lingala.zip4j.exception.ziPexception; importação net.lingala.zip4j.model.zipparameters; importação net.lingala.zip4j.util.zip4jConstants; importação; java.io.file;/*** Esta classe de ferramenta usa o ZIP4J para compactação e descompressão*/classe pública ziputil {// declara o objeto compactado parâmetros de zipparameter privado; // descompacte o objeto de arquivo privado estático zipfile zipfile; / ** * * @param SourceFilePath o caminho do arquivo compactado (arquivo único, pasta) * @param zipFilePath File File Path * @param senha senha compactada * @return compacted «true, strumethethathil falhou: false */ public static boolean singlefilecompress (strumfilepathathhil, zipFilEp: zipFileT: zipFil. parameters.setCompressionMethod (zip4jConstants.comp_deflate); // Método de compressão (método padrão) parâmetros.SetCompressionLEvel (zip4jConstants.deflate_Level_Normal); // Nível de compressão (nível padrão) // Configurações de criptografia de compressão if (! StringUtils.isEmpty (senha)) {parameters.setEncryptFiles (true); // se deve definir a criptografia de arquivo (padrão é não) parâmetros.setEncryptionMethod (zip4jConstants.ENC_METHOD_STANDARD); // Método de criptografia (aqui está parâmetros de compactação padrão ).SetPassword (senha.toCharArray ()); } tente {zipfile zipfile = new ZipFile (zipFilePath); // Se for um arquivo, compacte -o diretamente. Se for uma pasta, atravesse os arquivos e compacte todos eles se (novo arquivo (fonteFilePath) .isfile ()) {zipfile.setFilenameCharSet ("gbk"); zipfile.addfile (novo arquivo (fonteFilePath), parâmetros); retornar true; } // arquivo ff = novo arquivo (fonteFilePath); Arquivo [] flst = novo arquivo (fonteFilePath) .ListFiles (); System.out.println ("Número de arquivos =>"+flst.length); para (arquivo f: flst) {zipfile.setFilenameCharSet ("gbk"); zipfile.addfile (f, parâmetros); } retornar true; } catch (zipexception e) {e.printStackTrace (); retornar falso; } catch (Exception ID) {id.printStackTrace (); retornar falso; }} public static boolean Unzip (string zipfile, string unzipdir) {try {ziputil.zipfile = new ZipFile (zipfile); Ziputil.zipfile.setFilenameCharset ("gbk"); // Defina o formato de codificação // use o método interno para verificar se o arquivo zip é legal, incluindo se o arquivo existe, seja um arquivo zip), se é um arquivo zip, seja uma corrupção, etc. se (! Zipexception ("O arquivo é ilegal ou não existe"); } // Comparado com o próprio Java, o caminho do arquivo será gerado automaticamente sem julgar o ziputil.zipfile.extractall (UNZIPDIR); retornar true; } catch (zipexception e) {return false; }}} O método de compactação acima vem com a função de compactação de senha, que pode comprimir arquivos únicos ou arquivos de diretório. Comparado com a implementação nativa, é muito refrescante de repente. A única coisa a ser observada aqui é que o arquivo de destino compactado não deve ser penetrado antes da compressão, caso contrário, um erro será relatado! Além disso, ao descomprimir, você deve prestar atenção à codificação de arquivos e determinar se o arquivo existe.
Resumir
O exposto acima é a implementação do Springboot da adição de funções de envio e compactação de email que o editor apresentou a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a você a tempo!