import java.security.Security;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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;
import com.wzinfo.base.util.Tools;
public class SendMail
{
private String smtphost = null; // smtp主机
private String username = null; // smtp认证用户
private String password = null; // smtp用户密码
private String encoding = null; // 邮件编码
private String subject = null; // 邮件主题
private String content = null; // 邮件内容
private String from = null; // 邮件发送于
private StringBuffer affixs = new StringBuffer(300); // 邮件附件
private StringBuffer tomails = new StringBuffer(600); // 发送邮件到
private StringBuffer ccmails = new StringBuffer(100); // 抄送邮件到
private StringBuffer bccmails = new StringBuffer(100); // 暗送邮件到
private StringBuffer msg = new StringBuffer(600); // 发送消息
private Properties props = System.getProperties(); // 系统属性
public SendMail()
{
}
public void setTO(String mails)
{
tomails.append(filterMails(0, mails));
}
public void setCC(String mails)
{
ccmails.append(filterMails(1, mails));
}
public void setBCC(String mails)
{
bccmails.append(filterMails(2, mails));
}
public String filterMails(int type, String mails)
{
List list = splitAsMail(mails);
int num = list.size();
if (num < 1) return "";
StringBuffer sb = new StringBuffer();
if (type == 0) sb.append(tomails); // TO
else if (type == 1) sb.append(ccmails); // CC
else if (type == 2) sb.append(bccmails); // BCC
else return "";
if (sb.length() < 1) sb.append(",");
for (int i = 0; i < num; i++)
{
String[] vals = new String[2];
vals[0] = Tools.toStr(list.get(i));
int pos = vals[0].indexOf("<");
if (pos < 0) vals[1] = vals[0];
else vals[1] = Tools.lower(vals[0].substring(0, pos));
if (sb.indexOf("," + vals[1] + ",") < 0) sb.append(vals[1]).append(",");
}
list = null;
return sb.toString();
}
public int setAffix(String file)
{
List list = splitAsFile(file);
int num = list.size();
if (num < 1) return 0;
for (int i = 0; i < num; i++)
affixs.append(Tools.toStr(list.get(i))).append(";");
list = null;
return num;
}
public void setFrom(String mail)
{
from = mail; //只能是单一的邮箱.
}
public void setSendAuthInfo(String smtp, String user, String pswd)
{
smtphost = smtp;
username = user;
password = pswd;
}
public void setSubject(String str)
{
subject = str; // 邮件主题
}
public void setContent(String str)
{
content = str; // 邮件内容
}
public void setEncoding(String str)
{
encoding = str; // 邮件编码
}
private List splitAsMail(String mails)
{
List list = new ArrayList(50);
if (mails == null || mails.trim().length() < 5) return list;
String email = null; // 过滤空格,逗号,分号为坚线
email = Tools.replace(mails, ";", ",");
StringTokenizer token = new StringTokenizer(email, ",");
while (token.hasMoreTokens())
{
email = Tools.toStr(token.nextToken());
if (email.length() > 5)
{
int pos = email.indexOf("<");
if (pos < 0 && Tools.isMail(email)) list.add(email);
else if (pos > -1 && Tools.isMail(email.substring(0, pos))) list.add(email);
else msg.append("/n邮箱无效 - ").append("[").append(email).append("]");
}
}
return list;
}
private List splitAsFile(String files)
{
List list = new ArrayList(9);
if (files == null || files.trim().length() < 1) return list;
String file = null; // 过滤逗号为分号
file = Tools.replace(files, ",", ";");
StringTokenizer token = new StringTokenizer(file, ";");
while (token.hasMoreTokens())
{
file = Tools.toStr(token.nextToken());
if (Tools.isFile(file)) list.add(file);
else if (file.length() < 1) msg.append("/n文件无效 - ").append("[").append(file).append("]");
}
return list;
}
private InternetAddress[] parseAddress(String mails)
{
InternetAddress[] address = null;
try
{
address = InternetAddress.parse(mails);
}
catch (Exception e)
{
msg.append("/n解析邮件地址出错 - ").append("[").append(mails).append("]");
}
return address;
}
public String getMsg()
{
return msg.toString();
}
private long cost(long start)
{
return System.currentTimeMillis() - start;
}
public boolean send()
{
long start = System.currentTimeMillis();
boolean test = true;
props.put("mail.smtp.host", toStr(smtphost, "stmp.163.com"));
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, null);
Message mmsg = new MimeMessage(session);
try
{
//邮件发出人
if (test) mmsg.setFrom(new InternetAddress(toStr(from, "liujy_mail@163.com")));
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件发送人[setFrom]出错");
}
// 邮件发送到
try
{
if (test)
{
InternetAddress[] address = parseAddress(tomails.toString());
int num = (address == null?0:address.length);
if (num < 1)
{
test = false;
msg.append("/n设置邮件接收者[无接收者]出错/n");
}
else
{
mmsg.addRecipients(Message.RecipientType.TO, address);
}
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件接收者[setTo]出错");
}
// 邮件抄送人
try
{
if (test)
{
InternetAddress[] address = parseAddress(ccmails.toString());
//int num = (address == null?0:address.length);
mmsg.addRecipients(Message.RecipientType.CC, address);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件抄送者[setCC]出错");
}
// 邮件暗送人
try
{
if (test)
{
InternetAddress[] address = parseAddress(bccmails.toString());
//int num = (address == null?0:address.length);
mmsg.addRecipients(Message.RecipientType.BCC, address);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件暗送者[setBCC]出错");
}
// 邮件主题
try
{
if (test) mmsg.setSubject(toStr(subject, "No Subject"));
}
catch (Exception e)
{
test = false;
msg.append("/n设置主题[setSubject]出错");
}
Multipart mpart = new MimeMultipart();
// 设置邮件正文
try
{
if (test)
{
String str = toStr(encoding, "utf-8");
BodyPart part = new MimeBodyPart();
part.setContent("<meta http-equiv=Content-Type content=text/html;charset=" + str
+ ">" + toStr(content), "text/html;charset=" + str);
mpart.addBodyPart(part);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件正文[setContent]出错");
}
// 设置邮件附件
try
{
List list = splitAsFile(affixs.toString());
int num = list.size();
if (num < 1) msg.append("/n没有附件附带发送");
if (num > 0 && test)
{
for (int i = 0; i < num; i++)
{
BodyPart part = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(toStr(list.get(i)));
part.setDataHandler(new DataHandler(fileds));
part.setFileName(fileds.getName());
mpart.addBodyPart(part);
}
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件附件[FileAffix]出错");
}
try
{
msg.append("/n@@ -- 发送邮件设置结束 设置用时:").append(cost(start));
start = System.currentTimeMillis();
mmsg.setSentDate(new Date());
mmsg.setContent(mpart);
mmsg.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(toStr(smtphost, "stmp.163.com"), toStr(username, "liujy_mail"), toStr(password, "***"));
transport.sendMessage(mmsg, mmsg.getRecipients(Message.RecipientType.TO));// Transport.send(mimeMsg);
transport.close();
}
catch (Exception e)
{
test = false;
msg.append("/n@@ -- 邮件发送失败/n").append(e.toString());
}
finally
{
msg.append("/n@@ -- 发送邮件操作完成[");
msg.append( (test?"成功":"失败"));
msg.append("] 发送用时:").append(cost(start));
}
return test;
}
public void setGmailAuthInfo(String user, String pswd)
{
username = user;
password = pswd;
}
public boolean sendGmail()
{
long start = System.currentTimeMillis();
boolean test = true;
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties gprops = System.getProperties();
gprops.setProperty("mail.smtp.host", "smtp.gmail.com");
gprops.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
gprops.setProperty("mail.smtp.socketFactory.fallback", "false");
gprops.setProperty("mail.smtp.port", "465");
gprops.setProperty("mail.smtp.socketFactory.port", "465");
gprops.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(gprops, new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(toStr(username, "liujy.mail"), toStr("****"));
}
});
Message mmsg = new MimeMessage(session);
// 邮件发出人
try
{
if (test) mmsg.setFrom(new InternetAddress(toStr(from, "liujy.mail@gmail.com")));
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件发送人[setFrom]出错");
}
// 邮件发送到
try
{
if (test)
{
InternetAddress[] address = parseAddress(tomails.toString());
int num = (address == null?0:address.length);
if (num < 1)
{
test = false;
msg.append("/n设置邮件接收者[无接收者]出错/n");
}
else
{
mmsg.addRecipients(Message.RecipientType.TO, address);
}
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件接收者[setTo]出错");
}
// 邮件抄送人
try
{
if (test)
{
InternetAddress[] address = parseAddress(ccmails.toString());
//int num = (address == null?0:address.length);
mmsg.addRecipients(Message.RecipientType.CC, address);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件抄送者[setCC]出错");
}
// 邮件暗送人
try
{
if (test)
{
InternetAddress[] address = parseAddress(bccmails.toString());
//int num = (address == null?0:address.length);
mmsg.addRecipients(Message.RecipientType.BCC, address);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件暗送者[setBCC]出错");
}
// 邮件主题
try
{
if (test) mmsg.setSubject(toStr(subject, "No Subject"));
}
catch (Exception e)
{
test = false;
msg.append("/n设置主题[setSubject]出错");
}
Multipart mpart = new MimeMultipart();
// 设置邮件正文
try
{
if (test)
{
String str = toStr(encoding, "utf-8");
BodyPart part = new MimeBodyPart();
part.setContent("<meta http-equiv=Content-Type content=text/html;charset=" + str
+ ">" + toStr(content), "text/html;charset=" + str);
mpart.addBodyPart(part);
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件正文[setContent]出错");
}
// 设置邮件附件
try
{
List list = splitAsFile(affixs.toString());
int num = list.size();
if (num < 1) msg.append("/n没有附件附带发送");
if (num > 0 && test)
{
for (int i = 0; i < num; i++)
{
BodyPart part = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(toStr(list.get(i)));
part.setDataHandler(new DataHandler(fileds));
part.setFileName(fileds.getName());
mpart.addBodyPart(part);
}
}
}
catch (Exception e)
{
test = false;
msg.append("/n设置邮件附件[FileAffix]出错");
}
try
{
msg.append("/n@@ -- 发送Gmail邮件设置结束 设置用时:").append(cost(start));
start = System.currentTimeMillis();
mmsg.setSentDate(new Date());
mmsg.setContent(mpart);
mmsg.saveChanges();
mmsg.setSentDate(new Date());
Transport.send(mmsg);
}
catch (Exception e)
{
test = false;
msg.append("/n@@ -- Gmail邮件发送失败/n").append(e.toString());
}
finally
{
msg.append("/n@@ -- Gmail发送邮件操作完成[");
msg.append( (test?"成功":"失败"));
msg.append("] Gmail发送用时:").append(cost(start));
}
return true;
}
private String toStr(Object obj)
{
return (obj==null?"":obj.toString().trim());
}
private String toStr(Object obj, String val)
{
String str = toStr(obj);
if (str.length()<1) return toStr(val);
return str;
}
public static void main(String[] args)
{
SendMail send = new SendMail();
send.setFrom("wu198751@163.com");
send.setTO("wu198751@163.com");
send.setSubject("mail send post ~ ");
send.setContent("mail send post ~ ");
//send.setAffix("D://eclipse//eclipse_workspace//VSS_WZTEST//src.rar");
send.setSendAuthInfo("smtp.163.com", "wu198751", "wuhao198751");
boolean test = send.send();
if (test) System.out.println("邮件发送成功! " + send.getMsg());
else System.err.println("邮件发送失败! " + send.getMsg());
}