java通过SMTP发送QQ邮件的完全步骤
首先,我们需要打开QQ邮箱的SMTP服务,因为QQ邮箱对于一般的用户都是默认关闭SMTP服务的。
打开QQ邮箱,点击设置
点击帐户
找到SMTP服务的选项,可以看到此处默认是关闭的,点击开启,然后腾讯会进行一些身份验证,身份验证通过以后,腾讯会给出一个用于使用SMTP的16位口令,此处这个口令一定牢记,因为后面要使用SMTP功能必须要用到这个口令,没有这个口令即使知道QQ邮箱密码也没有用,此处未给出口令的截图,毕竟为了隐私保密,不然大家都可以登录使用我的QQ邮箱SMTP服务了。后面我们将该口令记为SMTP口令。
接下就要开始写代码了 。
package net.jeeshop.core.util; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class MySendEmail { public static void main(String[] args) { try{ String userName="1912641339@qq.com"; String password="assnfpepcmdsfchg"; String smtp_server="smtp.qq.com"; String from_mail_address=userName; String to_mail_address="3191903880@qq.com"; Authenticator auth=new PopupAuthenticator(userName,password); Properties mailProps=new Properties(); mailProps.setProperty("mail.transport.protocol", "smtp"); mailProps.setProperty("mail.smtp.host", smtp_server); mailProps.setProperty("mail.smtp.auth", "true"); mailProps.setProperty("username", userName); mailProps.setProperty("password", password); mailProps.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); mailProps.setProperty("mail.smtp.port", "465"); mailProps.setProperty("mail.smtp.socketFactory.port", "465"); Session mailSession=Session.getDefaultInstance(mailProps, auth); mailSession.setDebug(true); MimeMessage message=new MimeMessage(mailSession); message.setFrom(new InternetAddress(from_mail_address)); message.setRecipient(Message.RecipientType.TO, new InternetAddress(to_mail_address)); message.setSubject("Mail Testw"); MimeMultipart multi=new MimeMultipart(); BodyPart textBodyPart=new MimeBodyPart(); textBodyPart.setText("电子邮件测试内容w"); multi.addBodyPart(textBodyPart); message.setContent(multi); message.saveChanges(); // 发送信件 // Transport.send(msg); Transport transport = mailSession.getTransport(); if (!transport.isConnected()) { transport.connect(); } transport.sendMessage(message, message.getAllRecipients()); transport.close(); }catch(Exception ex){ System.err.println("邮件发送失败的原因是:"+ex.getMessage()); System.err.println("具体的错误原因"); ex.printStackTrace(System.err); } } } class PopupAuthenticator extends Authenticator{ private String username; private String password; public PopupAuthenticator(String username,String pwd){ this.username=username; this.password=pwd; } public PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(this.username,this.password); } }
可能出现的异常:
1、javax.mail.AuthenticationFailedException异常的处理
这是身份认证的错误,这个时候,需要从以下两方面着手:
一、检查QQ邮箱或者别的邮箱是否开通了pop3/smtp服务,这个错误是认证失败,所以很有可能是没有开通pop3/smtp服务
二、在用户名、密码都没有问题以及pop3/smtp服务也开通的情况下,还是报这个错误,先登录一下邮箱,测试是否能正常发送邮件。
有时候邮箱发送邮件过于频繁,可能被网站认为是恶意软件攻击,这个时候就需要定期去他们的网站登录一下,处理一下
2、javax.mail.AuthenticationFailedException:530 Error: A secure connection is requiered(such as ssl).
More information at http://service.mail.qq.com/cgi-bin/help?id=28
这是QQ邮箱启用了SSL,所以我们也要加入,添加以下进去就行
mailProps.setProperty("mail.transport.protocol", "smtp");mailProps.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); mailProps.setProperty("mail.smtp.port", "465"); mailProps.setProperty("mail.smtp.socketFactory.port", "465");
3、javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 25;
用Transport.send(message);这个静态方法来发送邮件。因为这个方法会连接服务器,然后发送邮件,然后关闭邮件服务器,如果发送的邮件多了,就会重复同样的动作,导致报以上的错误。这样可能会邮件服务器那边拒绝掉。尤其是公共的那些邮件服务器。
后来,我改用我在发送的时候使用
transport = session.getTransport();
transport.connect();
然后发送邮件
transport.sendMessage(message, message.getAllRecipients());
等判断所有邮件都发送完毕了,再
transport.close();
这样就可以顺利发送多个邮件了。