最近刚看到csdn的前辈用java mail 发送邮件,也出于对javamail.jar发邮件了解,参数考csdn的前辈相关代码,成功发邮件成功,在这里将其中遇到的问题简单说明 一下,希望对不刚接触的朋友们有锁帮助。
1.javaMail的简介
JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另行下载。另外,JavaMail依赖JAF(JavaBeans Activation Framework),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。
JavaMail.jar 包下载地址:http://www.oracle.com/technetwork/java/index-138643.htmln
JAF jar包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html
JavaMail包含两部分内容,一部分是JavaMail API,定义了一组平台无关、独立于通讯协议的邮件程序框架,该部分称为应用级接口,也就是供我们调用的部分,另一部分是service provider,该部分使用特定的协议语言来实现第一部分定义的抽象类和接口,这些协议包括:SMTP、NNTP、POP3、IMAP,如果让JavaMail与邮件服务器通信,就需要相应的协议支持,该部分称为服务提供者接口,也就是JavaMail自身需要的协议支持.
javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等
javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等
javax.mail.Transport:连接邮件SMTP服务器,发送邮件
javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件
2.javaMail的发邮件相关代码(引用csdn前辈的代码)
下边 是测试发邮件用到的包
package com.test;
import java.util.Properties;
/***
* 测试邮件的vo类
* @author tyz007
*
*/
public class MailSenderInfo {
// 发送邮件的服务器的IP(或主机地址)
private String mailServerHost;
// 发送邮件的服务器的端口
private String mailServerPort;
// 发件人邮箱地址
private String fromAddress;
// 收件人邮箱地址
private String toAddress;
// 登陆邮件发送服务器的用户名
private String userName;
// 登陆邮件发送服务器的密码
private String password;
// 是否需要身份验证
private boolean validate = false;
// 邮件主题
private String subject;
// 邮件的文本内容
private String content;
// 邮件附件的文件名
private String[] attachFileNames;
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 String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] attachFileNames) {
this.attachFileNames = attachFileNames;
}
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
}
package com.test;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 邮箱用户名和密码认证器
*/
public class MyAuthenticator extends Authenticator {
String userName = null;
String password = null;
public MyAuthenticator() {
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
}
package com.test;
import java.util.Date;
import java.util.Properties;
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.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* 用来发送邮件类。
*
*/
public class SimpleMailSender {
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO, to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送邮件
Transport transport = sendMailSession.getTransport("smtp");
//Transport.send(mailMessage);
transport.connect(pro.getProperty("mail.smtp.host"), mailInfo.getUserName(), mailInfo.getPassword());
transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
transport.close();
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/***
* 好一个html的邮件
* @param mailInfo
* @return
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo) {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
// 如果需要身份认证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO, to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
}
package com.test;
/**
* 测试发邮件的类
*
*/
public class SendMailDemo {
public static void main(String[] args) {
// 设置邮件服务器信息
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.qq.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
// 邮箱用户名
mailInfo.setUserName("xxxxx@qq.com");
// 邮箱密码
mailInfo.setPassword("xxxx");
// 发件人邮箱
mailInfo.setFromAddress("xxxx@qq.com");
// 收件人邮箱
mailInfo.setToAddress("xxxxx@qq.com");
// 邮件标题
mailInfo.setSubject("测试Java程序发送邮件");
// 邮件内容
StringBuffer buffer = new StringBuffer();
buffer.append("JavaMail.jar包下载地址:http://www.oracle.com/technetwork/java/index-138643.htmln");
buffer.append("JAF 1.1.1 jar包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html");
mailInfo.setContent(buffer.toString());
// 发送邮件
SimpleMailSender sms = new SimpleMailSender();
// 发送文体格式
sms.sendTextMail(mailInfo);
// 发送html格式
// SimpleMailSender.sendHtmlMail(mailInfo);
System.out.println("邮件发送完毕");
}
}
以上是引用别的人代码,在测试时遇到的了问题 javax.mail.AuthenticationFailedException: 535 Error: authentication failed, system busy,这个意思是说 认证败。以下是处理问题过程(本机是win7系统)
1)第一步:确认邮件服务 ip host 是否正确()
在用cdm输入 : telnet smtp.qq.com 25 来测试端口是否正常 出现下图表现ok
注意,wind7系统 cmd 中输入 telnet 出提示不是内部命令,处理方法如下:
这是因为一般情况下win7 系统默认此项不被选中 只要我们在控制面板找到此项然后将前面的对勾点上就可以了
下面我们以win7旗舰版为例进行操作:
然后我们再打开程序和功能的打开或关闭windows功能
然后把相应的Telnet点上就可以了
这样在运行就国ok了。
2)第二步:确认你的发件账号与密码 、收件人的相关信息(自行检查一下ok)
3)第三步:发送邮件的时候使用了smtp服务,出现这种异常很有可能是使用的邮件服务器没有开启smtp服务。QQ邮箱smtp服务默认关闭,可以在邮箱的设置—>账户中开启就好。(测试时问题就出在这里)
QQ邮箱开启smtp服务如下:
引用百度的内容:http://jingyan.baidu.com/article/0f5fb099dffe7c6d8334ea31.html;为人直关,本人在这里在ctrl+v一下。
首先要确保你的QQ邮箱已经要开启超过一个月。对于新开启的邮箱,腾讯是不开放这些功能的.
-
进入mail.qq.com邮箱后点击顶部的设置按钮
-
点击二级目录“账户” 拉到中下部 把这两项勾上
-
QQ邮箱 POP3 和 SMTP 服务器地址设置如下:邮箱POP3服务器(端口110)SMTP服务器(端口25)qq.compop.qq.comsmtp.qq.comSMTP服务器需要身份验证。
如果是设置POP3和SMTP的SSL加密方式,则端口如下:
POP3服务器(端口995) 收邮件服务器
SMTP服务器(端口465或587) 发邮件服务器
-
如果你是wordpress用户可以使用SMTP邮箱插件。参见:
http://jingyan.baidu.com/article/ca2d939dc65a86eb6c31cea4.html
按照这样支排查,最终成功发送邮件成功
这就是本人初步接触java发邮件时相关问题处理,希望对刚接触javaMail.jar发邮件的同鞋有些帮助。