รหัสสำหรับการส่งอีเมลถูกคัดลอกโดยตรงจากแอปพลิเคชันก่อนหน้า บริการอีเมล 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 (session.java:449)
ที่ javax.mail.session.getTransport (session.java:667)
ที่ javax.mail.session.getTransport (session.java:648)
ที่ 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.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 (); }}}