虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件。除此以外,你还需要有Sun的JavaBeans Activation Framework (JAF)。JavaBeans Activation Framework的运行很复杂,在这里简单的说就是JavaMail的运行必须得依赖于它的支持.
JavaMail是可选包,因此如果需要使用的话你需要首先从java.sun.com下载。目前最新版本是JavaMail1.4,使用JavaMail的时候需要Javabean Activation Framework的支持,因此你也需要下载JAF.
JavaMail包中用于处理电子邮件的核心Session,Message,Address,Authenticator,Transport,Store,Folder
等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。
另外很好的实现了JavaMail API的框架有James、Spring Mail。
首先分享一下各大邮件服务器(pop3,smtp)的地址
sina邮箱:
收件:pop3.sina.com默认端口110
发件:smtp.sina.com默认端口25
任你邮邮箱服务器名称:
收信(POP3)服务器为:pop3.vip.sina.com
发信(SMTP) 服务器为:smtp.vip.sina.com
GMAIL谷歌
接收邮件 (POP3) 服务器 - 需要 SSL: pop.gmail.com
使用 SSL:是端口:995
发送邮件 (SMTP) 服务器 - 需要 TLS2 或 SSL: smtp.gmail.com(使用身份验证)
使用身份验证 TLS/STARTTLS 的端口:587 SSL 的端口:465
qq邮箱
POP3服务器(端口110)
SMTP服务器(端口25)
qq.com pop.qq.com smtp.qq.com
SMTP服务器需要身份验证。
如果是设置POP3和SMTP的SSL加密方式, POP3服务器(端口995)SMTP服务器(端口465或587)。
163网易邮箱服务器地址如下:
POP3服务器:pop.163.com
| SMTP服务器:smtp.163.com
| IMAP服务器:imap.163.com
POP3/SMTP/IMAP服务全部支持SSL连接
网易163免费邮箱相关服务器信息:
服务器信息: 端口信息:
pop.163.com SSL 995 非SSL 110
smtp.163.com SSL 465、994 非SSL 25
imap.163.com SSL 993 非SSL 143
雅虎
POP3和SMTP地址如下:
POP3: pop.alibaba.com.cn
SMTP: smtp.alibaba.com.cn
接受邮件
( session的构造 )
final String SSL_FACTORY="javax.net.ssl.SSLSocketFactory";
Properties props = new Properties();
props.setProperty("mail.pop3.host",recserver);
//是否需要SSL
if(null!=MAILADDR_REC_SSL && !"".equals(MAILADDR_REC_SSL) && "1".equals(MAILADDR_REC_SSL.toString())){
props.setProperty("mail.pop3.socketFactory.port",MAILADDR_REC_PORT);//ssl端口
props.setProperty("mail.pop3.port",MAILADDR_REC_PORT);
props.setProperty("mail.pop3.socketFactory.class",SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.fallback","false");
props.put("mail.smtp.starttls.enable","true");//开启安全设置
}
//是否进行验证
if(null!=smtpAuth && !"".equals(smtpAuth.trim()) && !"0".equals(smtpAuth)){
recSsion = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usercount,pass);
}
});
}else{
recSsion=Session.getInstance(props,null);
}
recSsion.setDebug(true);//开启调试模式
Store store = recSsion.getStore("pop3");store.connect(server, usercount, password);
Folder inbox = store.getFolder("inbox");
inbox.open(Folder.READ_WRITE); //以读写方式打开收件箱Message[] msgs = inbox.getMessages(); //获取邮件
if(deleteflag) //如果用户设置了接收后删除
msg.setFlag(Flags.Flag.DELETED, true); //是否接收后删除
String msgID=((MimeMessage)msg).getMessageID(); //邮件ID
String subject = msg.getSubject(); //邮件主题
InternetAddress[] addr =(InternetAddress[])msg.getFrom();
String senderadd = addr[0].getAddress(); //邮箱地址
String sendername = addr[0].getPersonal() ; //发送者名称
Date date = msg.getSentDate(); //发送时间
//获得邮件内容
Object obj = msg.getContent();
if(obj instanceof Multipart){
//邮件内容是复杂类型
Multipart objs =(Multipart)obj;
//组成部分个数
int j = objs.getCount();
for (int k = 0; k < j; k++) {
BodyPart bp = objs.getBodyPart(k);
//判断是否是附件类型
if(null != bp.getDisposition() && bp.getDisposition().equals(BodyPart.ATTACHMENT)){
String finame_show =bp.getFileName(); //附件名称
finame_show=MimeUtility.decodeText(new String(finame_show.getBytes("ISO8859-1"),"GBK"));//转码
InputStream inputStream = bp.getInputStream();//获得流
。。。保存文件
//判断是否是内敛类型
}else if(null != bp.getDisposition() && bp.getDisposition().equals(BodyPart.INLINE)){
//邮件内容
content=content+String.valueOf(bp.getContent());
}
}else{
content=String.valueOf(obj);
}
//关闭邮箱
inbox .close(true);
store .close();
SSL安全连接下与非SSL的区别
props.put("mail.smtp.auth", "true");//是否验证
if(null != MAILADDR_SEND_SSL && !"".equals(MAILADDR_SEND_SSL)&& "1".equals(MAILADDR_SEND_SSL)){
// 需要重新的设定SMTP的端口:
props.put("mail.smtp.socketFactory.port",MAILADDR_SEND_PORT);
props.put("mail.smtp.socketFactory.class",SSL_FACTORY);
props.put("mail.smtp.socketFactory.fallback","false");
// 当SMTP需要SSL验证时,需要设定,如果不设定,关键会出现如下异常 com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first
props.put("mail.smtp.starttls.enable","true");
}
if(null!=smtpAuth && !"".equals(smtpAuth.trim()) && !"0".equals(smtpAuth)){
session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usercount,pass);
}
});
}else{
session=Session.getInstance(props,null);
}
session.setDebug(true);
MimeMessage mimMsg = new MimeMessage(session);
mimMsg.setHeader("X-Mailer", "smtpsend");
mimMsg.setFrom(new InternetAddress(usercount));
mimMsg.setSentDate(date);
MimeMultipart mp = getMimeMultPart(content,attr);
mimMsg.setContent(mp);
mimMsg.setSubject(subject);
//邮件接受者
InternetAddress []iadd = new InternetAddress[TO.length];
for (int i = 0; i < iadd.length; i++) {
iadd[i]=new InternetAddress(TO[i]);
}
mimMsg.setRecipients(MimeMessage.RecipientType.TO, iadd);
if(null != smtpAuth && !"".equals(smtpAuth.trim()) && !"null".equals(smtpAuth) && "1".equals(smtpAuth)){
Transport.send(mimMsg, iadd);
}else{
SMTPTransport transport = (SMTPTransport)session.getTransport("smtp");
if(null!=MAILADDR_SEND_PORT && !"".equals(MAILADDR_SEND_PORT.trim())&& !"null".equals(MAILADDR_SEND_PORT)){
transport.connect(sendserver,Integer.valueOf(MAILADDR_SEND_PORT), usercount, pass);
}else{
transport.connect(sendserver,usercount, pass);
}
transport.sendMessage(mimMsg, mimMsg.getAllRecipients());
transport.close();
//构造邮件体
public MimeMultipart getMimeMultPart(String content,File[] attr) throws Exception{
//邮件体
MimeMultipart mp = new MimeMultipart();
//邮件内容
MimeBodyPart bp = new MimeBodyPart();
bp.setContent(content, "text/html;charset=UTF-8");
mp.addBodyPart(bp);
//邮件附件
for (int i = 0; i < attr.length; i++) {
bp = new MimeBodyPart();
bp.attachFile(attr[i]);
bp.setFileName(MimeUtility.encodeText(attr[i].getName(),"GBK",null));
mp.addBodyPart(bp);
}
return mp;
}