您的位置:首页 > 编程语言 > Java开发

Java mail使用QQ邮箱发送邮件配置方案及异常处理

2017-06-03 17:01 543 查看


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();

这样就可以顺利发送多个邮件了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qq邮箱 邮件 smtp qq java