首页 > 代码库 > Android Java使用JavaMail API发送和接收邮件的代码示例

Android Java使用JavaMail API发送和接收邮件的代码示例

JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例

使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):
mailapi.jar。定义了收发邮件所使用到的接口API;
smtp.jar。包含了发送邮件使用到的类;
pop3.jar。包含了收邮件使用到的类;
我们通常发送邮件使用的协议是smtp协议,接受邮件使用的协议是pop3协议。或者,我们直接将mail.jar加入到工程,这个jar包里边包含了java收发邮件所有的接口和类。

常用的类:1.     javax.mail.Session;                                                    -------->保存连接服务器所需要的信息;2.     javax.mail.Message;                                                  -------->邮件体,保存邮件的内容;3.     javax.mail.Transport;                                                 -------->发送邮件的载体4.     javax.mail.internet.InternetAddress;                         -------->邮件的地址信息

发送邮件

下边,我先列出使用Java发送邮件的最简单的一个小测试示例:

import java.util.Properties;   import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;   /**  *  * QQ(mail.qq.com):POP3服务器(端口995)SMTP服务器(端口465或587)。  *  */public class Demo1 {     /**    * @param args    * @throws MessagingException    */  public static void main(String[] args) throws MessagingException {           String sendUserName = "wangxiangpan@126.com";     String sendPassword = "pwd";           Properties properties = new Properties();     properties.setProperty("mail.smtp.auth", "true");//服务器需要认证     properties.setProperty("mail.transport.protocol", "smtp");//声明发送邮件使用的端口           Session session = Session.getInstance(properties);     session.setDebug(true);//同意在当前线程的控制台打印与服务器对话信息           Message message = new MimeMessage(session);//构建发送的信息     message.setText("你好,我是Champion.Wong!");//信息内容     message.setFrom(new InternetAddress("wangxiangpan@126.com"));//发件人           Transport transport = session.getTransport();     transport.connect("smtp.126.com", 25, sendUserName, sendPassword);//连接发件人使用发件的服务器     transport.sendMessage(message, new Address[]{new InternetAddress("492134880@qq.com")});//接受邮件     transport.close();   }   } 

一般的,我们使用Authenticator把用户名和密码封装起来,不透明!所以:

import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;   import junit.framework.TestCase;   /**  * javamail 发送邮件  * @author Champion Wong  * Message.addRecipient(Message.Recipient recipient, Address address); 发邮件的时候指定收件人和收件人的角色  * Message.RecipientType.TO 收件人  * Message.RecipientType.CC 抄送,即发邮件的时候顺便给另一个人抄一份,不用回复!但是,上边的收件人可以看到你都抄送给了谁  * Message.RecipientType.BCC 暗送,也是发邮件的时候顺便给另一个人暗发一份,但是,不同于上边的是,收件人不能看到你都暗送给了谁  *  */public class Demo2 extends TestCase {     private static final String sendUserName = "wangxiangpan@126.com";// 发送邮件需要连接的服务器的用户名     private static final String sendPassword = "pwd";// 发送邮件需要连接的服务器的密码     private static final String sendProtocol = "smtp";// 发送邮件使用的端口     private static final String sendHostAddress = "smtp.126.com";// 发送邮件使用的服务器的地址     public void test() throws AddressException, MessagingException {       Properties properties = new Properties();     properties.setProperty("mail.smtp.auth", "true");// 服务器需要认证     properties.setProperty("mail.transport.protocol", sendProtocol);// 声明发送邮件使用的端口     properties.setProperty("mail.host", sendHostAddress);// 发送邮件的服务器地址       Session session = Session.getInstance(properties, new Authenticator() {       protected PasswordAuthentication getPasswordAuthentication() {         return new PasswordAuthentication(sendUserName, sendPassword);       }     });     session.setDebug(true);//在后台打印发送邮件的实时信息       Message message = new MimeMessage(session);     message.setFrom(new InternetAddress("wangxiangpan@126.com"));     message.setSubject("Demo2JavaCode发送邮件测试,采用Authenticator");// 设置主题     message.setRecipients(Message.RecipientType.TO, InternetAddress         .parse("492134880@qq.com,wangxiangpan@126.com"));// 发送     message.setRecipients(Message.RecipientType.CC, InternetAddress         .parse("msn_wangxiangpan@hotmail.com"));// 抄送     message         .setContent(             "<span style="font-size:20px; color:#FFCCFF" mce_style="font-size:20px; color:#FFCCFF">如果您看到,证明测试成功了!</span>",             "text/html;charset=gbk");       Transport.send(message);//发送邮件   } } 

我们发送一个比较复杂的邮件,包括附件,图文:

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties;   import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility;   /**  *  * @author Administrator Mr XP.Wang  * MimeMultipart 一般电子邮件的容器是Multipart,定义了增加及删除电子邮件各部分内容的方法,  *        但是其是抽象类,需要其子类MimeMultipart来时用MimeMessage对象  * MimeBodyPart 是BodyPart具体用于mimeMessage的一个子类,MimeBodyPart对象代表一个  *       mimeMultipart对象的每一个部分  * MimeUtility.encodeText(String cn)用于解决邮件中的头部信息中中文的乱码问题  *  */public class Demo3_test {     public static void main(String[] args) throws Exception {           Properties properties = new Properties();     properties.setProperty("mail.smtp.auth", "true");// 服务器需要认证     properties.setProperty("mail.transport.protocol", "smtp");// 声明发送邮件使用的端口     properties.setProperty("mail.host", "smtp.126.com");// 发送邮件的服务器地址           Session session = Session.getInstance(properties, new Authenticator() {       String sendUserName = "wangxiangpan@126.com";       String sendPassword = "pwd";       protected PasswordAuthentication getPasswordAuthentication() {         return new PasswordAuthentication(sendUserName,             sendPassword);       }     });     session.setDebug(true);           MimeMessage msg = new MimeMessage(session);// 声明一个邮件体     msg.setFrom(new InternetAddress("/""+MimeUtility.encodeText("Mr XP.Wang")+"/"<wangxiangpan@126.com>"));     msg.setSubject("这是我的第一份复杂邮件");//设置邮件主题     msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText("王翔攀")+"<wangxiangpan@126.com>,"+MimeUtility.encodeText("三毛")+"<492134880@qq.com>"));       MimeMultipart msgMultipart = new MimeMultipart("mixed");// 标明邮件的组合关系,混合的关系     msg.setContent(msgMultipart);// 设置邮件体             MimeBodyPart attch1 = new MimeBodyPart();// 附件1     MimeBodyPart attch2 = new MimeBodyPart();// 附件2     MimeBodyPart content = new MimeBodyPart();// 邮件的正文,混合体(图片+文字)       // 将附件和正文设置到这个邮件体中     msgMultipart.addBodyPart(attch1);     msgMultipart.addBodyPart(attch2);     msgMultipart.addBodyPart(content);             // 设置第一个附件     DataSource ds1 = new FileDataSource("F:/ACCP5.0/文件/ssh配置.txt");// 指定附件的数据源     DataHandler dh1 = new DataHandler(ds1);// 附件的信息     attch1.setDataHandler(dh1);// 指定附件     attch1.setFileName("ssh.txt");       // 设置第二个附件     DataSource ds2 = new FileDataSource("resource/48.jpg");// 指定附件的数据源     DataHandler dh2 = new DataHandler(ds2);// 附件的信息     attch2.setDataHandler(dh2);// 指定附件     attch2.setFileName("48.jpg");       //设置邮件的正文     MimeMultipart bodyMultipart = new MimeMultipart("related");//依赖关系     content.setContent(bodyMultipart);//指定正文     MimeBodyPart htmlPart = new MimeBodyPart();     MimeBodyPart gifPart = new MimeBodyPart();     bodyMultipart.addBodyPart(htmlPart);     bodyMultipart.addBodyPart(gifPart);                 DataSource gifds = new FileDataSource("resource/48.jpg");//正文的图片     DataHandler gifdh = new DataHandler(gifds);     gifPart.setHeader("Content-Location", "http://mimg.126.net/logo/126logo.gif");     gifPart.setDataHandler(gifdh);//设置正文的图片           htmlPart.setContent("我只是来打酱油的,这是我的形象照!<img src=http://www.mamicode.com/"/" mce_src=http://www.mamicode.com/"/""http://mimg.126.net/logo/126logo.gif/">", "text/html;charset=gbk");//设置正文文字           msg.saveChanges();//保存邮件           //将邮件保存成文件     OutputStream ops = new FileOutputStream("C:/Users/Administrator/Desktop/test.eml");     msg.writeTo(ops);     ops.close();           Transport.send(msg);   }   } 

收取邮件
示例:Rose 收取最近一封邮件。

import java.util.Date;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; public class FetchMail {   public static void main(String[] args) {    String protocol = "pop3";    boolean isSSL = true;    String host = "pop.163.com";    int port = 995;    String username = "rose@163.com";    String password = "rose";     Properties props = new Properties();    props.put("mail.pop3.ssl.enable", isSSL);    props.put("mail.pop3.host", host);    props.put("mail.pop3.port", port);     Session session = Session.getDefaultInstance(props);     Store store = null;    Folder folder = null;    try {      store = session.getStore(protocol);      store.connect(username, password);       folder = store.getFolder("INBOX");      folder.open(Folder.READ_ONLY);       int size = folder.getMessageCount();      Message message = folder.getMessage(size);       String from = message.getFrom()[0].toString();      String subject = message.getSubject();      Date date = message.getSentDate();       System.out.println("From: " + from);      System.out.println("Subject: " + subject);      System.out.println("Date: " + date);    } catch (NoSuchProviderException e) {      e.printStackTrace();    } catch (MessagingException e) {      e.printStackTrace();    } finally {      try {        if (folder != null) {          folder.close(false);        }        if (store != null) {          store.close();        }      } catch (MessagingException e) {        e.printStackTrace();      }    }     System.out.println("接收完毕!");  }}

 

Android Java使用JavaMail API发送和接收邮件的代码示例