邮件发送与接收

时间:2022-12-21 10:10:32
最近公司对OA系统提了新的需求,要求能够进行邮件的接受和发送。实现此功能我能想到的也只有JavaMail.就试着学习了一点相关的知识。

虽然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的区别

SSL安全设置下与普通模式下有三点区别
1: //设置SSL模式下的端口号(重点)
  props.setProperty("mail.pop3.socketFactory.port",MAILADDR_REC_PORT);
props.setProperty("mail.pop3.port",MAILADDR_REC_PORT);
//自我感觉是SSL处理类
  props.setProperty("mail.pop3.socketFactory.class",SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.fallback","false");
2: //开启(始终启用安全设置)
props.put("mail.smtp.starttls.enable","true");
3:验证//SSL安全模式下Session的构造方法如下
recSsion = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usercount,pass);
}
});
邮件的发送
  Properties props = new Properties();
props.put("mail.smtp.host", sendserver);//服务器地址
props.put("mail.smtp.auth", "true");//是否验证
//SSL安全设定
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;
}