3 Javamail快速入门
进行Javamail开发需要用到两个包:mail.jar和activation.jar,在开始Javamail编程之前,请自己将这两个包添加到IDE的Build path中或将这两个包的路径配置到环境变量中。
3.1 使用Javamail向James的邮箱帐户发送邮件
3.1.1 业务描述
本例将使用Javamail实现邮件的发送功能。发送邮件需要配置邮件服务器属性信息,配置邮件接收地址,使用SMTP认证获得会话(Session),构建邮件体(MimeMessage),发送邮件。具体编码如下:
3.1.2 编码实现
发送邮件需要两个类:一个是SMTP用户身份认证类(James在默认情况下,是需要SMTP身份认证的);另一个就是我们的邮件发送类,为简单起见,我们直接将邮件的相关信息,如:标题、内容、发送者、接收者等信息直接写在类中,运行main()函数即发送。当然,你同样可以为自己的邮件发送系统构造一个邮件发送介面,通过Servlet将相关参数传递至后台进行处理与发送。其主要代码也就是此main()函数中的内容,故不赘述。
SmtpAuth.java用户身份认证代码
- package com.newland.javamail.sample1;
- /**
- * 用于身份认证
- * @author Chen.Feng(Kevin)<br>
- * mail:chenfengcn@yeah.net<br>
- * qq:67758633
- */
- class SmtpAuth extends javax.mail.Authenticator {
- private String user, password;
- /**
- *
- * @param getuser
- * @param getpassword
- */
- public void setUserinfo(String getuser, String getpassword) {
- user = getuser;
- password = getpassword;
- }
- protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
- return new javax.mail.PasswordAuthentication(user, password);
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUser() {
- return user;
- }
- public void setUser(String user) {
- this.user = user;
- }
- }
SendMail.java发送邮件代码
- package com.newland.javamail.sample1;
- import java.util.Properties;
- import javax.activation.DataHandler;
- import javax.activation.DataSource;
- import javax.activation.FileDataSource;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.URLName;
- import javax.mail.internet.AddressException;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeBodyPart;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeMultipart;
- /**
- * 使用Javamail实现邮件发送功能
- * @author Chen.Feng(Kevin)<br>
- * mail:chenfengcn@yeah.net<br>
- * qq:67758633
- *
- */
- public class SendMail {
- public SendMail() {
- // TODO Auto-generated constructor stub
- }
- public static void main(String[] args) {
- // 初始化信息
- String sender = "chenfengcn";
- String password = "881213";
- String smtpServer = "localhost";
- String recipient = "chenfengcn@localhost";
- String subject = "测试邮件主题";
- String fileAttachment = ""; //附件
- String content = "测试邮件内容";
- // 配置服务器属性
- Properties proper = new Properties();
- proper.put("mail.smtp.host", smtpServer); // smtp服务器
- proper.put("mail.smtp.auth", "true"); // 是否smtp认证
- proper.put("mail.smtp.port", "25"); // 设置smtp端口
- proper.put("mail.transport.protocol", "smtp"); // 发邮件协议
- proper.put("mail.store.protocol", "pop3"); // 收邮件协议
- // 配置邮件接收地址
- InternetAddress[] receiveAddress = new InternetAddress[1];
- try {
- receiveAddress[0] = new InternetAddress(recipient);
- } catch (AddressException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // smtp认证,获取Session
- SmtpAuth sa = new SmtpAuth();
- sa.setUserinfo(sender, password);
- Session session = Session.getInstance(proper, sa);
- session.setPasswordAuthentication(new URLName(smtpServer), sa
- .getPasswordAuthentication());
- // 构建邮件体
- MimeMessage sendMess = new MimeMessage(session);
- MimeBodyPart mbp = new MimeBodyPart();
- MimeMultipart mmp = new MimeMultipart();
- try {
- // 邮件文本内容
- mbp.setContent(content, "text/plain; charset=GBK");
- mmp.addBodyPart(mbp);
- // 附件处理
- if(fileAttachment!=null&&fileAttachment!=""){
- DataSource source = new FileDataSource(fileAttachment);
- String name = source.getName();
- mbp = new MimeBodyPart();
- mbp.setDataHandler(new DataHandler(source));
- mbp.setFileName(name);
- mmp.addBodyPart(mbp);
- }
- // 邮件整体
- sendMess.setSubject(subject);
- sendMess.setContent(mmp);
- // 发送邮件
- sendMess.setFrom(new InternetAddress(sender));
- sendMess.setRecipients(Message.RecipientType.TO, receiveAddress);
- Transport.send(sendMess);
- System.out.println("发送成功");
- } catch (MessagingException ex) {
- ex.printStackTrace();
- }
- }
- }
值得一提的是,本程序已经实现了带附件邮件的发送功能,如果要发送带附件的邮件,则只需要将附件的路径传到fileAttachment变量中就可以了。邮件发送成功后,程序将在后台打印出“发送成功”,这样我们就完成了邮件发送功能。那么,我们应该如何检验服务器是否确实收到我们发送的测试邮件呢?Javamail可以发送邮件,当然也能接收邮件啦,下面让我们一起使用Javamail编写邮件接收功能来检验吧。
3.2 使用Javamail接收邮件
3.2.1 业务描述
在上一节,我们已经向James的chenfengcn用户发送了一封测试邮件,我们应该如何使用Javamail来收取这封邮件呢?
为读取邮件,必须首先设置服务器属性(Properties),获取一个会话(Session),然后获取并连接邮箱所在的存储器(Store对象),打开该用户的邮箱(Folder),获取所希望阅读的消息,最后关闭目录和连接。
下面的程序实现了接收chenfengcn@localhost邮箱中所有邮件,并将发送人和主题打印出来。
3.2.2 编码实现
- package com.newland.javamail.sample1;
- import java.util.Properties;
- import javax.mail.Folder;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.NoSuchProviderException;
- import javax.mail.Session;
- import javax.mail.Store;
- /**
- * 使用Javamail实现邮件接收功能
- * @author Chen.Feng(Kevin)<br>
- * mail:chenfengcn@yeah.net<br>
- * qq:67758633
- *
- */
- public class ReceiveMail {
- public ReceiveMail() {
- }
- public static void main(String[] args) {
- // 初始化主机
- String host = "localhost";
- String username = "chenfengcn";
- String password = "881213";
- // 配置服务器属性
- Properties props = new Properties();
- props.put("mail.smtp.host", "localhost"); // smtp服务器
- props.put("mail.smtp.auth", "true"); // 是否smtp认证
- props.put("mail.smtp.port", "25"); // 设置smtp端口
- props.put("mail.transport.protocol", "smtp"); // 发邮件协议
- props.put("mail.store.protocol", "pop3"); // 收邮件协议
- // 获取会话
- Session session = Session.getDefaultInstance(props, null);
- // 获取Store对象,使用POP3协议,也可能使用IMAP协议
- try {
- Store store = session.getStore("pop3");
- // 连接到邮件服务器
- store.connect(host, username, password);
- // 获取该用户Folder对象,并以只读方式打开
- Folder folder = store.getFolder("inbox");
- folder.open(Folder.READ_ONLY);
- // 检索所有邮件,按需填充
- Message message[] = folder.getMessages();
- for (int i = 0; i < message.length; i++) {
- // 打印出每个邮件的发件人和主题
- System.out.println(i + ":" + message[i].getFrom()[0] + "/t"
- + message[i].getSubject());
- }
- folder.close(false);
- store.close();
- } catch (NoSuchProviderException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (MessagingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
程序运行成功后,将会把chenfengcn用户的邮件从James服务器中取出,并将此邮箱中所有邮件的发件人、主题打印在后台。若要打印该邮件的内容等信息,则只要将message[i]对象中的邮件内容等信息读取出来就可以了。
注:鉴于邮件的存储结构(将在第五章介绍),读取邮件附件是一个比较复杂的过程,因为邮件的文本内容和附件信息都是保存在BodyPart对象中的,BodyPart用于标识类型的标记不明确,造成对附件的判断较为复杂。对于附件的操作本人将在今后的改进版本中加以介绍。