赞
踩
Java测试发送邮件的时候经常出现异常,检查多次账户名密码无误后,依然出现如下图错误: 之前不清楚,后面在网上得到提醒,我们所使用的smtp服务器使用的密码与我们自身登录网页端邮箱的密码是不一样的,以163邮箱为例,当我们设置打开smtp服务时会要求我们设
前言
本文章实现的发送邮件功能提供三个方法:只发送简单文本信息的邮件、发送HTML格式的邮件、发送可以附带多个附件的邮件。
以前使用Java实现邮箱功能都是依靠别人的jar包,按照别人的规则来使用,如果你只满足于用Java来发送简单文本信息的邮件,可以参考这位大神的博客:
http://www.ykmaiz.com/article/Javabiancheng/2012/1127/194.html
如果想了解JavaMail到底如何实现,或者是想发送能带多个附件的邮件,请往下看。
准备好mail.jar,这个jar包网上很多,很容易就能下载到。 编码 1.编写MailSenderInfo.java public class MailSenderInfo {
// 用来保存发送邮件所有信息的JavaBean
// 发送邮件的服务器地址和端口号
private String mailServerHost;
private String mailServerPort;
// 邮件发送者的邮箱地址
private String fromAddress;
// 邮件接收者的邮箱地址
private String toAddress;
// 登录发送邮件服务器的用户名和密码
private String userName;
private String password;
// 是否需要身份验证
private boolean validate;
// 邮件的主题
private String subject;
// 邮件的文本内容
private String content;
// 邮件的附件
private File[] accessorys;
// getter()和setter()方法
// 获取邮件会话属性
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", mailServerHost);
p.put("mail.smtp.port", mailServerPort);
p.put("mail.smtp.auth", (validate ? "true" : "false"));
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
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;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public File[] getAccessorys() {
return accessorys;
}
public void setAccessorys(File[] accessorys) {
this.accessorys = accessorys;
}} 2.编写MailSender类: public class MailSender {
// 只发送简单文本形式的邮件
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要身份验证
MyAuthenticator authenticator = null;
Properties p = mailInfo.getProperties();
// 如果需要身份验证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(p, authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者的地址
Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(fromAddress);
// 创建邮件接收者的地址
Address toAddress = new InternetAddress(mailInfo.getToAddress());
// 设置邮件消息的接收者
mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息的发送时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
mailMessage.setText(mailInfo.getContent());
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
// 发送HTML形式的邮件
public boolean sendHtmlMail(MailSenderInfo mailInfo) {
// 判断是否需要身份验证
MyAuthenticator authenticator = null;
Properties p = mailInfo.getProperties();
// 如果需要身份验证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(p, authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者的地址
Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(fromAddress);
// 创建邮件接收者的地址
Address toAddress = new InternetAddress(mailInfo.getToAddress());
// 设置邮件消息的接收者
mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息的发送时间
mailMessage.setSentDate(new Date());
// MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML的内容
html.setContent(mailInfo.getContent(), "text/html;charset=utf-8");
mainPart.addBodyPart(html);
// 将MimeMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
// 发送带附件的邮件
public boolean sendAccessoryMail(MailSenderInfo mailInfo) {
// 判断是否需要身份验证
MyAuthenticator authentic1、注册一个网易邮箱,开通smtp服务,作为发送邮件的邮箱服务器 2、jar包准备commons-email-1.3.3.jar,activation.jar等,源码有提供 3、准备工作 //设置smtp host,QQ邮箱邮件服务器为smtp.qq.com,此处为163 邮箱
private static final String HostName = "ator = null;
Properties p = mailInfo.getProperties();
// 如果需要身份验证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(p, authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者的地址
Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(fromAddress);
// 创建邮件接收者的地址
Address toAddress = new InternetAddress(mailInfo.getToAddress());
// 设置邮件消息的接收者
mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息的发送时间
mailMessage.setSentDate(new Date());
// MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个MimeBodyPart来包含普通文本
BodyPart text = new MimeBodyPart();
// 设置text的内容
text.setContent(mailInfo.getContent(), "text/html;charset=utf-8");
mainPart.addBodyPart(text);
File[] files = mailInfo.getAccessorys();
if (files.length != 0) {
for (int i = 0; i < files.length; i++) {
// 创建一个MimeBodyPart来包含附件
BodyPart accessory = new MimeBodyPart();
DataSource source = new FileDataSource(files[i]);
accessory.setDataHandler(new DataHandler(source));
accessory.setFileName(MimeUtility.encodeWord(files[i].getName()));
mainPart.addBodyPart(accessory);
}
}
// 将MimeMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}} 3.编写MyAuthenticator.java public class MyAuthenticator extends Authenticator {
// 身份验证
private String userName;
private String password;
public MyAuthenticator() {
}
public MyAuthenticator(String userName, String password) {
this.userName = userName;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}} 4.编写测试类Test.java public class Test {
public static void main(String[] args) {
// sendTextMail();
// sendHtmlMail();
sendAccessoryMail();
}
public static void sendTextMail() {
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.163.com");
mailInfo.setMailServerPort("25");
// 现在邮箱服务器都是需要身份验证的,所以一直设置为true
mailInfo.setValidate(true);
// 使用mailInfo.setUserName("150402");也可以
mailInfo.setUserName("150402@163.com");
mailInfo.setPassword("zhan1");
// 必须是邮件发送者的准确地址
mailInfo.setFromAddress("150402@163.com");
mailInfo.setToAddress("1563478@qq.com");
mailInfo.setSubject("测试邮件");
mailInfo.setContent("这里是测试邮件的内容!");
// 发送邮件
MailSender sender = new MailSender();
// 发送文本邮件
sender.sendTextMail(mailInfo);
System.out.println("邮件发送成功!");
}
public static void sendHtmlMail() {
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.163.com");
mailInfo.setMailServerPort("25");
// 现在邮箱服务器都是需要身份验证的,所以一直设置为true
mailInfo.setValidate(true);
// 使用mailInfo.setUserName("150402");也可以
mailInfo.setUserName("150402@163.com");
mailInfo.setPassword("zhan1");
// 必须是邮件发送者的准确地址
mailInfo.setFromAddress("150402@163.com");
mailInfo.setToAddress("1563478@qq.com");
mailInfo.setSubject("测试邮件");
// 添加HTML内容
mailInfo.setContent("加粗了!
// 发送邮件
MailSender sender = new MailSender();
// 发送文本邮件
sender.sendHtmlMail(mailInfo);
System.out.println("邮件发送成功!");
}
public static void sendAccessoryMail() {
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.163.com");
mailInfo.setMailServerPort("25");
// 现在邮箱服务器都是需要身份验证的,所以一直设置为true
mailInfo.setValidate(true);
// 使用mailInfo.setUserName("150402");也可以
mailInfo.setUserName("150402@163.com");
mailInfo.setPassword("zhan1");
// 必须是邮件发送者的准确地址
mailInfo.setFromAddress("150402@163.com");
mailInfo.setToAddress("1563478@qq.com");
mailInfo.setSubject("测试邮件加上附件");
// 添加HTML内容
mailInfo.setContent("加粗了!
File[] files = { new File("c:\\2.png"), new File("c:\\1.png") };
// 添加附件
mailInfo.setAccessorys(files);
// 发送邮件
MailSender sender = new MailSender();
// 发送文本邮件
sender.sendAccessoryMail(mailInfo);
System.out.println("邮件发送成功!");
}} 运行结果 只发送普通文本信息邮件:
发送HTML形式的邮件:
发送带多个附件的邮件:
整个工程截图:
结束
当然了,上面的测试类是无比粗糙的,完全可以采用构造方法将入口封装起来,然后导出为一个jar包,这样我也是可以提供jar包和规则给别人用的人了。
注意,上述测试类中的邮箱服务器,邮箱账号,密码都必须改成你个人的才能正常使用。 参考 http://www.blogjava.net/wangfun/archive/2009/04/15/265748.html http://blog.csdn.net/jbxiaozi/article/details/7351768 http://blog.sina.com.cn/s/blog_7cc3b8db010115nf.html http://www.cnblogs.com/yejg1212/archive/2013/06/01/3112702.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。