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

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

相关推荐

  • 邮件的组织结构介绍 邮件实现详解(三)

    要想各种邮件处理程序能识别我们所写的电子邮件,能从我们所书写的电子邮件中分析和提取出发件人,收件人,邮件主题和邮件内容以及附件等信息,那么我们所写的电子邮件必须要遵循一定的格式要求,正如我们上一篇博客 手工体验smtp和pop3协议 ,我们在发送邮件时有固定的写法.而这种邮件内容的基本格式和具体细节分别是由 RFC822 文档和 MIME 协议定义的. 1.RFC822 邮件格式 英文参考文档如下:https://tools.ietf.org/html/rfc822 RFC822 文档中定义的文

  • JavaMail实现邮件发送的方法

    本文实例讲述了JavaMail实现邮件发送的方法.分享给大家供大家参考.具体如下: 下载 activation.jar 和 mail.jar 配置CLASSPATH,将上面两个jar包加入到CLASSPATH中. JavaBean : "SendEmail.java" package cls; import java.util.Date; import java.util.Properties; import javax.mail.*; import javax.mail.intern

  • Java程序中使用JavaMail发送带图片和附件的邮件

    我们常常在邮件中添加附件,以达到传输较大文件的目的.而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩.我们想要一封正文部分图文并茂,而游客附带若干附件的邮件. 下面是代码结构中3个重要的方法: MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回: MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并

  • Java基于JavaMail实现向QQ邮箱发送邮件

    最近项目在做新闻爬虫,想实现这个功能:爬虫某个页面失败后,把这个页面的 url 发到邮箱.最终实现的效果图如下,后期可以加上过滤标签.失败状态码等,方便分类搜索异常. 开发人员可以根据邮件里的 url 和堆栈信息,分析爬虫失败的原因. 是不是服务器 down 了? 还是爬虫的 Dom 解析没有解析到内容? 还是正则表达式对于这个页面不适用? 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 注意开启完之后,QQ 邮箱会生成一个授权码,在代码里连接邮箱使用这个授权码而不是原

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • 基于SSM框架+Javamail发送邮件的代码实例

    本篇介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实也是Foxmail邮箱 先要了解一下SMTP协议和SSL加密 SMTP:称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效.可靠的邮件传输.SMTP是一种请求响应的协议,也就是客户机向远程服务器发送请求,服务器响应,监听端口是25,所以其工作模式有两种:发送SMTP,接收SMTP. SSL加密:用来保障浏

  • JavaWeb中使用JavaMail实现发送邮件功能实例详解

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp <%@ page language="java" pag

  • java中javamail收发邮件实现方法

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. POP3(Post Office Protocol – Version 3) :即邮局协议版本 3 ,用于接收电子邮件的标准协议. IMAP(Internet Mail Access Protocol) :即 In

  • struts2集成javamail发邮件示例详解

    一.代码预览这两天在做struts2上的邮件发送.以前的项目有用到spring,用spring提供的邮件支持类很方便可以完成这个功能,但是现在只用struts2的话,就碰到了一系列的问题. 请先将自己下载的 mail.jar,及activation.jar加入到classpath 复制代码 代码如下: package com.nerve.cloudoffice.common.util; import java.util.List;import java.util.Properties; impo

  • JavaMail实现发送超文本(html)格式邮件的方法

    本文实例讲述了JavaMail实现发送超文本(html)格式邮件的方法.分享给大家供大家参考.具体如下: 附件以超文本形式,很常用,与普通的邮件,只是查了一些设置,只有处理方式有些细微的差别 代码如下: <%@ page contentType="text/html;charset=GBK" %> <%@ page import="java.util.*"%> <%@ page import="javax.mail.*&quo

随机推荐