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();
这样就可以顺利发送多个邮件了。