java使用163邮箱完成发送邮件完成注册
前言:最近在做一個pc網站,網站需要郵箱注冊(發送的驗證碼),阿里云部署項目.所以采用的是163的郵箱(網易6.0)!!
?
使用前必須先去注冊163郵箱(免費),還有去設置-->客戶端授權密碼-->開啟(然后自己設置一個密碼),在去設置-->POP3/SMTP/IMAP-->全選√.
?
使用前的注意事項:
1. 發送郵件一般是25端口,但是在阿里云部署項目,現在的阿里云的ECS服務器是默認關閉了25端口,就算在安全組規則添加25端口進去,也是發送不了郵件
2.在本地環境可以采用25端口來發送郵件,在阿里云的服務器上采用465端口來發送郵件!!!
3.一下的email和密碼是采用你注冊的郵箱賬號,和你在開啟的客戶端授權密碼(切記:并不是你注冊的時候的密碼)
參考文章:https://www.cnblogs.com/hoojjack/p/8025284.html
郵件工具類:
?
import java.util.Date; import java.util.Properties;import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;/*** 郵件工具類* smtp服務器,支持非ssl協議25端口,和ssl協議465端口* 如果硬件服務器可以采用25端口,來發送郵件* 如果采用阿里云ESC服務器,默認25端口是不開放,添加安全組規則25端口也沒用,必須采用465端口* @author Monkey* @date 2017年10月20日上午9:50:15* @version 1.0*/ public class SendEmail {//這一套采用25端口 // public static final String HOST = "smtp.163.com"; // public static final String PROTOCOL = "smtp"; // public static final String PORT = "25"; // public static final String FROM = "";// 發件人的email // public static final String PWD = "";// 發件人密碼//這一套采用465端口public static final String HOST = "smtp.163.com";public static final String PORT = "465";public static final String FROM = "";// 發件人的emailpublic static final String PWD = "";// 發件人密碼public static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";/*** 獲取Session* * @return*/private static Session getSession() {Properties props = new Properties();//這一套是25端口 // props.put("mail.smtp.host", HOST);// 設置服務器地址 // props.put("mail.store.protocol", PROTOCOL);// 設置協議 // props.put("mail.smtp.port",PORT);// 設置端口 // props.put("mail.smtp.auth", "true");//注意是字符串的true,不是boolean類型的true//這一套是465端口props.setProperty("mail.smtp.host",HOST);// 設置服務器地址props.setProperty("mail.smtp.socketFactory.class",SSL_FACTORY);// 設置協議props.setProperty("mail.smtp.socketFactory.fallback", "false");//注意是字符串的true,不是boolean類型的trueprops.setProperty("mail.smtp.port",PORT);// 設置端口props.setProperty("mail.smtp.socketFactory.port",PORT);props.put("mail.smtp.auth", "true");//注意是字符串的true,不是boolean類型的trueAuthenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(FROM, PWD);}};Session session = Session.getDefaultInstance(props, authenticator);return session;}public static void send(String toEmail, String content)throws MessagingException {Session session = getSession();System.out.println("--send--" + content);// Instantiate a messageMessage msg = new MimeMessage(session);// Set message attributesmsg.setFrom(new InternetAddress(FROM));InternetAddress[] address = { new InternetAddress(toEmail) };msg.setRecipients(Message.RecipientType.TO, address);msg.setSubject("激活幣之家通行證");msg.setSentDate(new Date());msg.setContent(content, "text/html;charset=utf-8");// Send the messageTransport.send(msg);}}?
?
還是怕有的人不知道怎么使用,我就貼上我自己的注冊的業務代碼,僅供參考!!
serviceImpl:
?
@Overridepublic Result register(String action, UserPassport userPassport,String code) throws ServiceException {//郵箱注冊if (action.equals("email")) {//獲取郵箱String email = userPassport.getEmail();// 數據訪問層,通過email獲取用戶信息UserValidcode userValidcode = validcodeMapper.selectByEmail(email);// 驗證用戶是否存在if (userValidcode != null) {// 驗證用戶激活狀態if (userValidcode.getStatus() == -1) {// 驗證激活碼是否正確if (code.equals(userValidcode.getCode())) {Integer id = validcodeMapper.validEmailCode(email, code);try {if (id != null) {// 激活成功, //并更新用戶的激活狀態,為已激活System.out.println("==sq===" + userValidcode.getStatus());// 把狀態改為激活userValidcode.setStatus(1);System.out.println("==sh===" + userValidcode.getStatus());validcodeMapper.updateByPrimaryKey(userValidcode);// 插入用戶賬號表UserInfo userInfo = new UserInfo();userInfo.setCreated(new Date());userInfo.setUpdated(new Date());userInfo.setNick(userPassport.getNickName());userInfo.setClient("web");userInfo.setEmail(email);userInfoMapper.insertSelective(userInfo);return ResultUtil.success(); } else {throw new ServiceException("激活碼已過期");}} catch (Exception e) {logger.debug("郵箱注冊失敗{}", e.getMessage());throw new RuntimeException();}} else {throw new ServiceException("激活碼不正確");}} else {throw new ServiceException("郵箱已激活,請登錄!");}} else {throw new ServiceException("該郵箱未注冊(郵箱地址不存在)!");}return ResultUtil.error("激活失敗{根據email沒有獲取到信息}");}return ResultUtil.error("注冊方式錯誤!!!!!!!");}如果出現:java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger javax/mail/MessagingException異常
則參考這篇文章:
https://blog.csdn.net/u013361445/article/details/49663329
如果使用這篇文章的情況下出現,采用ssl連接不上客戶端的情況下,加上這一句:
props.put("mail.smtp.ssl.enable", "true");總結
以上是生活随笔為你收集整理的java使用163邮箱完成发送邮件完成注册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 领域驱动设计:软件核心复杂性应对之道_人
- 下一篇: android listpreferen