Kali ini saya hanya berbicara tentang fungsi pengiriman email, tetapi saya takut kurangnya konten, jadi saya menambahkan beberapa penjelasan fungsi kompresi file.
Pertama, email dikirim. Fungsi email memiliki dependensi yang sesuai di Springboot. Ini:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-mail </artifactid> </dependency>
Pengembangan fungsi email cukup sederhana di Springboot. Di sini saya akan merangkum konten pengembangan:
A> Tambahkan paket ketergantungan
B> Konfigurasikan parameter dasar surat (di YMAL atau properti)
C> menyuntikkan javamailsender ke dalam layanan dan memanggil metode yang relevan
Namun, mungkin ada masalah di sini, yaitu, ketika server spesifik digunakan, server akan memblokir port layanan email dan masalah keamanan email biasa. Saya akan memberikan solusi saat menjelaskan di sini.
Pertama, Anda perlu memperkenalkan komponen email di pom.xml proyek. Versi komponen harus sesuai dengan versi springboot (Anda tidak dapat menulisnya, saya menghilangkannya di sini):
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-mail </artifactid> </dependency>
Berikutnya adalah mengonfigurasi parameter dasar email dalam file konfigurasi:
Spring: Mail: Host: smtp.exmail.qq.com Nama pengguna: [email protected] Kata sandi: kata sandi default-enkode: UTF-8 SSL: Kepercayaan: smtp.exmail.qq.com Properti: Mail: SMTP: AUTH: TRUE #DOES AUTENTIKASI PERLUTFACTORY: CLASS: JAVAX.NETPOCE #DOESSOK.NETSLE PERLUKNYA SOCKETFACTORY: CLASS: JAVAX. Navax. Navax. Navax. Navax.NEAT.NEAT.NETSOPORY.NETSOCORY. Port Pabrik: 465 #Eing SMTP465 Port
Saat mengkonfigurasi parameter, Anda harus memperhatikan indentasi, karena saya memberikan format konfigurasi YAML. Jika ini adalah konfigurasi properti, kira -kira seperti ini (contoh): spring.mail.host:smtp.exmail.qq.com. Setiap anak dalam format lengkap. Pada awalnya, saya menghilangkan konfigurasi di bawah item Properties (Serious, SSL, Port). Kemudian, saya menemukan bahwa server memblokir port ke -25 surat, jadi itu mungkin secara lokal tetapi tidak berfungsi di server, jadi perlu menentukan port layanan surat menjadi 465. Saya menggunakan kotak surat QQ di sini. Jika menggunakan 163 atau kotak surat lainnya, Anda perlu memeriksa port yang didukung oleh penyedia layanan sendiri. Adapun masalah keamanan email, dua perlu dinyatakan di sini, satu adalah SSL Trust dan Socket Factory of Mail. Untuk detailnya, silakan lihat bagian merah di atas. Konfigurasi di atas hanya berlaku untuk kotak surat QQ, dan tidak menjamin bahwa kotak surat lain juga berlaku.
OK, konfigurasi selesai, di sini kita mulai menulis kelas implementasi spesifik:
impor xxx.common.util.dateutil; impor org.apache.commons.lang3.stringutils; impor org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.bean.factory.annotation.autoWirired; org.springframework.beans.factory.annotation.value; impor org.springframework.mail.simplemailMessage; impor org.springframework.mail.javamail.jamailsender; impor org.springframework.mail.javamail org.springframework.stereotype.Service;import javax.mail.internet.MimeMessage;import java.util.Date;import java.util.List;import java.util.Map;@Servicepublic class MailService { private static final Logger LOG = LoggerFactory.getLogger(MailService.class); @Value ("$ {spring.mail.username}") Private String send_user_addr; @Autowired Private Javamailsender Mailsender; /*** Kirim email sederhana* @param menerima penerima* @param obj kirim topik* @param konten konten email*/public void mengirimImplemail (string terima, string obj, konten string) {if (! Stringutils.isnotblank (konten) ||! Stringutils.isnotblank (terima) kembali) kembali; tidak ada surat; konten) || !!! message.setFrom (send_user_addr); if (recequent.contains (";")) message.setto (recept.split (";")); lain pesan.setto (terima); message.setsubject (OBJ); message.setText (konten); coba {mailsender.send (pesan); Log.info ("Simple Mail Send Success!"); } catch (Exception e) {log.error ("SendSimplemail error!", e); }} Private StringBuilder Strbuilder; / *** Bentuk pengiriman HTML Mail Multi-List List* @param menerima penerima* @param obj kirim topik (topik)* @param konten konten konten*/ public void sendHtmlmailbylist (string menerima, string obj, daftar <pap> konten) {if (content.isempty () ||! String.isnot; Mimemessage msg = mailsender.createMimemessage (); coba {mimemessageHelper helper = mimemessageHelper baru (msg, true, "utf-8"); // Selesaikan helper masalah yang kacau.setFrom (send_user_addr); if (recept.contains (";")) helper.setto (recept.split (";")); lain helper.setto (terima); helper.setsubject (OBJ); strbuilder = stringBuilder baru (); strbuilder.append ("<! Doctype html> <html> <head> <meta http-equiv =/" tipe konten/"content =/" text/html; charset = utf-8/"> </head> <body style =/" padding: 3% 2%;/">"); strbuilder.append ("<h2> pesan ini secara otomatis dikirim ke sistem. </h2>"); strbuilder.append ("<h2> kirim tanggal oleh" +dateutil.getDateFormat (tanggal baru (), dateutil.dateTime_default_format) +"</h2>"); strbuilder.append ("<H2> Berikut ini adalah detailnya: </h2>"); strbuilder.append ("<tabel border =/" 2px solid red/"width =/" 100%/">"); // head strbuilder.Append ("<t th>"+st [i]+"</th>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); Objek [] st = content.get (0) .keyset (). ToArray (); untuk (int i = 0; i <st.length; i ++) strbuilder.append ("<t th>"+st [i]+"</th>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); strbuilder.append ("</tr>"); // body strbuilder.append ("<tbody>"); untuk (item peta: konten) {strbuilder.append ("<tr>"); untuk (objek str: st) strbuilder.append ("<td>"+item.get (str)+"</td>"); strbuilder.append ("</tr>"); } strbuilder.append ("</tbody>"); strbuilder.append ("</able>"); strbuilder.append ("</able>"); strbuilder.append ("<h3 style =/" text-align: kanan/"> semoga terbaik </h3>"); strbuilder.append ("</body> </html>"); //Log.info (strbuilder.tostring ()); helper.setText (strbuilder.tostring (), true); } catch (Exception e) {log.Error ("SendHtMlMail error:", e); } mailsender.send (msg); } / *** Kirim HTML Mail Formulir Catatan Kolom Tunggal* @param menerima penerima* @param obj Kirim topik (judul)* @param konten konten Konten* / public void sendHtmlmailbyitem (string terima, string obj, daftar <string> konten) {if (content.isempty () ||! Stringutils.isnotblank (recepe) {if) | Mimemessage msg = mailsender.createMimemessage (); coba {mimemessageHelper helper = mimemessageHelper baru (msg, true, "utf-8"); // Selesaikan helper masalah yang kacau.setFrom (send_user_addr); if (recept.contains (";")) helper.setto (recept.split (";")); lain helper.setto (terima); helper.setsubject (OBJ); strbuilder = stringBuilder baru (); strbuilder.append ("<! Doctype html> <html> <head> <meta http-equiv =/" tipe konten/"content =/" text/html; charset = utf-8/"> </head> <body style =/" padding: 3% 2%;/">"); strbuilder.append ("<h3> Pesan ini secara otomatis dikirim ke sistem. </h3>"); strbuilder.append ("<h3> kirim tanggal oleh" +dateutil.getDateFormat (tanggal baru (), dateutil.datetime_default_format) +"</h3>"); strbuilder.append ("<h3> Berikut ini adalah detailnya: </h3>"); strbuilder.append ("<tabel border =/" 2px solid red/"width =/" 100%/">"); // head strbuilder.append ("<tabel border =/" 2px solid red/"width =/" 100%/">"); // head strbuilder.append ("<t th>"+obj.touppercase ()+"detail </t>"); strbuilder.append ("<t th>"+obj.touppercase ()+"detail </th>"); strbuilder.append ("</able>"); // body strbuilder.append ("<tbody>"); untuk (item string: konten) {strbuilder.append ("<tr> <td>"+item+"</td> </tr>"); } strbuilder.append ("</tbody>"); strbuilder.append ("</able>"); strbuilder.append ("<h3 style =/" text-align: kanan; font-weight: normal;/"> semoga terbaik </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 (Exception e) {log.Error ("SendHtMlMail error:", e); } mailsender.send (msg); }}
Di atas adalah merangkum fungsi email ke dalam kelas layanan. Saat menggunakannya, Anda hanya perlu menyuntikkan kelas saat ini dan memanggilnya secara langsung. Di atas merangkum dua metode: satu adalah pengiriman email sederhana, dan yang lainnya adalah email dengan tabel HTML. Jika Anda perlu mengirim lampiran, Anda harus memasukkan lampiran ke dalam metode MimemessageHelper (disebut addAttachment ("nama file", file)). Karena tidak ada persyaratan aktual di sini, itu dihilangkan. Oke, fungsi pengiriman email telah selesai. Mari kita lihat efek sebenarnya di sini:
Fungsi email telah diimplementasikan. Sekarang saya akan berbicara tentang fungsi kompresi file. Ada sekitar empat jenis implementasi fungsi kompresi, yaitu:
A> Gunakan kompresi API yang disediakan oleh java.util.zip
B> Gunakan kompresi API yang disediakan oleh paket semut Apache (org.apache.tools.ant.taskdefs.zip)
C> Gunakan kompresi API yang disediakan oleh Zip4j (net.lingala.zip4j)
D> Panggil Kompresi Perintah Shell dari Host
Ada tiga masalah yang perlu disebutkan di sini:
A> Email biasa terkompresi Kode Kelahiran Cina (tidak didukung dalam bahasa Cina)
B> tidak dapat dekompresi setelah kompresi (kesalahan dekompresi)
C> Masalah Menambahkan Kata Sandi Terkompresi Untuk Kompresi File
Fungsi kompresi sebenarnya telah dikembangkan. Tiga poin di atas sangat merepotkan bagi para pemula. Di sini saya akan membagikan masalah yang saya temui dalam mengembangkan fungsi kompresi sebelumnya.
Menggunakan kompresi yang disediakan oleh paket Java.util asli, jika file terkompresi digunakan dalam bahasa Cina, itu akan kacau (dikatakan bug di JDK), dan kode yang diimplementasikan oleh kompresi relatif kompleks (terutama pengaturan kata sandi), terutama untuk kompresi lintas-direktori dan kompresi multi-file.
Meskipun menggunakan alat ZIP yang disediakan oleh Apache menghindari masalah di atas, harus dicatat bahwa paket semut ini bertentangan dengan WebLogic (kesalahan akan dilaporkan selama penyebaran) dan tidak dapat mengompres kata sandi. Jika Anda menggunakan WebLogic, bukan tomocat, Anda harus memperhatikan masalah ini.
Menggunakan Java untuk memanggil perintah shell host juga merupakan pilihan yang baik, tetapi membutuhkan perintah penulisan shell. Tidak terlalu ramah untuk digunakan di platform Windows, dan porting lebih merepotkan.
Akhirnya, untuk masalah di atas, saya merekomendasikan ZIP4J di sini. Berikut ini juga merupakan penjelasan tentang implementasi kompresi ZIP4J.
Pertama, Anda perlu memperkenalkan paket ketergantungan:
<!-Kompresi: Dukungan untuk Kompresi Enkripsi-> <dependency> <GroupId> net.lingala.zip4j </groupid> <ArtifactId> ZIP4J </RENTIFACTID> <Version> 1.3.2 </version> </dependency>
Selanjutnya, merangkum kelas alat kompresi/dekompresi untuk memudahkan penggunaan:
impor net.lingala.zip4j.core.zipfile; impor net.lingala.zip4j.exception.zipException; impor net.lingala.zip4j.model.zipparameters; impor net.lingala.zip4j.util.zip4jconstants; impor org.lingala.zip4j.util.zip4jconstants; impor org.springfr. java.io.file;/*** Kelas alat ini menggunakan zip4j untuk kompresi dan dekompresi*/kelas publik ziputil {// menyatakan objek terkompresi private static zipparameters parameter; // DECOMPRESS FILE Objek Private Static Zipfile Zipfile; /** * * @param sourceFilePath The path of the compressed file (single file, folder) * @param zipFilePath Compressed file path* @param password Compressed password* @return Compressed successfully: true, compression failed: false */ public static Boolean singleFileCompress(String sourceFilePath,String zipFilePath,String password){ parameters = new Zipparameters (); parameter.setCompressionMethod (zip4jconstants.comp_deflate); // metode kompresi (metode default) parameter.setCompressionlevel (zip4jconsants.deflate_level_normal); // Level Kompresi (level default) // Pengaturan Enkripsi Kompresi if (! Stringutils.isempty (kata sandi)) {parameter.setencryptFiles (true); // apakah akan mengatur enkripsi file (default adalah no) parameter.setencryptionMethod (zip4jconstants.enc_method_standard); // Metode Enkripsi (Berikut ini adalah Parameter Kompresi) Parameter.SetPassword (kata sandi.tochararray ()); } coba {zipfile zipfile = new zipfile (zipfilePath); // Jika itu adalah file, kompres secara langsung. Jika itu adalah folder, lintasi file dan kompres semuanya jika (file baru (sourceFilePath) .isfile ()) {zipfile.setFilenamecharset ("gbk"); zipfile.addfile (file baru (sumberfilePath), parameter); Kembali Benar; } // file ff = file baru (sumberfilePath); File [] flst = file baru (SourceFilePath) .listFiles (); System.out.println ("Jumlah file =>"+flst.length); untuk (file f: flst) {zipfile.setFilenamecharset ("gbk"); zipfile.addfile (f, parameter); } return true; } catch (ZipException e) {e.printstacktrace (); mengembalikan false; } Catch (ID Pengecualian) {ID.PrintStackTrace (); mengembalikan false; }} public static boolean unzip (string zipfile, string unzipdir) {coba {ziputil.zipfile = new zipfile (zipfile); Ziputil.zipfile.setfilenamecharset ("gbk"); // Atur format pengkodean // Gunakan metode bawaan untuk memeriksa apakah file zip legal, termasuk apakah ada file, apakah itu baru file zip, apakah itu nipfute. ZipException ("File itu ilegal atau tidak ada"); } // Dibandingkan dengan built-in Java sendiri, jalur file akan secara otomatis dihasilkan tanpa menilai ziputil.zipfile.extractall (unzipdir); Kembali Benar; } catch (ZipException e) {return false; }}} Metode kompresi di atas dilengkapi dengan fungsi kompresi kata sandi, yang dapat mengompres file tunggal atau file direktori. Dibandingkan dengan implementasi asli, tiba -tiba menyegarkan. Satu -satunya hal yang perlu dicatat di sini adalah bahwa file target terkompresi tidak boleh ditembus sebelum kompresi, jika tidak kesalahan akan dilaporkan! Selain itu, ketika mendekompresi, Anda harus memperhatikan pengkodean file dan menentukan apakah ada file.
Meringkaskan
Di atas adalah implementasi Springboot dari menambahkan fungsi pengiriman email dan kompresi yang diperkenalkan editor kepada Anda. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas Anda tepat waktu!