最近想写一个邮箱自动验证功能,在网上看了很多,写到自己上面出了很多问题,记录下来给后面的人一个参考
package com.app.tools; 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; public class SendEmail { // public static final String HOST = "mx3.qq.com"; public static final String HOST = "smtp.163.com"; public static final String PROTOCOL = "smtp"; public static final int PORT = 25; /*465 这是QQ的端口*/ public static final String FROM = "xxxxx@163.com";//发件人的email public static final String PWD = "xxxxxxx";//发件人密码 private static Session getSession() { Properties props = new Properties(); props.put("mail.smtp.host", HOST);//设置服务器地址 props.put("mail.store.protocol" , PROTOCOL);//设置协议 props.put("mail.smtp.port", PORT);//设置端口 props.put("mail.smtp.auth" , "true"); Authenticator authenticator = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(FROM, PWD); } }; Session session = Session.getDefaultInstance(props , authenticator); return session; } public static void send(String toEmail , String content) { Session session = getSession(); try { System.out.println("--send--"+content); // Instantiate a message Message msg = new MimeMessage(session); //Set message attributes msg.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 message Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); } } public static void main(String[] args) { new SendEmail().send("xxxxx@qq.com","dsfsdf"); System.out.println("success"); } }
请注意以下要点:
1、是否开启了认证,QQ邮箱、163邮箱均要开启认证
2、javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25; //连接超时
解决参考:将这个属性的true加上引号,请奇葩的异常! 注意:如果没有这条属性,可能或抛出 需要认证异常(Required Authentication) 这个异常一般是由1、2造成的
3、在设置属性的时候,一定要注意弄清楚使用邮箱的地址和端口。 javax.mail.AuthenticationFailedException
QQ邮箱端口: mx3.qq.com 端口:465 163邮箱:smtp.163.com 端口:25 这是都是发送邮件时使用的smtp协议所用。如果是收邮件则用的是pop3协议,那又不一样了。这个请自行查找
4、
在使用QQ邮箱发送邮件的时候,出现这个异常。 查了一下,官方说法是发送太频繁所以被锁定了!目前还没有解决。明天试试看看能不能成功(未成功)
以上是几个容易出现的异常,解决之后,其他异常可根据具体抛出的信息解决!
补充:QQ经测试也可以了