当前位置: 移动技术网 > IT编程>开发语言>Java > Java使用JavaMail API发送和接收邮件的代码示例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

使用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("接收完毕!");
  }
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网