很早就尝试学习一下邮件发送,但是老是不成功,报错javax.mail.AuthenticationFailedException
该错误就是说邮箱认证失败,但是明明用户名,密码正确,同时开启了stmp邮件服务,但还是报错,百度了好多找不到解决办法,最后用foxmail尝试客户端登录,发现了问题,使用163邮箱,连不上,说明163不提供该服务,然后qq邮箱是开启stmp之后会有一个独立密码,在这里,使用stmp 的时候必须使用独立密码,新浪的好像可以,没试
这里顺便贴一下,我结合网上的例子,写的发送邮件的代码
邮件验证类
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
*
* ClassName: MyAuthenticator
* @Description: 邮箱验证类,重写PasswordAuthentication方法
* @author
* @date 2015-10-13
*/
public class MyAuthenticator extends Authenticator{
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//重写
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
}
2.class根目录下 的配置文件email.propertis
mail.smtp.host=smtp.qq.com
mail.smtp.port=25
userName=*****@qq.com
password=******
mail.smtp.auth=true
邮件发送类
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import org.junit.Test;
/**
*
* ClassName: SendMail
* @Description: 邮箱发送类
* @author
* @date 2015-10-13
*/
public class SendMail {
@Test
public void sendMail() throws IOException{
//接收者 的邮箱地址
String to = "*****@qq.com";
//邮件主题
String subject = "test";
//邮件内容
String content = "www.baidu.com";
//发送的附件
File sendFile = new File("f://345.txt");
//邮箱验证
MyAuthenticator authenticator = null;
//读取配置文件
Properties properties = new Properties();
//根据class获取配置文件的位置
InputStream in = null;
try {
in = Object.class.getResourceAsStream("/email.propertis");
properties.load(in);
authenticator = new MyAuthenticator();
authenticator.setUserName(properties.getProperty("userName"));
authenticator.setPassword(properties.getProperty("password"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(in!=null){
in.close();
}
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session
.getDefaultInstance(properties, authenticator);
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from;
Address toUser;
try {
from = new InternetAddress(properties.getProperty("userName"));
//输入发送者邮箱地址
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
toUser = new InternetAddress(to);
mailMessage.setRecipient(Message.RecipientType.TO, toUser);
//设置邮件消息的主题
mailMessage.setSubject(subject);
//设置内容
//mailMessage.setText(content);
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(content, "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
// 添加附件的内容
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(sendFile);
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(sendFile.getName()));
multipart.addBodyPart(attachmentBodyPart);
// 将multipart对象放到message中
mailMessage.setContent(multipart);
// 保存邮件
mailMessage.saveChanges();
//发送邮件
Transport.send(mailMessage);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import org.junit.Test;
/**
*
* ClassName: SendMail
* @Description: 邮箱发送类
* @author
* @date 2015-10-13
*/
public class SendMail {
@Test
public void sendMail() throws IOException{
//接收者 的邮箱地址
String to = "*****@qq.com";
//邮件主题
String subject = "test";
//邮件内容
String content = "www.baidu.com";
//发送的附件
File sendFile = new File("f://345.txt");
//邮箱验证
MyAuthenticator authenticator = null;
//读取配置文件
Properties properties = new Properties();
//根据class获取配置文件的位置
InputStream in = null;
try {
in = Object.class.getResourceAsStream("/email.propertis");
properties.load(in);
authenticator = new MyAuthenticator();
authenticator.setUserName(properties.getProperty("userName"));
authenticator.setPassword(properties.getProperty("password"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(in!=null){
in.close();
}
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session
.getDefaultInstance(properties, authenticator);
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from;
Address toUser;
try {
from = new InternetAddress(properties.getProperty("userName"));
//输入发送者邮箱地址
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
toUser = new InternetAddress(to);
mailMessage.setRecipient(Message.RecipientType.TO, toUser);
//设置邮件消息的主题
mailMessage.setSubject(subject);
//设置内容
//mailMessage.setText(content);
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(content, "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
// 添加附件的内容
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(sendFile);
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(sendFile.getName()));
multipart.addBodyPart(attachmentBodyPart);
// 将multipart对象放到message中
mailMessage.setContent(multipart);
// 保存邮件
mailMessage.saveChanges();
//发送邮件
Transport.send(mailMessage);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
好了,邮箱发送就ok了