在Linux下利用JavaMail收发邮件
2009-01-06
作者:吴旭
1 引言
电子邮件是Internet上最早使用的工具之一。随着网络的不断普及,它已成为我们学习和工作中必不可少的通信工具。与此同时,linux的普及程度不断提高,人们逐渐认识到了它的优越性,强大的,可靠的,可扩展的,灵活的,可配置的,多用户的,多任务的并且免费的操作系统。在linux上的各种应用开发也变得日益重要。电子邮件便是其中重要的一个方面。借助JavaMail可以很方便地实现在linux上收发邮件。
Java语言的网络能力早已被人们所熟知,再加上JavaMail更是如虎添翼。JavaMail是基于Java的标准化的电子邮件应用编程接口。它提供了一系列抽象的概念,一个管理电子邮件的通用框架。JavaMail提供访问电子邮件系统的能力,以及创建和传送新邮件消息的能力。它能很容易地把邮件功能组合到软件中。
本篇文章将介绍如何在linux下通过配置DNS,实现imap ,smtp服务器,使用JavaMail实现收发邮件的功能。
2.概述
JavaMail是一个纯java API ,因此可以不依赖于任何已安装的系统。充分地体现了平台无关性。在运行的时候,不需要任何特定的设置。只需要提供用来连接和接收邮件的邮件服务器所需的信息就可以了。
图1概述了JavaMail的体系结构。采用分层方式,把实现细节和编程接口分开。当应用程序访问邮件服务或向邮件服务发送消息时,利用JavaMail来请求实现。返回该实现的一个实例,然后 应用程序就可以用该实例来检索或发送邮件。实现的实际细节对应用程序开发者透明。
虽然应用程序可以请求某个特殊协议的实现,但是邮件服务的接口保持不变。
在linux 下,通过配置DNS来建立邮件收发服务器。这样,Internet邮件服务无论是在网络环境下还是在单机下测试均可以使用。(不同之处是网络环境下使用真实IP,单机下使用localhost) 在本例中, 以www.javamail.com作为邮件收发服务器。图2显示了DNS的名 称解析过程,具体内容本文不在介绍。
第3部分将详细介绍DNS的配置过程。
3.DNS的配置(设IP为192.168.10.104)
(1) 修改/etc/named.conf文件,新建两个域(正向域和反向域)
正向域 zone “javamail.com” IN {
type master;
file “javamail.com” ;
allow-update { none;};
};
反向域 zone “10.168.192.in-addr.arpa” IN {
type master;
file “javamail.com1” ;
allow-update { none;};
};
(2) 在/var/named/下建立数据库文件,可通过复制已有文件生成
正向域文件 cp /etc/named/localhost.zone /etc/named/javamai.com
反向域文件 cp /etc/named/named.local /etc/named/javamail.com1
(3) 编辑新生成的数据库文件javamail.com和javamail.com1
javamail.com内容:
$TTL 86400
@ IN SOA ns.javamail.com root.javamail.com.(
20030615
3H
15M
1W
1D )
@ IN NS ns.javamail.com.
ns IN A 192.168.10.104
www IN A 192.168.10.104
javamail.com. IN MX 1 ns.javamail.com.
javamail.com1内容:
$TTL 86400
@ IN SOA ns.javamail.com. root.javamail.com.(
1997022700
28800
14400
3600000
86400 )
@ IN NS ns.javamail.com.
104 IN PTR ns.javamail.com.
(4) 启动服务
service named start
(5) 测试
ping www.javamail.com
若能ping通,则配置成功。
4.编程细节
在配置好DNS后,我们使用www.javamail.com作为邮件收发服务器。
在linux上新建一个帐号,例java,作为邮件用户。
发送邮件
需提供邮件接收者的电子邮件地址和SMTP服务器的名字。
关键语句:
Message message = new MimeMessage (mySession);
Message.setSubject(“Using JavaMail”);
Message.setContent (“This message is sent by JavaMail……….”, “text/plain”);
InternetAddress toAddr = new InternetAddress ( to );
Message.setRecipient (Message.RecipientType.TO, toAddr);
InternetAddress fromAddr = new InternetAddress (java@javamail.com, “SendMail”);
Message.setFrom(fromAddr);
Transport.send(message);
检索邮件
需提供使用的协议(IMAP或POP3),邮件服务的主机名,用户名(本例是java)和密码。
(1)连接服务器
Store myStore = mySession.getStore(protocol);
MyStore.connect (host, username, password );
(2)打开文件夹
邮件系统在文件夹中存储消息。默认文件夹是INBOX
Folder myFolder = myStore.getFolder(“INBOX”);
MyFolder.open(Folder.READ_ONLY);
(3)获得消息
建立一个消息数组,存放从第一条消息到最后一条。
Int messagecount = myFolder.getMessageCount();
Message[] message = myFolder.getMessages();
(4)遍历消息数组中的元素,显示消息的发送者和消息主题。
For( int I = 0; I < message.length; I++)
{
Address[] fromAddr = message[I].getFrom();
System.out.println ( fromAddr[0] + “:” +
Message[I].getSubject());
}
JavaMail API 的一个突出好处是提供了可在编码时透明选择邮件协议接口。不管是IMAP还是POP3,访问邮件文件夹的代码都是相同的,只需很少修改,或者根本不用修改就可用于将来的邮件协议。
5.结束语
通过JavaMail能够很轻松地实现邮件的收发,在linux下也不例外,但需要进行一些相应的配置。Linux与java地结合,能够更加体现linux的开放性和java的平台无关性,同时也提高了安全性。相信java会在linux上更加耀眼。