บทความนี้เริ่มต้นด้วยปัญหาที่พบในการตรวจสอบการลงทะเบียนกล่องจดหมายผ่าน Javamailsender และวิเคราะห์หลักการและวิธีแก้ไขปัญหาในรายละเอียด
การใช้การตรวจสอบการลงทะเบียนอีเมลเราจำเป็นต้องชี้แจงแนวคิดการออกแบบ:
คำถามที่ 1: หลังจากส่งข้อมูลการลงทะเบียนคุณต้องส่งอีเมลไปยังหมายเลขอีเมลที่คุณกรอก
คำถามที่ 2: ผู้ใช้จะเปิดใช้งานอย่างไรเมื่ออีเมลมาถึงไม่ว่าจะขอรหัสการตรวจสอบ GET หรือรับ (บทความนี้ใช้อินเตอร์เฟส GET เพื่อเปิดใช้งาน)
คำถามที่ 3: วิธีการตั้งค่าเวลาที่ถูกต้องสำหรับการเปิดใช้งานอีเมล
ผ่านคำถามสามข้อข้างต้นบล็อกเกอร์จะช่วยให้ทุกคนหลักการตรวจสอบกล่องจดหมาย Javamailsender
คำถามที่ 1
ก่อนอื่นฉันต้องแก้วิธีส่งอีเมลไปยังหมายเลขกล่องจดหมายที่ระบุ
เพิ่มการพึ่งพาต่อไปนี้ใน POM:
<!-อีเมล-> <cendency> <sderctId> Javax.mail </GroupId> <ratifactId> Mail </artifactId> <Sersion> 1.4.7 </Serve> </การพึ่งพา>
ถูกต้องเราใช้ Javax เพื่อขยายการพึ่งพาจดหมายในแพ็คเกจดังนั้นอย่าเลือกการนำเข้าที่ผิดในรหัส
รหัสนี้ง่ายและง่ายสำหรับทุกคนที่จะเข้าใจ
จากบนลงล่างลองดูที่อินเทอร์เฟซก่อน:
@RequestMapping (value = "myajaxregister") @ResponseBody สตริงสาธารณะ SendEmail (@requestparam อีเมลสตริง) {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ ("Luxiaotao", "0331"); เธรดใหม่ () {@Override โมฆะสาธารณะ Run () {EmailService.Senemail (ผู้ใช้, อีเมล); } }.เริ่ม(); ส่งคืน "อีเมลถูกส่งไปยังที่อยู่อีเมลของคุณโปรดเปิดใช้งาน"; -เนื่องจากเป็นการทดสอบบล็อกเกอร์ได้สร้างข้อมูลปลอมจากผู้ใช้และการรับอีเมลเป็นคีย์
สร้างเธรดใหม่เพื่อเรียกใช้วิธีการส่งจดหมายเพื่อปรับปรุงประสบการณ์ของผู้ใช้
ลองนึกภาพว่ามันไม่ได้เป็นแบบอะซิงโครนัสผู้ใช้จะต้องรอให้ส่งอีเมลก่อนที่หน้าจะถูกเปลี่ยนเส้นทาง
ลองมาดูวิธีการส่งอีเมล:
@Override บูลีนสาธารณะ Senemail (ผู้ใช้ผู้ใช้, อีเมลสตริง) {ลอง {javamailsenderimpl mailsender = Javamailsenderimpl ใหม่ (); mailsender.sethost ("smtp.163.com"); mailsender.setUserName ("กรอกบัญชีกล่องจดหมาย 163 ของคุณ"); mailsender.setPassword ("163 รหัสผ่านกล่องจดหมาย"); MEMEMESSAGE MAILMESSAGE = MailSender.CreateMimEmessage (); MimemessageHelper Helper = ใหม่ MEMEMESSAGEHELPER (MailMessage, True, "GBK"); helper.setfrom (mailsender.getusername ()); helper.setto (อีเมล); helper.setsubject ("title"); helper.settext ("ส่งจดหมายสำเร็จ"); string emailtoken = getEmailToken (ผู้ใช้); string url = "<a href = 'http: // localhost: 8088/activateMail? emailtoken ="+emailtoken+"'> เปิดใช้งาน"+"</a> </br> <h1> หากไม่สามารถเข้าถึงการเชื่อมต่อ hyperconnection ด้านบนโปรดคัดลอก URL ต่อไปนี้ไปยังที่อยู่ bar </h1> <h2> http: // localhost: 8088/activateMail? emailtoken = "+emailtoken+" </h2> "; helper.settext (url, true); Mailsender.Send (MailMessage); กลับมาจริง; } catch (exception e) {e.printstacktrace (); กลับเท็จ; - วิธีนี้อธิบาย:
1. หากกล่องจดหมายเซิร์ฟเวอร์ของคุณเป็นกล่องจดหมาย QQ ให้แก้ไขเป็น: mailSender.setHost("smtp.qq.com");
2.MimemessageHelper เป็นคลาสส่วนขยายสำหรับจดหมายภายใต้ Javax หากคุณใช้จดหมายที่ห่อหุ้มสปริงคุณไม่จำเป็นต้องใช้มัน หากคุณใช้สปริงเมล์วิธีการตั้งค่าจะแตกต่างกัน
3. พารามิเตอร์ที่สองจริงของ helper.setText(url,true); หมายความว่าสตริงปัจจุบันอยู่ในรูปแบบ HTML ดังนั้นแท็กจะใช้งานได้
4. getEmailToken(user); วิธีการจะกล่าวถึงด้านล่าง
จนถึงตอนนี้อีเมลสามารถส่งได้ตามปกติ เพื่อความสะดวกฉันให้รหัสหน้า HTML:
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> title </title> </head> <body> <วิธีการฟอร์ม = "get" action = "/myajaxregister" value = "register"> </form> </body> </html>
คำถามที่ 2
จะเปิดใช้งานอีเมลโดยใช้ API ที่ร้องขอได้อย่างไร
ในคำถามที่ 1 getEmailToken(user) ภายใต้ senEmail() ใช้เพื่อเปิดใช้งาน
จะเห็นได้ว่าเนื้อหาอีเมลที่ส่งโดย senEmail() เป็นไฮเปอร์ลิงก์ซึ่งใช้เพื่อเริ่มต้นอินเทอร์เฟซการเปิดใช้งานของเรา
แต่สิ่งนี้เกี่ยวข้องกับ getEmailToken(user) อะไร
ดังที่เห็นได้จากความหมายที่แท้จริงเราจะใช้โทเค็นที่นี่
ก่อนอื่นให้ดูที่คอนโทรลเลอร์เปิดใช้งาน
@RequestMapping (value = "ActiveAtemail") สตริงสาธารณะ Activatemail (@requestparam string emailtoken) {ถ้า (emailservice.balancetoken (emailtoken)) {return "ความสำเร็จ"; } return "error1"; - ผ่านไฮเปอร์ลิงก์เราส่งพารามิเตอร์ emailtoken ไปยังเซิร์ฟเวอร์
หลังจากเซิร์ฟเวอร์ได้รับโทเค็นนี้มันจะเปรียบเทียบกับโทเค็นท้องถิ่น หากเหมือนกันเป็นจริงมันจะผ่านการตรวจสอบ
ที่นี่ฉันใช้ REDIS เพื่อแคชและใช้โทเค็นเป็นคีย์และข้อมูลผู้ใช้ (ผู้ใช้) เป็นค่า
มาดูสองวิธี:
@Override สตริงสาธารณะ getEmailToken (ผู้ใช้ผู้ใช้) {สตริงโทเค็น = uuid.randomuuid (). toString (); ค่าสตริง = user.toString (); REDISTEMPLATE.OPSFORVALUE (). SET (โทเค็น, ค่า); โทเค็นกลับมา; } @Override บูลีนสาธารณะ balancetoken (สตริง emailtoken) {ถ้า (redistemplate.opsforvalue () รับ (emailtoken)! = null) {return true; } return false; - วิธีแรกใช้ REDIS เพื่อแปลงข้อมูลผู้ใช้เป็นสตริงและจัดเก็บไว้ในหน่วยความจำ
วิธีที่สองคือการเปิดใช้งานการตรวจสอบและใช้คีย์ (โทเค็น) เพื่อตรวจสอบว่ามีค่าใน Redis และกลับมาจริงได้สำเร็จหรือไม่
คำถามที่ 3
แล้วถ้าคุณตั้งค่าระยะเวลาที่ถูกต้องของการตรวจสอบอีเมล
ต้องบอกว่านักเรียนที่ใช้ Redis มักจะเดาได้
เพียงเพิ่มบรรทัดของรหัสเพื่อ getEmailToken() :
@Override สตริงสาธารณะ getEmailToken (ผู้ใช้ผู้ใช้) {สตริงโทเค็น = uuid.randomuuid (). toString (); ค่าสตริง = user.toString (); REDISTEMPLATE.OPSFORVALUE (). SET (โทเค็น, ค่า); Redistemplate.expire (โทเค็น, 60, TimeUnit.seconds); โทเค็นกลับมา; - ใช่ใช้ redisTemplate.expire() เพื่อตั้งเวลาหมดอายุของคู่คีย์-ค่าปัจจุบัน
สุดท้ายมาดูอีเมลเปิดใช้งาน:
ข้างต้นเป็นเนื้อหาทั้งหมดของการใช้งานการตรวจสอบการลงทะเบียนอีเมลของ Javamailsender ซึ่งแนะนำในเวลานี้ หากคุณยังไม่เข้าใจคุณสามารถพูดคุยในพื้นที่ข้อความด้านล่าง