项目用到Java程序发送Email邮件从网上查了一些资料自己整理一个Demo 供大家参考
此邮件实现功能: 单发、群发邮件,可以带多个附件。欢迎拍砖
1、需要用到的jar包和项目的目录结构
需要自己准备以下两个jar,google自己搜地址
activation.jar
mail.jar
Code代码实现
-----------------------------------------------------------发送邮件需要的基本信息-----------------------------------------------------
/**
* java邮件测试
* @author Administrator
*
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;
import javax.mail.internet.MimeUtility;
/**
* 发送邮件需要的基本信息
*
*/
public class MailTest {
private String mailServerHost; //发送邮件的服务器
private String mailServerPort="25"; //发送邮件的服务器的端口
private String fromAddress; //发送者地址
private String toAddress; //接收者地址
private String username; //发送者用户名
private String password; //发送者密码
private boolean validate=true; //是否需要身份验证
private String subject; //邮件主题
private String content; //邮件内容
private Map<String, String> mailType; //邮箱类型
private String filename = "";// 附件文件名
private Vector file = new Vector();// 附件文件集合
/**
* 得到邮件会话属性
*
*/
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;
}
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;
this.fromAddress=username;
if(username!=null&&username.length()>0){
String fromEmailExt=username.substring(username.lastIndexOf("@")+1,username.lastIndexOf("."));
this.mailServerHost=getMailType().get(fromEmailExt);
}
}
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 Map<String, String> getMailType() {
mailType=new HashMap<String, String>();
mailType.put("163","smtp.163.com");
mailType.put("139","smtp.139.com");
mailType.put("126","smtp.126.com");
mailType.put("qq", "smtp.qq.com");
mailType.put("sohu", "smtp.sohu.com");
mailType.put("live","smtp.live.cn");
mailType.put("msn","smtp.msn.com");
mailType.put("kum", "mail.kum.net.cn");
mailType.put("hotmail","smtp.hotmail.cn");
return mailType;
}
public void setMailType(Map<String, String> mailType) {
this.mailType = mailType;
}
public void attachfile(String fname) {
file.addElement(fname);
}
public Vector getFile() {
return file;
}
public void setFile(Vector file) {
this.file = file;
}
/**
*
* 方法说明:把主题转换为中文
* 输入参数:String strText
* 返回类型:
*/
public String transferChinese(String strText) {
try {
strText = MimeUtility.encodeText(new String(strText.getBytes(),
"GB2312"), "GB2312", "B");
} catch (Exception e) {
e.printStackTrace();
}
return strText;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
}
------------------------------发邮件时的身份验证器-------------------------------
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 发邮件时的身份验证器
*/
public class CardId extends Authenticator{
String userName = null;
String password = null;
public CardId(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
}
----------------------- 邮件发送器类,也是主体部分 ---------------------------
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
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 MailContent{
/**
* 根据邮件会话属性和密码验证器构造一个发送邮件的session
* @return
*/
protected static Session getSession(MailTest MailTest){
if(MailTest == null){
return null;
}
CardId authenticator = null;
Properties pro = MailTest.getProperties();
if(MailTest.isValidate()){
authenticator = new CardId(MailTest.getUsername(),MailTest.getPassword());
}
return Session.getDefaultInstance(pro, authenticator);
}
/**
* 发送文本格式邮件
* @return
*/
public static boolean sendTextMail(MailTest MailTest){
try {
//得到session
Session mailSession = getSession(MailTest);
//根据session创建一个邮件消息
Message mailMessage=new MimeMessage(mailSession);
//创建邮件发送者的地址
Address fromAddress=new InternetAddress(MailTest.getFromAddress());
//设置邮件发送者的地址
mailMessage.setFrom(fromAddress);
//1、创建邮件接收者的地址(只能给一个用户发送邮件)
// Address toAddress=new InternetAddress(MailTest.getToAddress());
//设置邮件接收者地址
//mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
//2、创建邮件接收者的地址(可以给多个用户同时发送邮件 不同接受者之间用,隔开)
mailMessage.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(MailTest.getToAddress())) ;
//设置邮件的主题(转成中文)
mailMessage.setSubject(MailTest.getSubject());
// mailMessage.setSubject(MailTest.transferChinese(MailTest.getSubject()));
//设置邮件的发送内容
mailMessage.setText(MailTest.getContent());
//设置发送邮件的时间
mailMessage.setSentDate(new Date());
//发送邮件
Transport.send(mailMessage);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 发送html格式邮件
* @return
*/
public static boolean sendHtmlMail(MailTest MailTest) {
try {
//得到session
Session mailSession = getSession(MailTest);
//根据session创建一个邮件消息
Message mailMessage = new MimeMessage(mailSession);
//创建邮件发送者的地址
Address fromAddress=new InternetAddress(MailTest.getFromAddress());
//设置邮件发送者的地址
mailMessage.setFrom(fromAddress);
// //1、创建邮件接收者的地址
// Address toAddress=new InternetAddress(MailTest.getToAddress());
// //设置邮件接收者地址(可以给一个用户发送邮件)
// mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
//2、创建邮件接收者的地址(可以给多个用户同时发送邮件 不同接受者之间用,隔开)
mailMessage.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(MailTest.getToAddress())) ;
//设置邮件的主题(转成中文)
mailMessage.setSubject(MailTest.getSubject());
// mailMessage.setSubject(MailTest.transferChinese(MailTest.getSubject()));
//设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
//MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
//创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
//设置HTML内容
html.setContent(MailTest.getContent(), "text/html; charset=UTF-8");
//将内容添加到容器对象中
mainPart.addBodyPart(html);
// 向Multipart添加附件
Vector file=MailTest.getFile();
String filename=MailTest.getFilename();
Enumeration efile = file.elements();
while (efile.hasMoreElements()) {
MimeBodyPart mbpFile = new MimeBodyPart();
filename = efile.nextElement().toString();
FileDataSource fds = new FileDataSource(filename);
mbpFile.setDataHandler(new DataHandler(fds));
//这个方法可以解决附件乱码问题
String filename1= new String(fds.getName().getBytes(),"ISO-8859-1");
mbpFile.setFileName(filename1);
// 向MimeMessage添加(Multipart代表附件)
mainPart.addBodyPart(mbpFile);
}
file.removeAllElements();
//将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
//发送邮件
Transport.send(mailMessage);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
--------------------------------------- 测试 -----------------------------------------
/**
* 测试类
*
*/
public class SendMessage{
public void test() {
MailTest senderInfo=new MailTest();
senderInfo.setUsername("809044093@qq.com"); //用户名
senderInfo.setPassword("809044093"); //密码(这里写你自己邮箱的密码 ^_^)
senderInfo.setToAddress("245173677@qq.com,809044093@qq.com");//接收者(如果是多个邮箱 每个邮箱之间用,分割)
senderInfo.setSubject("这是群发邮件主题"); //主题
senderInfo.setContent("<a href='http://blog.csdn.net/prefectjava'>点击此处查看更多内容</a>"); //内容
senderInfo.attachfile("d:\\1.txt");
senderInfo.attachfile("d:\\index.html");//如果还有附件继续累加即可,格式不限制
//发送(HTML格式的)
MailContent.sendHtmlMail(senderInfo);
//发送纯文本格式
// MailContent.sendTextMail(senderInfo);
}
public static void main(String[] args) {
new SendMessage().test();
}
}
以上为具体代码实现。
PS:程序时发现了以下两个些错误,贴出来跟大家分享分享
希望对大家有帮助。错误一:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解决方法:到D:\MyEclipse 6.5
\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806
\data\libraryset\EE_5目录下找到javaee.jar删除其中到mail文件夹。
错误二:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream
解决方法:
下载mail.jar和activation.jar文件加入到工程中。
错误三:
如果出现 以下异常
javax.mail.AuthenticationFailedException
检查是否邮箱的用户名 、密码错误。
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
★这个身份验证的是重写的父类的方法,方法名不要自己定义 否则出错