欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-12 14:32:26
使用javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/ja...

使用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收发邮件所有的接口和类。
 
常用的类:

  •      javax.mail.session;                                                    -------->保存连接服务器所需要的信息;
  •      javax.mail.message;                                                  -------->邮件体,保存邮件的内容;
  •      javax.mail.transport;                                                 -------->发送邮件的载体
  •      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="/" mce_src="/""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("接收完毕!");
  }
}