คำนำ
รหัสสำหรับการส่งอีเมลถูกคัดลอกโดยตรงจากแอปพลิเคชันก่อนหน้า บริการอีเมล Tencent ที่ฉันใช้ในอดีตไม่มีปัญหากับการดำเนินการของโปรแกรม ต่อมาหลังจากแก้ไขให้กับบริการจดหมาย Office365 ของ Microsoft ฉันพบปัญหาสองประการ
คำถามที่ 1 การตั้งค่าการเข้ารหัส TLS
ข้อมูลข้อยกเว้นมีดังนี้:
ข้อยกเว้นในเธรด "Main" com.sun.mail.smtp.smtpsendfailedexception: 530 5.7.57 SMTP; ลูกค้าไม่ได้รับการรับรองความถูกต้องให้ส่งจดหมายที่ไม่ระบุชื่อระหว่างจดหมายจาก
การแก้ปัญหานี้ง่ายกว่า หลังจากค้นหาข้อมูลบางอย่างเพิ่มการกำหนดค่าต่อไปนี้:
mail.smtp.starttls.enable = true
คำถามที่ 2: โปรโตคอลที่รวดเร็วเป็นโมฆะ:
ข้อมูลข้อยกเว้นมีดังนี้:
ข้อยกเว้นในเธรด "Main" javax.mail.nosuchproviderexception: โปรโตคอลไม่ถูกต้อง: null ที่ javax.mail.session.getProvider (เซสชัน. java:449) ที่ javax.mail.session.getTransport (Session.java:667) javax.mail.session.getTransport (session.java:634)
ปัญหานี้พบได้เฉพาะหลังจากปรับใช้แอปพลิเคชันกับสภาพแวดล้อมการผลิต หลังจากการตรวจสอบฉันพบว่าแพ็คเกจ JAR ที่ฉันเรียกว่าไม่ใช่เวอร์ชันที่ฉันระบุใน Maven ต่อมาได้รับการยืนยันว่าแพ็คเกจ JAR ที่ใช้โดยแอปพลิเคชันขัดแย้งกับแพ็คเกจ JAR ที่ใช้โดยคอนเทนเนอร์ (เช่น Jetty) เวอร์ชัน JAR ที่ใช้โดยคอนเทนเนอร์นั้นเก่ากว่า แต่ขวดของคอนเทนเนอร์จะถูกโหลดโดยค่าเริ่มต้น มีสองวิธีในการแก้ปัญหานี้:
เขียนรหัสใหม่พร้อมขวดที่ขึ้นอยู่กับคอนเทนเนอร์
อัปเดตขวดของคอนเทนเนอร์
ตัวเลือกที่สองค่อนข้างอันตรายดังนั้นให้ใช้ตัวเลือกแรกเพียงแค่แก้ไขหนึ่งบรรทัด:
Transport Transport = session.getTransport ("SMTP");ปัญหานี้จะเกิดขึ้นใน javax.mail เวอร์ชัน 1.4 ในภายหลังเวอร์ชันที่สูงขึ้นจะใช้โปรโตคอล SMTP เพื่อส่งอีเมลตามค่าเริ่มต้น
โปรแกรมแก้ไข:
แพ็คเกจ com.zhyea.zytools; นำเข้า java.util.date; นำเข้า java.util.properties; นำเข้า Javax.mail.message นำเข้า Javax.mail.session; นำเข้า Javax.mail.transport; นำเข้า Javax.mail.internet.internet.internet.internet.internet. สตริงสุดท้ายคงที่ mail_smtp_host = "smtp.exmail.qq.com"; ส่วนตัวคงที่จำนวนเต็มสุดท้าย mail_smtp_port = 587; บูลีนสุดท้ายคงสุดท้าย mail_smtp_auth = true; สตริงสุดท้ายคงที่ส่วนตัว mail_smtp_user = "[email protected]"; สตริงสุดท้ายคงที่ส่วนตัว mail_smtp_password = "robinzhyea"; อุปกรณ์ประกอบคุณสมบัติคงที่ส่วนตัว = คุณสมบัติใหม่ (); คงที่ {props.put ("mail.smtp.host", mail_smtp_host); props.put ("mail.smtp.auth", mail_smtp_auth); props.put ("mail.smtp.user", mail_smtp_user); props.put ("mail.smtp.password", mail_smtp_password); props.put ("mail.smtp.starttls.enable", true); }/*** ส่งอีเมล*/โมฆะคงที่สาธารณะส่ง (สตริงไปที่, ชื่อสตริง, เนื้อหาสตริง) {ลอง {เซสชัน = เซสชัน. getInstance (อุปกรณ์ประกอบฉาก); // สร้างเซสชันอีเมลข้อความ mimemessage = mimemessage ใหม่ (เซสชัน); // สร้างวัตถุข้อความใหม่ message.setRecipient (message.recipientType.to, InternetAddress ใหม่ (ถึง)); // ตั้งค่าผู้รับและตั้งค่าประเภทการรับเป็น // ตั้งค่าเนื้อหาข้อความ // message.settext (mailcontent); // ส่งอีเมลข้อความธรรมดาข้อความ todo.setsUbject (ชื่อ); // ตั้งค่าข้อความชื่อ setContent (เนื้อหา "ข้อความ/html; charset = gbk"); // ส่ง HTML Mail สไตล์เนื้อหาเป็นข้อความที่สมบูรณ์ยิ่งขึ้น SetSentDate (วันที่ใหม่ ()); // ตั้งค่าข้อความเวลาการส่ง SAVECHANGES (); // ข้อมูลอีเมลที่เก็บข้อมูล // ส่งการขนส่งทางอีเมล = เซสชัน GETTRANSPORT ("SMTP"); transport.connect (mail_smtp_user, mail_smtp_password); Transport.sendMessage (ข้อความ, message.getAllRecipients ()); // ส่งอีเมลพารามิเตอร์ที่สองคือที่อยู่ผู้รับทั้งหมดที่อยู่การขนส่ง close (); } catch (exception e) {e.printstacktrace (); }}} แพ็คเกจ com.zhyea.zytools; นำเข้า java.util.date; นำเข้า java.util.properties; นำเข้า javax.mail.message นำเข้า Javax.mail.session; นำเข้า Javax.mail.transport; นำเข้า Javax.mail.internet.internetaddress; นำเข้า Javax.mail.internet.mimemessage; Mailsender ชั้นเรียนสาธารณะ {สตริงสุดท้ายคงที่ mail_smtp_host = "smtp.exmail.qq.com"; ส่วนตัวคงที่จำนวนเต็มสุดท้าย mail_smtp_port = 587; บูลีนสุดท้ายคงสุดท้าย mail_smtp_auth = true; สตริงสุดท้ายคงที่ส่วนตัว mail_smtp_user = "[email protected]"; สตริงสุดท้ายคงที่ส่วนตัว mail_smtp_password = "robinzhyea"; อุปกรณ์ประกอบคุณสมบัติคงที่ส่วนตัว = คุณสมบัติใหม่ (); คงที่ {props.put ("mail.smtp.host", mail_smtp_host); props.put ("mail.smtp.auth", mail_smtp_auth); props.put ("mail.smtp.user", mail_smtp_user); props.put ("mail.smtp.password", mail_smtp_password); props.put ("mail.smtp.starttls.enable", true); }/*** ส่งอีเมล*/โมฆะคงที่สาธารณะส่ง (สตริงไปที่, ชื่อสตริง, เนื้อหาสตริง) {ลอง {เซสชัน = เซสชัน. getInstance (อุปกรณ์ประกอบฉาก); // สร้างเซสชันอีเมลข้อความ mimemessage = mimemessage ใหม่ (เซสชัน); // สร้างวัตถุข้อความใหม่ message.setRecipient (message.recipientType.to, InternetAddress ใหม่ (ถึง)); // ตั้งค่าผู้รับและตั้งค่าประเภทการรับเป็น // ตั้งค่าเนื้อหาข้อความ // message.settext (mailcontent); // ส่งอีเมลข้อความธรรมดาข้อความ todo.setsUbject (ชื่อ); // ตั้งค่าข้อความชื่อ setContent (เนื้อหา "ข้อความ/html; charset = gbk"); // ส่ง HTML Mail สไตล์เนื้อหาเป็นข้อความที่สมบูรณ์ยิ่งขึ้น SetSentDate (วันที่ใหม่ ()); // ตั้งค่าข้อความเวลาการส่ง SAVECHANGES (); // ข้อมูลอีเมลที่เก็บข้อมูล // ส่งการขนส่งทางอีเมล = เซสชัน GETTRANSPORT ("SMTP"); transport.connect (mail_smtp_user, mail_smtp_password); Transport.sendMessage (ข้อความ, message.getAllRecipients ()); // ส่งอีเมลพารามิเตอร์ที่สองคือที่อยู่ผู้รับทั้งหมดที่อยู่การขนส่ง close (); } catch (exception e) {e.printstacktrace (); }}}
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะเป็นประโยชน์ต่อการศึกษาและการทำงานของทุกคน