现在的邮件服务提供商很多,而且邮箱的速度也很不错,相互之间也能互发信息,基于邮件服务器进行信息聊天,应该也不错。写个简易版的客户端工具测试下。
本文只做了纯文本内容的发送测试,图片和附件的没做。
功能实现的原理很简单:
客户端信息发送(邮件发送):和普通的smtp发送邮件一样。
客户端信息接收(邮件接收):因为要马上看到信息内容,所以需要用一个线程,死循环的不断登录邮箱收邮件。
代码实现也很简单,只是收发邮件的代码,这里不详说。
收发邮件的组件是javaMail,界面是swing做的。
收发信息实现类EmailUtil.java
public
class
EmailUtil
{
private Account accout;
private static Session session;
private static Store store;
private Date latestSentDate;
public EmailUtil() {
if (session == null ) {
initSession();
}
}
public void send(String mail_body) {
try
{
if (session == null ) {
boolean b = initSession();
if (b == false ) {
return ;
}
}
MimeMessage mimeMsg = new MimeMessage(session);
mimeMsg.setSubject( " 即时信息回复 " );
Multipart mp = new MimeMultipart();
BodyPart bp1 = new MimeBodyPart();
bp1.setContent(mail_body, " text/html;charset=UTF-8 " );
mp.addBodyPart(bp1);
mimeMsg.setContent(mp);
mimeMsg.setFrom( new InternetAddress(accout.getFromEmail()));
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(accout.getToEmail()));
mimeMsg.saveChanges();
Transport transport = session.getTransport( " smtp " );
transport.connect(accout.getSendHost(),
accout.getName(), accout.getPassword());
transport.sendMessage(mimeMsg, mimeMsg
.getRecipients(Message.RecipientType.TO));
transport.close();
} catch (Exception ex)
{
JOptionPane.showMessageDialog( null , " 发送出错: " + ex.getMessage());
System.out.println( " 发送邮件出错: " );
ex.printStackTrace();
}
}
public boolean receive(JEditorPane receivePane, StringBuffer sff) {
try {
if (session == null ) {
boolean b = initSession();
if (b == false ) {
return false ;
}
}
if (store == null || store.isConnected() == false ) {
URLName urln = new URLName( " pop3 " , accout.getReceiveHost(), 110 , null ,
accout.getName(), accout.getPassword());
store = session.getStore(urln);
store.connect();
}
Folder folder = store.getFolder( " INBOX " );
folder.open(Folder.READ_ONLY);
System.out.println( " 邮件数: " + folder.getMessageCount());
if (latestSentDate == null ) {
latestSentDate = DateUtil.parseDate( " 2010-12-10 00:00:00 " );
}
Address fromEmail = new InternetAddress(accout.getToEmail());
SearchTerm term1 = new FromTerm(fromEmail);
SearchTerm st = new SentDateTerm(SentDateTerm.GT, latestSentDate);
SearchTerm term = new AndTerm(term1, st);
Message[] msgs = folder.search(term);
System.out.println( " 符合条件邮件数: " + msgs.length);
if (msgs.length > 0 ) {
for ( int i = 0 ; i < msgs.length; i ++ ) {
Message m = msgs[i];
String msg = "" ;
try {
if (m.isMimeType( " multipart/* " )) {
Multipart mp = (Multipart)m.getContent();
Part part = mp.getBodyPart( 0 );
msg = (String)part.getContent();
}
else {
msg = (String)m.getContent();
}
latestSentDate = m.getSentDate();
String from = getFrom(m);
String sentUser = " <span style=\ " color:#1E90FF;\ " > " + from + " " + DateUtil.dateToStr(latestSentDate) + " </span><br/> " ;
sff.append(sentUser);
sff.append(msg + " <br/><br/> " );
}
catch (Exception e) {
System.out.println( " 读取第 " + i + " 份邮件出错 " );
e.printStackTrace();
}
}
receivePane.setText(sff.toString());
}
}
catch (Exception e) {
sff.append( " <font color=\ " red\ " >接收邮件出错: " + e.getMessage() + " </font><br/> " );
receivePane.setText(sff.toString());
System.out.println( " 接收邮件出错: " );
e.printStackTrace();
return false ;
}
return true ;
}
private boolean initSession() {
if (MessageDialog.getAccount() != null ) {
accout = MessageDialog.getAccount();
Properties props = new Properties(); // 获取系统环境
props.put( " mail.smtp.host " , accout.getSendHost());
props.put( " mail.smtp.auth " , " true " );
session = Session.getDefaultInstance(props, null );
return true ;
}
else {
return false ;
}
}
private String getFrom(Message mimeMessage) throws Exception {
InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
String from = address[ 0 ].getAddress();
if (from == null ) {
from = "" ;
}
String personal = address[ 0 ].getPersonal();
if (personal == null ) {
personal = "" ;
}
String fromaddr = personal + " < " + from + " > " ;
return fromaddr;
}
public void getMailContent(Part part, StringBuffer sff) throws Exception {
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf( " name " );
boolean conname = false ;
if (nameindex != - 1 )
conname = true ;
System.out.println( " CONTENTTYPE: " + contenttype);
if (part.isMimeType( " text/plain " ) && ! conname) {
sff.append((String) part.getContent());
} else if (part.isMimeType( " text/html " ) && ! conname) {
sff.append((String) part.getContent());
} else if (part.isMimeType( " multipart/* " )) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for ( int i = 0 ; i < counts; i ++ ) {
getMailContent(multipart.getBodyPart(i), sff);
}
} else if (part.isMimeType( " message/rfc822 " )) {
getMailContent((Part) part.getContent(), sff);
} else {}
}
}
private Account accout;
private static Session session;
private static Store store;
private Date latestSentDate;
public EmailUtil() {
if (session == null ) {
initSession();
}
}
public void send(String mail_body) {
try
{
if (session == null ) {
boolean b = initSession();
if (b == false ) {
return ;
}
}
MimeMessage mimeMsg = new MimeMessage(session);
mimeMsg.setSubject( " 即时信息回复 " );
Multipart mp = new MimeMultipart();
BodyPart bp1 = new MimeBodyPart();
bp1.setContent(mail_body, " text/html;charset=UTF-8 " );
mp.addBodyPart(bp1);
mimeMsg.setContent(mp);
mimeMsg.setFrom( new InternetAddress(accout.getFromEmail()));
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(accout.getToEmail()));
mimeMsg.saveChanges();
Transport transport = session.getTransport( " smtp " );
transport.connect(accout.getSendHost(),
accout.getName(), accout.getPassword());
transport.sendMessage(mimeMsg, mimeMsg
.getRecipients(Message.RecipientType.TO));
transport.close();
} catch (Exception ex)
{
JOptionPane.showMessageDialog( null , " 发送出错: " + ex.getMessage());
System.out.println( " 发送邮件出错: " );
ex.printStackTrace();
}
}
public boolean receive(JEditorPane receivePane, StringBuffer sff) {
try {
if (session == null ) {
boolean b = initSession();
if (b == false ) {
return false ;
}
}
if (store == null || store.isConnected() == false ) {
URLName urln = new URLName( " pop3 " , accout.getReceiveHost(), 110 , null ,
accout.getName(), accout.getPassword());
store = session.getStore(urln);
store.connect();
}
Folder folder = store.getFolder( " INBOX " );
folder.open(Folder.READ_ONLY);
System.out.println( " 邮件数: " + folder.getMessageCount());
if (latestSentDate == null ) {
latestSentDate = DateUtil.parseDate( " 2010-12-10 00:00:00 " );
}
Address fromEmail = new InternetAddress(accout.getToEmail());
SearchTerm term1 = new FromTerm(fromEmail);
SearchTerm st = new SentDateTerm(SentDateTerm.GT, latestSentDate);
SearchTerm term = new AndTerm(term1, st);
Message[] msgs = folder.search(term);
System.out.println( " 符合条件邮件数: " + msgs.length);
if (msgs.length > 0 ) {
for ( int i = 0 ; i < msgs.length; i ++ ) {
Message m = msgs[i];
String msg = "" ;
try {
if (m.isMimeType( " multipart/* " )) {
Multipart mp = (Multipart)m.getContent();
Part part = mp.getBodyPart( 0 );
msg = (String)part.getContent();
}
else {
msg = (String)m.getContent();
}
latestSentDate = m.getSentDate();
String from = getFrom(m);
String sentUser = " <span style=\ " color:#1E90FF;\ " > " + from + " " + DateUtil.dateToStr(latestSentDate) + " </span><br/> " ;
sff.append(sentUser);
sff.append(msg + " <br/><br/> " );
}
catch (Exception e) {
System.out.println( " 读取第 " + i + " 份邮件出错 " );
e.printStackTrace();
}
}
receivePane.setText(sff.toString());
}
}
catch (Exception e) {
sff.append( " <font color=\ " red\ " >接收邮件出错: " + e.getMessage() + " </font><br/> " );
receivePane.setText(sff.toString());
System.out.println( " 接收邮件出错: " );
e.printStackTrace();
return false ;
}
return true ;
}
private boolean initSession() {
if (MessageDialog.getAccount() != null ) {
accout = MessageDialog.getAccount();
Properties props = new Properties(); // 获取系统环境
props.put( " mail.smtp.host " , accout.getSendHost());
props.put( " mail.smtp.auth " , " true " );
session = Session.getDefaultInstance(props, null );
return true ;
}
else {
return false ;
}
}
private String getFrom(Message mimeMessage) throws Exception {
InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
String from = address[ 0 ].getAddress();
if (from == null ) {
from = "" ;
}
String personal = address[ 0 ].getPersonal();
if (personal == null ) {
personal = "" ;
}
String fromaddr = personal + " < " + from + " > " ;
return fromaddr;
}
public void getMailContent(Part part, StringBuffer sff) throws Exception {
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf( " name " );
boolean conname = false ;
if (nameindex != - 1 )
conname = true ;
System.out.println( " CONTENTTYPE: " + contenttype);
if (part.isMimeType( " text/plain " ) && ! conname) {
sff.append((String) part.getContent());
} else if (part.isMimeType( " text/html " ) && ! conname) {
sff.append((String) part.getContent());
} else if (part.isMimeType( " multipart/* " )) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for ( int i = 0 ; i < counts; i ++ ) {
getMailContent(multipart.getBodyPart(i), sff);
}
} else if (part.isMimeType( " message/rfc822 " )) {
getMailContent((Part) part.getContent(), sff);
} else {}
}
}
下面看效果,例子是用了QQ邮箱和网易邮箱测试。QQ邮箱在win 7系统使用,网易邮箱在Ubuntu使用
程序运行时,先点击“配置”按钮配置邮件服务器和帐号信息,配置完后保存,再点登录,如果配置没有填错的话,就可以正常的收发信息。