Posted on 2010-12-11 00:23
penngo 閱讀(2632)
評論(6) 編輯 收藏
現(xiàn)在的郵件服務(wù)提供商很多,而且郵箱的速度也很不錯,相互之間也能互發(fā)信息,基于郵件服務(wù)器進行信息聊天,應(yīng)該也不錯。寫個簡易版的客戶端工具測試下。
本文只做了純文本內(nèi)容的發(fā)送測試,圖片和附件的沒做。
功能實現(xiàn)的原理很簡單:
客戶端信息發(fā)送(郵件發(fā)送):和普通的smtp發(fā)送郵件一樣。
客戶端信息接收(郵件接收):因為要馬上看到信息內(nèi)容,所以需要用一個線程,死循環(huán)的不斷登錄郵箱收郵件。
代碼實現(xiàn)也很簡單,只是收發(fā)郵件的代碼,這里不詳說。
收發(fā)郵件的組件是javaMail,界面是swing做的。
收發(fā)信息實現(xiàn)類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("即時信息回復(fù)");
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, "發(fā)送出錯:" + ex.getMessage());
System.out.println("發(fā)送郵件出錯:");
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("郵件數(shù):" + 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("符合條件郵件數(shù):" + 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(); // 獲取系統(tǒng)環(huán)境
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郵箱和網(wǎng)易郵箱測試。QQ郵箱在win 7系統(tǒng)使用,網(wǎng)易郵箱在Ubuntu使用
程序運行時,先點擊“配置”按鈕配置郵件服務(wù)器和帳號信息,配置完后保存,再點登錄,如果配置沒有填錯的話,就可以正常的收發(fā)信息。
QQ郵箱
163郵箱
用這個客戶端工具跑了一段時間,個人感覺還是不錯。唯一不足就是跑了一個小時后,163郵箱出現(xiàn)登錄失敗的情況,估計是服務(wù)器端設(shè)了限制,禁止客戶端連續(xù)不斷的訪問郵箱。
運行程序:
im.jar.rar