هذه المرة تحدثت فقط عن وظيفة إرسال البريد الإلكتروني ، لكنني كنت خائفًا من عدم وجود محتوى ، لذلك أضفت بعض تفسيرات وظيفة ضغط الملفات.
أولاً ، يتم إرسال البريد الإلكتروني. وظيفة البريد الإلكتروني لها تبعيات مقابلة في سبرينغ بوت. هذا:
<Rependency> <roupend> org.springframework.boot </groupId> <insifactid> spring-boot-starter-mail </insifactid> </prement>
تطوير وظيفة البريد الإلكتروني بسيط للغاية في سبرينغ بوت. هنا سألخص محتوى التطوير:
A> إضافة حزمة التبعية
ب> تكوين المعلمات الأساسية للبريد (في YMAL أو خاصية)
C> حقن javamailsender في الخدمة واتصل بالأساليب ذات الصلة
ومع ذلك ، قد تكون هناك مشكلة هنا ، أي عند نشر الخادم المحدد ، سيقوم الخادم بحظر منفذ خدمة البريد الإلكتروني ومشكلات أمان البريد الإلكتروني العادية. سأقدم حلاً عند شرح هنا.
أولاً ، تحتاج إلى تقديم مكون البريد الإلكتروني في POM.XML للمشروع. يجب أن يتوافق إصدار المكون مع إصدار Springboot (لا يمكنك كتابته ، لقد حذفته هنا):
<Rependency> <roupend> org.springframework.boot </groupId> <insifactid> spring-boot-starter-mail </insifactid> </prement>
التالي هو تكوين المعلمات الأساسية للبريد الإلكتروني في ملف التكوين:
الربيع: البريد: البريد: مضيف: smtp.exmail.qq.com اسم المستخدم: [email protected] كلمة المرور: كلمة المرور الافتراضية: UTF-8 SSL: Trust: Smtp.exmail.qq.com الخصائص: Mail: Smtp: Auth #does مصادقة تحتاج إلى socketfactory: javax.net.net.sssl.ssssss. المنفذ: 465 #Use SMTP465 PORT
عند تكوين المعلمات ، يجب أن تنتبه إلى المسافة البادئة ، لأنني أعطي تنسيق تكوين YAML. إذا كان تكوين خاصية ، فإنه يشبه هذا تقريبًا (مثال): spring.mail.host:Smtp.exmail.qq.com. كل طفل في شكل كامل. في البداية ، حذفت التكوين أسفل عنصر الخصائص (خطير ، SSL ، المنفذ). في وقت لاحق ، وجدت أن الخادم قام بحظر المنفذ الخامس والعشرين للبريد ، لذلك من الممكن محليًا ولكنه لا يعمل على الخادم ، لذلك يحتاج إلى تحديد منفذ خدمة البريد ليكون 465. أنا أستخدم صندوق بريد QQ هنا. إذا كنت تستخدم 163 أو صناديق بريد أخرى ، فأنت بحاجة إلى التحقق من المنافذ التي يدعمها مزود الخدمة بنفسك. بالنسبة لمشكلات أمان البريد الإلكتروني ، يجب الإعلان عن اثنين هنا ، واحد هو SSL Trust ومصنع Socket of Mail. لمزيد من التفاصيل ، يرجى الاطلاع على القسم الأحمر أعلاه. التكوين أعلاه صالح فقط لصناديق بريد QQ ، ولا يضمن أن صناديق البريد الأخرى قابلة للتطبيق أيضًا.
حسنًا ، تم الانتهاء من التكوين ، هنا نبدأ في كتابة فئة التنفيذ المحددة:
استيراد xxx.common.util.dateutil ؛ استيراد org.apache.commons.lang3.stringutils ؛ استيراد org.slf4j.logger org.springframework.beans.factory.annotation.value ؛ استيراد org.springframework.mail.simplemailmessage ؛ استيراد org.springframework.mail.javamail.javamailsender 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 logger logger. value ("$ {spring.mail.username}") سلسلة خاصة send_user_addr ؛ Autowired الخاص Javamailsender Mailsender ؛ /*** إرسال بريد إلكتروني بسيط* @param استلام المستلم* param obj إرسال موضوع* param content content content*/public void sendSimplemail (string receed ، string obj ، string content) {if (! stringutils.isnotblank (content) || message.setFrom (send_user_addr) ؛ if (receed.contains ("؛ message.setto (استلام) ؛ message.SetSubject (OBJ) ؛ message.settext (content) ؛ حاول {mailsender.send (message) ؛ log.info ("البريد البسيط أرسل النجاح!") ؛ } catch (استثناء e) {log.error ("sendSimplemail error!" ، e) ؛ }} strbuilder StringBuilder الخاص ؛ / *** نموذج إرسال قائمة HTML Mail Multi-List* @param استلام المستلم* param obj إرسال موضوع (موضوع)* param content content*/ public void sendhtmlbylist (string receed ، string obj ، list <map> content) {if (content.isempty () || mimemessage msg = mailsender.createmimemessage () ؛ جرب {mimemessageHelper Helper = new mimemessageHelper (msg ، true ، "utf-8") ؛ // حل المشكلة المشوهة helper.setFrom (send_user_addr) ؛ if (receed.contains ("؛ else helper.setto (استلام) ؛ Helper.SetSubject (OBJ) ؛ strbuilder = new StringBuilder () ؛ strbuilder.append ("<! doctype html> <html> <head> <meta http-equiv =/" content-type/"content =/" text/html ؛ charset = utf-8/"> </head> <body style =/" padding: 3 ٪ 2 ٪ ؛/">") ؛ strbuilder.append ("<h2> يتم إرسال هذه الرسالة تلقائيًا إلى النظام. </h2>") ؛ strbuilder.append ("<h2> إرسال التاريخ بواسطة" +dateUtil.getDateFormat (New Date () ، DateUtil.dateTime_Default_Format) +"</h2>") ؛ strbuilder.append ("<h2> فيما يلي التفاصيل: </h2>") ؛ strbuilder.append ("<table border =/" 2px Solid Red/"Width =/" 100 ٪/">") ؛ // head strbuilder.append ("<th>"+st [i]+"</h>") ؛ strbuilder.append ("</tr>") ؛ strbuilder.append ("</tr>") ؛ Object [] st = content.get (0) .KeySet (). tararray () ؛ لـ (int i = 0 ؛ i <st.Length ؛ i ++) strbuilder.append ("<h>"+st [i]+"</th>") ؛ strbuilder.append ("</tr>") ؛ strbuilder.append ("</tr>") ؛ strbuilder.append ("</tr>") ؛ // body strbuilder.append ("<tbody>") ؛ لـ (عنصر الخريطة: المحتوى) {strbuilder.append ("<tr>") ؛ لـ (Object 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 Disees </h3>") ؛ strbuilder.append ("</body> </html>") ؛ //log.info (strbuilder.toString ()) ؛ helper.settext (strbuilder.toString () ، true) ؛ } catch (استثناء e) {log.error ("sendhtmlmail error:" ، e) ؛ } mailsender.send (msg) ؛ } / *** أرسل نموذج سجل العمود html mail* param استلام المستلم* param obj send topic (title)* param content content content* / public void sendhtmlmailbyitem (string receed ، string obj ، list <string> content) {if (content.isempty () || mimemessage msg = mailsender.createmimemessage () ؛ جرب {mimemessageHelper Helper = new mimemessageHelper (msg ، true ، "utf-8") ؛ // حل المشكلة المشوهة helper.setFrom (send_user_addr) ؛ if (receed.contains ("؛ else helper.setto (استلام) ؛ Helper.SetSubject (OBJ) ؛ strbuilder = new StringBuilder () ؛ strbuilder.append ("<! doctype html> <html> <head> <meta http-equiv =/" content-type/"content =/" text/html ؛ charset = utf-8/"> </head> <body style =/" padding: 3 ٪ 2 ٪ ؛/">") ؛ strbuilder.append ("<h3> يتم إرسال هذه الرسالة تلقائيًا إلى النظام. </h3>") ؛ strbuilder.append ("<h3> إرسال التاريخ بواسطة" +dateUtil.getDateFormat (New Date () ، dateutil.dateTime_Default_Format) +"</h3>") ؛ strbuilder.append ("<h3> فيما يلي التفاصيل: </h3>") ؛ strbuilder.append ("<table border =/" 2px Solid Red/"Width =/" 100 ٪/">") ؛ // strbuilder.append ("<Table Border =/" 2px Solid Red/"Width =/" 100 ٪/">") ؛ // head strbuilder.append ("<th>"+obj.touppercase ()+"Detail </h>") ؛ strbuilder.append ("<h>"+obj.toupperCase ()+"التفاصيل </th>") ؛ strbuilder.append ("</table>") ؛ // body strbuilder.append ("<tbody>") ؛ لـ (عنصر السلسلة: المحتوى) {strbuilder.append ("<tr> <td>"+item+"</td> </tr>") ؛ } strbuilder.append ("</tbody>") ؛ strbuilder.append ("</table>") ؛ strbuilder.append ("<h3 style =/" text-align: right ؛ font-weight: normal ؛/"> bestmises </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 (استثناء e) {log.error ("sendhtmlmail error:" ، e) ؛ } mailsender.send (msg) ؛ }}
ما سبق هو تغليف وظيفة البريد الإلكتروني في فئة الخدمة. عند استخدامه ، تحتاج فقط إلى ضخ الفئة الحالية والاتصال بها مباشرة. يتضمن ما ورد أعلاه طريقتين: إحداها هي إرسال بريد إلكتروني بسيط ، والآخر هو بريد إلكتروني يحتوي على جدول HTML. إذا كنت بحاجة إلى إرسال المرفقات ، فأنت بحاجة إلى وضع المرفقات في طريقة MimemessageHelper (تسمى Addattachment ("اسم الملف" ، ملف)). لأنه لا يوجد شرط فعلي هنا ، يتم حذفه. حسنًا ، تم الانتهاء من وظيفة إرسال البريد الإلكتروني. لنرى التأثير الفعلي هنا:
تم تنفيذ وظيفة البريد الإلكتروني. الآن سأتحدث عن وظيفة ضغط الملف. هناك ما يقرب من أربعة أنواع من تطبيقات وظائف الضغط ، وهي:
A> استخدم ضغط API الذي توفره java.util.zip
B> استخدم ضغط API الذي توفره حزمة Apache (org.apache.tools.ant.taskdefs.zip)
C> استخدم ضغط API المقدم من ZIP4J (net.lingala.zip4j)
د> استدعاء ضغط أمر shell للمضيف
هناك ثلاث مشكلات يجب ذكرها هنا:
A> البريد الإلكتروني العادي مضغوط رمز مشوهة صيني (غير مدعوم باللغة الصينية)
B> لا يمكن إلغاء الضغط بعد الضغط (خطأ إلغاء الضغط)
C> مشكلة إضافة كلمات مرور مضغوطة لضغط الملفات
تم تطوير وظيفة الضغط بالفعل. النقاط الثلاث المذكورة أعلاه مزعجة بشكل خاص للمبتدئين. هنا سوف أشارك المشاكل التي واجهتها في تطوير وظيفة الضغط من قبل.
باستخدام الضغط الذي توفره حزمة Java.Util الأصلية ، إذا تم استخدام الملف المضغوط باللغة الصينية ، فسيتم تشويهه (يقال إنه خطأ في JDK) ، والرمز الذي ينفذه الضغط معقد نسبيًا (خاصة تحديد كلمات المرور) ، خاصة بالنسبة لضغط الدليل المتقاطع والضغط متعدد المنشآت.
على الرغم من أن استخدام أداة ZIP التي توفرها Apache يتجنب المشكلات المذكورة أعلاه ، تجدر الإشارة إلى أن حزمة Ant هذه تتعارض مع WebLogic (سيتم الإبلاغ عن خطأ أثناء النشر) ولا يمكن ضغط كلمة المرور. إذا كنت تستخدم WebLogic بدلاً من tomocat ، فيجب عليك الانتباه إلى هذه المشكلة.
يعد استخدام Java للاتصال بأمر Shell للمضيف خيارًا جيدًا أيضًا ، لكنه يتطلب كتابة أوامر Shell. ليس من الصديق للنشر على منصة Windows ، والنقل أكثر إثارة للقلق.
أخيرًا ، بالنسبة للقضايا المذكورة أعلاه ، أوصي ZIP4J هنا. فيما يلي أيضًا شرح لتنفيذ ضغط ZIP4J.
أولاً ، تحتاج إلى تقديم حزم التبعية:
<!-الضغط: دعم لضغط التشفير-> <Rependency> <roupiD> net.lingala.zip4j </groupId> <ChintifactId> zip4j </stifactid> <الإصدار> 1.3.2 </version> </dependency>
علاوة على ذلك ، قم بتغليف فئة أداة الضغط/إلغاء الضغط لسهولة الاستخدام:
استيراد net.lingala.zip4j.core.zipfile ؛ استيراد net.lingala.zip4j.exception.zipexception ؛ استيراد net.lingala.zip4j.model.zipparameters ؛ import net.lingala.zip4j.util.zip4jconstants ؛ import org.spramebramework.zip4. java.io.file ؛/*** تستخدم فئة الأداة هذه Zip4J لضغط وخفض الضغط*/الفئة العامة Ziputil {// إعلان الكائن المضغوط الخاص zipparameters المعلمات ؛ // فك كائن الملف الخاص Zipfile zipfile ؛ / ** * * @param sourceFilePath مسار الملف المضغوط (ملف واحد ، مجلد) * param zipfilepath مسار الملف المضغوط * param password password * @return compressed بنجاح: صواب ، فشل الضغط: false */ public static boolean singlefileCompress (String source source ، String Zipilepath ، strep parameters.setCompressionMethod (zip4jconstants.comp_deflate) ؛ // طريقة الضغط (الطريقة الافتراضية) المعلمات. // مستوى الضغط (المستوى الافتراضي) // إعدادات تشفير الضغط if (! stringUtils.isempty (password)) {parameters.setencryptfiles (true) ؛ // ما إذا كنت تريد تعيين تشفير الملف (الافتراضي هو) المعلمات. // طريقة التشفير (هنا هو ضغط قياسي) المعلمات. } جرب {zipfile zipfile = new zipfile (zipfilepath) ؛ // إذا كان ملفًا ، فقم بضغطه مباشرة. إذا كان مجلد ، فاجرف الملفات وضغطها جميعًا إذا (ملف جديد (SourceFilePath) .isfile ()) {zipfile.setFilenameCharset ("GBK") ؛ zipfile.addfile (ملف جديد (SourceFilePath) ، المعلمات) ؛ العودة صحيح. } // file ff = new file (sourceFilePath) ؛ file [] flst = file new (sourceFilePath) .ListFiles () ؛ System.out.println ("عدد الملفات =>"+flst.length) ؛ لـ (file f: flst) {zipfile.setFilenameCharSet ("gbk") ؛ zipfile.addfile (f ، المعلمات) ؛ } إعادة صواب ؛ } catch (zipexception e) {e.printStackTrace () ؛ العودة كاذبة } catch (insection id) {id.printStackTrace () ؛ العودة كاذبة }} public static boolean unsip (سلسلة zipfile ، سلسلة unzipdir) {try {ziputil.zipfile = new zipfile (zipfile) ؛ ziputil.zipfile.setfilenameCharSet ("gbk") ؛ // قم بتعيين تنسيق الترميز // استخدم الطريقة المدمجة للتحقق مما إذا كان ملف zip قانونيًا ، بما في ذلك ما إذا كان الملف موجودًا ، أو ما إذا كان ملفًا مضغوطًا ، أو ملفًا مضغوطًا ، أو ما إذا كان ذلك عبارة ZipException ("الملف غير قانوني أو غير موجود") ؛ } // بالمقارنة مع Java المدمج في Java ، سيتم إنشاء مسار الملف تلقائيًا دون الحكم على ziputil.zipfile.extractall (unzipdir) ؛ العودة صحيح. } catch (ZipException e) {return false ؛ }}} تأتي طريقة الضغط أعلاه مع وظيفة ضغط كلمة المرور ، والتي يمكنها ضغط الملفات المفردة أو ملفات الدليل. بالمقارنة مع التنفيذ الأصلي ، فهو منعش إلى حد كبير. الشيء الوحيد الذي يجب الإشارة إليه هنا هو أنه يجب عدم اختراق ملف الهدف المضغوط قبل الضغط ، وإلا سيتم الإبلاغ عن خطأ! بالإضافة إلى ذلك ، عند إلغاء الضغط ، يجب عليك الانتباه إلى ترميز الملفات وتحديد ما إذا كان الملف موجودًا.
لخص
ما سبق هو تطبيق Springboot لإضافة وظائف إرسال البريد الإلكتروني والضغط التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر إليك في الوقت المناسب!