为了运行Javamail。我们需要在classpath里导入两个包:mail.jar和activation.jar,这是在纯DOS里或者其它简单工具使用时才需要这个classpath。如果使用像Eclipse这样的工具就不需要配置。因为myEclipse已经帮你做好了。
为了要发送邮件和接收邮件,我们必须要遵守smtp和pop3协议,不过还有其它协议也可执行(如IMAP)。如果把本机当作服务器来发送邮件请在http://jakrata.apache.org网站里下载james邮件服务器,然后解压在本机上。运行james/bin里的run.bat就可以启动了服务器。其他的邮件服务器也是可以的。
运行后在DOS里登录邮件服务器。具体命令如下:
系统管理员:root
密码:root
telnet localhost 4555
然后就可以增加邮箱用户名了。命令如下:
<CCID_CODE>adduser 用户名 密码 |
例:
<CCID_NOBR>
<CCID_CODE>adduser test test |
这样就建立了这样一个邮箱test@localhost 密码为:test
如果想要更多功能用help命令。
注意:如果在本机装了邮件服务器的话,只能在本机局域网里申请邮箱,发送和接收。不能发送到外部的邮箱里去。如果用外部的邮件服务器像比如163和126的服务器等就可以随心所欲的发邮件了。
先看看用james邮件服务器在本机上发邮件吧。先简单看一个例子。
<CCID_CODE>import javax.mail.*; import java.util.*; import javax.mail.internet.*; public class MyFirstMail { protected Session mailSession; public MyFirstMail()throws Exception { init(); } public static void main(String[] args) { try { new MyFirstMail().sendMail(); System.out.print("邮件已发"); } catch(Exception e) { e.printStackTrace(); } } //初始化服务器环境 public void init()throws Exception { Properties props=new Properties(); props.put("mail.transport.protocol","smtp"); props.put("mail.smtp.host","localhost"); props.put("mail.smtp.port","25"); mailSession=Session.getDefaultInstance(props, null);; } public void sendMail()throws Exception { try { //从哪里发的邮件 msg.setFrom(new InternetAddress("test@localhost")); //发送到目标邮件 msg.setRecipients (Message.RecipientType.TO,InternetAddress.parse("wang@localhost")); //抄送的接收者 msg.setRecipients (Message.RecipientType.CC,InternetAddress.parse("wang@localhost")); //暗送的接收者 msg.setRecipients (Message.RecipientType.BCC,InternetAddress.parse("wang@localhost")); //设置发送时间 msg.setSentDate(new java.util.Date()); //设置邮件标题 msg.setSubject("a test mail"); //设置邮件内容 msg.setText("this is the email content"); //指定协议发送消息的对像 Transport transport=mailSession.getTransport("smtp"); //发送消息 Transport.send(msg); } catch(Exception e) { throw e; } } |
发送完后想要看邮件就要到james->apps->james->var->mail->inboxes就可以看见每个邮箱里的邮件数了。由于发过来的是字节流,邮件包括一个邮件属性和消息,所以每一封邮件是由二个文件组成的。
也许没有学过的Javamail的人看上去会一头雾水。不要紧,现在一一详解。先说初始化的内容的吧!
1、mail.transport.protocol=smtp 这里主要说明的是邮件传输协议。
2、mail.smtp.host=localhost 发送邮件的主机如果用外部邮件服务器的话,可以这样写:
mail.smtp.host=smtp.163.com
这样就以163.为服务器了。
3、mail.smtp.prot=25 smtp端口可以省略,缺省为25
javax.mail.session session类定义了与远程邮件系统通信的邮件会话。需要注意的是这个session不同servlet中的会话。Servlet中的会话需要共享一些信息,而mail里的session里没有这个功能,它只是用于存储与服务器建立连接会话相关信息和逻辑。
Session类是Javamail api最高层入口类,所有其它类都必须经由session对象生效。Session对象它管理配置选项和用于与邮件系统交互的用认证信息息。它通过使用java.util.properties对象配置邮件会话的属性如邮件服务器,用户名,密码,及整个应用程序中共享的其它信息。
Session并不处现任何授权操作,它只是存储这些授权信息。Session类的构造器是私有的,它不能被继承,也不能用new语名创建实例。但它提供了两个静态方法getInstance 和getDefaultInstance来获取session实例,在创建session实例时需要提供一些属性。具体实现如下:
<CCID_CODE>Properties props=new Properties() Props.put(“mail.transport.protocol”,”smtp”) Props.put(“mail.smtp.host”,”localhost”); Props.put(“mail.smtp.prot”,”25”) //不加以认证也可以这样写 //Session session=Session.getDefaultInstance(props,null) //如果认证传入null那么它和不使用认证调用方式一样 Session session=Session.getDefaultInstance(props) |
Javax.mail. Message
经过session配置后就可以进行发送消息任务了。这由Message类来完成。Message实现了Part接口,它表示一个邮件消息,包含一系列的属性和一个消息内容。消息属性包括了消息址址消息,定义了消息内容的结构(包括内容类型),消息内容使用DataHandler对象包装实际数据。当邮件消息位于目录(folder)中时,系统还使用了一个标志位集合来描述它的状态。
Message是抽象类,实际使用时必须用一个子类代替以表示具体的邮件格式。比如说Javamail api提供了MimeMessage类,该类扩展了Message,实现了RFC822和MIME标准。有两个构造方法:
<CCID_CODE>//一般使用第一种 Message msg=new MimeMessage(Session session) Message msg=new MimeMessage(MimeMessage msg) |
获得消息后,就可以设置消息各个部份了。在设置之前因为要涉及地址。所以讲一下地址类javax.mail.Address
Address类表示电子邮件类,它是一个抽象类,它的子类InternetAddress提供具体实现且通常可串行化。若创建的地址只包含电子邮件,只要传递电子邮件到构造器即可如
<CCID_CODE>InternetAddress addr=new InternetAddress(); addr.setAddress(“wang@126.com”) 或者是:InterntAddress addr=new InternetAddress(“wang@126.com”) 另外,InternetAddress类还提供了地址解析方法如 Address[] addrs=InternetAddress.parse(“wang@163.com,f@126.com,zuo@126.com”); 地址之后就可以发送消息了。 //设置发送者 Msg.setFrom(new InternetAddress(“test@126.com”)); //设置接收者,并还具有解析功能 Msg.setRecipients(Message.RecipientType.To, InternetAddress.parse(“zuolin0806@163.com”)); //抄送的接收者 Msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(“zuolin0806@163.com”)); //暗送的接收者 Msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(“zuolin0806@163.com”)); //设置消息主题 msg.setSubject(“我的爱”) //设置内容的基本机制,其参数Mime类型 msg.setContent(“这是我的内容”,”text/html;charset=gb2312”) |
其中的text/html表示消息内容采用的是HTML格式。
如果消息格式是(text/plain),而且使用的是MimeMessage,那么setText()方法设置邮件内容的参数(Mime类型默认为text/plain)
<CCID_CODE>//设置邮件内容 msg.setText(); //设置发送时间 msg.setSentDate(new java.util.Date()); |
最后一步是就是发送了
javax.mail.Transport
该类也是抽象类,它可通过静态方法和实便方法发送消息。Transport断承service类。所以它提供了通用方法,如命名传输,连接服务器和监听传输事件等
<CCID_CODE>//默认 Transport.send(msg); |
最后看一下使用外部邮件服务器的使用方法。先看程序再讲解,注意在使用外部邮件服务器时一定要有一个类来认证。到时在讲。
<CCID_CODE>public class MySecondMail { protected Session session = null; //邮件用户名 String mailUser = "zuolin0806"; String host = "smtp.163.com"; String pwd = "用户名的密码"; public MySecondMail() { init(); } public void init() { Properties props = new Properties(); props.put("mail.transpost.protocol", "smtp"); props.put("mail.smtp.host", "smtp.163.com"); //必须要有一个类来认证 props.put("mail.smtp.auth", "true"); props.put("mail.smpt.port", "25") Email_Autherticatorbean auth = new Email_Autherticatorbean(mailUser,pwd); //session认证 session = Session.getInstance(props,auth); //这个是跟踪后台消息。打印在控制台 session.setDebug(true); } public static void main(String[] args) { new MySecondMail().sendMails(); System.out.println("send mail success!"); } public void sendMails() { try { Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress("zuolin0806@163.com")); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("javaboy@126.com")); msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse("javaboy@126.com")); msg.setSentDate(new Date()); msg.setSubject("this is my Threee mail"); msg.setContent("this is my mail","text/html"); msg.setText("我成功了。哈哈"); Transport transport = session.getTransport("smtp"); 与发送者的邮箱相连 transport.connect(host,mailUser,pwd); transport.send(msg); } catch (SendFailedException e) { e.printStackTrace(); } catch (Exception ee) { ee.printStackTrace(); } } } |
认证类必须继承Authenticator 例子如下:
<CCID_CODE>import javax.mail.*; public class Email_Autherticatorbean extends Authenticator { private String m_username = null; private String m_userpass = null; public void setUsername(String username) { m_username = username; } public void setUserpass(String userpass) { m_userpass = userpass; } public Email_Autherticatorbean(String username, String userpass) { super(); setUsername(username); setUserpass(userpass); } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(m_username,m_userpass); } } |
至此邮件可以成功发送