Java封装好的mail包发送电子邮件的类

下面代码是利用Java mail包封装了一个发送邮件的类

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
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;

public class SendMail {
  private static final String MAIL_ADDRESS_REGEX = "^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,3}$";

  private String mailServer;
  private String sender;
  private String[] receiver;

  public SendMail(){

  }

  public void setMailBasicInfo(String mailServer,String sender,String receiver){
    this.mailServer = mailServer;
    this.sender = sender;
    this.receiver =receiver.split(",");
  }

  public void setMailBasicInfo(String mailServer,String sender,String[] users){
    this.mailServer = mailServer;
    this.sender = sender;
    this.receiver = users;
  }

  public void setMailBasicInfo(String mailServer,String sender,List<String> users){
    this.mailServer = mailServer;
    this.sender = sender;
    this.receiver = new String[users.size()];
    users.toArray(this.receiver);
  }

  public boolean send(String subject, String content, List<String> fileNames)
  {
    subject = subject==null?"":subject;
    content = content==null?"":content;
    Properties props = new Properties();
    props.put("mail.smtp.host", mailServer);
    Session session = Session.getInstance(props, null);
    try
    {
      InternetAddress[] receiver = getReceiverList();
      if (receiver.length == 0)
      {
        System.out.println("receiver is null");
        return false;
      }
      MimeMessage msg = new MimeMessage(session);
      msg.setFrom(new InternetAddress(sender));
      msg.setRecipients(Message.RecipientType.TO, receiver);
      msg.setSubject(subject);
      msg.setSentDate(new Date());

      Multipart container = new MimeMultipart();
      MimeBodyPart textBodyPart = new MimeBodyPart();
      textBodyPart.setContent(content.toString(), "text/html;charset=gbk");
      container.addBodyPart(textBodyPart);

      doAttachFile(container,fileNames);
      msg.setContent(container);
      System.out.println("begin send mail");
      Transport.send(msg);
      System.out.println("send mail success");
    }
    catch (MessagingException e)
    {
      System.out.println("send mail fail");
      System.out.println(e);
      return false;
    }
    catch(Exception e){
      return false;
    }
    return true;
  }

  public boolean send(String subject, String content){
    return send(subject,content,null);
  }

  public boolean send(String subject){
    return send(subject,null);
  }

  private void doAttachFile(Multipart container, List<String> fileNames) throws MessagingException{
    if(fileNames==null || fileNames.size()==0)
      return;
    for(String filename:fileNames){
      File f = new File(filename);
      if(!f.isFile())
        continue;
      System.out.println("the attach file is:"+filename);
      MimeBodyPart fileBodyPart = new MimeBodyPart();
      FileDataSource fds = new FileDataSource(f);// 要发送的附件地址
      fileBodyPart.setDataHandler(new DataHandler(fds));
      fileBodyPart.setFileName(fds.getName());// 设置附件的名称
      container.addBodyPart(fileBodyPart);
    }
  }

  private InternetAddress[] getReceiverList() throws AddressException
  {
    ArrayList<InternetAddress> toList = new ArrayList<InternetAddress>();
    for (int i = 0; i < receiver.length; ++i)
    {
      if (receiver[i].matches(MAIL_ADDRESS_REGEX))
      {
        toList.add(new InternetAddress(receiver[i]));
      }
    }

    return (InternetAddress[]) toList.toArray(new InternetAddress[toList.size()]);
  }
}

使用举例

String host = "168.xx.xx.xx"; //邮件服务器的地址
String subject = "发送邮件的主题";
String sender = "test@gmail.com";
List<String> receivers = new ArrayList<String>();
receivers.add("user1@263.com");
receivers.add("user2@263.com");
String content = "邮件主题";
SendMail sendMail = new SendMail();
sendMail.setMailBasicInfo(host, sender, receivers);
sendMail.send(subject, content, null); //没有附件

正文也可以是html内容,如

String content = "<html>详细信息:<a href='xxxx'>请点击查看!</a></html>";

我们再来看一个封装好的类

package com.message.base.email;

import com.message.base.spring.ApplicationHelper;
import com.message.base.utils.StringUtils;
import com.message.base.utils.ValidateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * 发送邮件服务器.
 *
 * @author sunhao(sunhao.java@gmail.com)
 * @version V1.0, 13-3-25 上午6:19
 */
public class EmailServer {
  private static final Logger logger = LoggerFactory.getLogger(EmailServer.class);
  //spring中配置
  /**邮箱服务器配置**/
  private List<EmailConfig> config;
  /**是否开启debug调试模式**/
  private boolean isDebug = false;
  /**是否启用身份验证**/
  private boolean isAuth = true;
  /**验证类型**/
  private String authType = "auth";

  /**
   * 私有化默认构造器,使外部不可实例化
   */
  private EmailServer(){}

  /**
   * 单例,保证上下文中只有一个EmailServer
   *
   * @return EmailServer
   */
  public static EmailServer getInstance(){
    return ApplicationHelper.getInstance().getBean(EmailServer.class);
  }

  /**
   * 发送普通邮件(单个接收人)
   *
   * @param username   发件人用户名
   * @param password   发件人密码
   * @param title     邮件标题
   * @param content    邮件正文
   * @param receiver   单个接收人
   * @return
   */
  public boolean sendTextMail(String username, String password, String title, String content, String receiver){
    return this.sendTextMail(username, password, title, content, Collections.singletonList(receiver));
  }

  /**
   * 发送普通邮件(多个接收人)
   *
   * @param username   发件人用户名
   * @param password   发件人密码
   * @param title     邮件标题
   * @param content    邮件正文
   * @param receivers   多个接收人
   * @return
   */
  public boolean sendTextMail(String username, String password, String title, String content, List<String> receivers){
    Authentication auth = null;
    if(this.isAuth()){
      //如果需要身份认证,则创建一个密码验证器
      auth = new Authentication(username, password);
    }

    Properties props = new Properties();
    props.setProperty("mail.smtp.auth", this.isAuth() ? "true" : "false");
    props.setProperty("mail.transport.protocol", "auth");
    EmailConfig config = this.getEmailConfig(username);
    props.setProperty("mail.smtp.host", config.getSmtp());
    props.setProperty("mail.smtp.port", config.getPort() + "");

    // 根据邮件会话属性和密码验证器构造一个发送邮件的session
    Session session = Session.getDefaultInstance(props, auth);
    session.setDebug(this.isDebug);

    Message message = this.makeTextMail(session, title, content, username, receivers, false);
    try {
      Transport.send(message);

      return true;
    } catch (MessagingException e) {
      logger.error(e.getMessage(), e);
      return false;
    }
  }

  /**
   * 发送HTML邮件(单个接收人)
   *
   * @param username   发件人用户名
   * @param password   发件人密码
   * @param title     邮件标题
   * @param content    邮件正文
   * @param receiver   单个接收人
   * @return
   */
  public boolean sendHtmlMail(String username, String password, String title, String content, String receiver){
    return this.sendHtmlMail(username, password, title, content, Collections.singletonList(receiver));
  }

  /**
   * 发送HTML邮件(多个接收人)
   *
   * @param username   发件人用户名
   * @param password   发件人密码
   * @param title     邮件标题
   * @param content    邮件正文
   * @param receivers   多个接收人
   * @return
   */
  public boolean sendHtmlMail(String username, String password, String title, String content, List<String> receivers){
    Authentication auth = null;
    if(this.isAuth()){
      //如果需要身份认证,则创建一个密码验证器
      auth = new Authentication(username, password);
    }

    Properties props = new Properties();
    props.setProperty("mail.smtp.auth", this.isAuth() ? "true" : "false");
    props.setProperty("mail.transport.protocol", "auth");
    EmailConfig config = this.getEmailConfig(username);
    props.setProperty("mail.smtp.host", config.getSmtp());
    props.setProperty("mail.smtp.port", config.getPort() + "");

    // 根据邮件会话属性和密码验证器构造一个发送邮件的session
    Session session = Session.getDefaultInstance(props, auth);
    session.setDebug(this.isDebug);

    Message message = this.makeTextMail(session, title, content, username, receivers, true);
    try {
      Transport.send(message);

      return true;
    } catch (MessagingException e) {
      logger.error(e.getMessage(), e);
      return false;
    }
  }

  /**
   * 获取邮件服务器配置
   *
   * @param email     邮箱地址
   * @return
   */
  private EmailConfig getEmailConfig(String email){
    String mailServiceDomainName = this.getMailServiceDomainName(email);
    for(EmailConfig config : this.config) {
      if(config.getName().equals(mailServiceDomainName)){
        return config;
      }
    }
    return null;
  }

  /**
   * 创建邮件message
   *
   * @param session    根据配置获得的session
   * @param title     邮件主题
   * @param content    邮件的内容
   * @param from     发件者
   * @param receivers   收件者
   * @param isHtmlMail  是否是html邮件
   */
  private Message makeTextMail(Session session, String title, String content, String from, List<String> receivers, boolean isHtmlMail){
    Message message = new MimeMessage(session);
    try {
      /**标题**/
      logger.info("this mail's title is {}", title);
      message.setSubject(title);
      /**内容**/
      logger.info("this mail's content is {}", content);
      if(isHtmlMail){
        //是html邮件
        message.setContent(content, "text/html;charset=utf-8");
      } else {
        //普通邮件
        message.setText(content);
      }
      /**发件者地址**/
      logger.info("this mail's sender is {}", from);
      Address fromAddress = new InternetAddress(from);
      message.setFrom(fromAddress);
      /**接收者地址**/
      Address[] tos = new InternetAddress[receivers.size()];
      for(int i = 0; i < receivers.size(); i++){
        String receiver = receivers.get(i);
        if(ValidateUtils.isEmail(receiver)){
          tos[i] = new InternetAddress(receiver);
        }
      }
      /**发件时间**/
      message.setSentDate(new Date());

      message.setRecipients(Message.RecipientType.TO, tos);
    } catch (MessagingException e) {
      logger.error(e.getMessage(), e);
      e.printStackTrace();
    }

    return message;
  }

  /**
   * 获取邮箱域名
   *
   * @param email   邮箱
   * @return
   */
  private String getMailServiceDomainName(String email){
    if(StringUtils.isEmpty(email)){
      return "";
    } else {
      int firstIndex = StringUtils.indexOf(email, "@");
      int secondIndex = StringUtils.lastIndexOf(email, ".");

      return StringUtils.substring(email, firstIndex + 1, secondIndex);
    }
  }

  public List<EmailConfig> getConfig() {
    return config;
  }

  public void setConfig(List<EmailConfig> config) {
    this.config = config;
  }

  public boolean isDebug() {
    return isDebug;
  }

  public void setDebug(boolean debug) {
    isDebug = debug;
  }

  public boolean isAuth() {
    return isAuth;
  }

  public void setAuth(boolean auth) {
    isAuth = auth;
  }

  public String getAuthType() {
    return authType;
  }

  public void setAuthType(String authType) {
    this.authType = authType;
  }
}

调用方式如下

public boolean sendMail() throws Exception {
  List<String> receivers = new ArrayList<String>();
  receivers.add("sunhao0550@163.com");
  receivers.add("sunhao0550@sina.cn");
  EmailServer.getInstance().sendHtmlMail("message_admin@163.com", "这里是密码", "测试发送HTML邮件",
      "<span style='color: red;font-size: 20pt'>测试发送HTML邮件</span><a href='http://www.baidu.com' target='_blank'>链接到百度</a>", receivers);
  return EmailServer.getInstance().sendTextMail("message_admin@163.com", "这里是密码", "测试发送文本邮件",
      "测试发送文本邮件测试发送文本邮件测试发送文本邮件", receivers);
}

PS:正在考虑扩展,如果把这几个类封在jar包中,如何进行邮件服务器配置的扩展.

如有不好之处,欢迎拍砖.

(0)

相关推荐

  • Java发送邮件javax.mail的实现方法

    直接上源码: 1. 邮件的基本信息(方便就直接设置为静态了) 下面最好是做为一个javabean package com.lgf.Email; import java.util.Date; public class EmailMessage { /** * 邮件的信息,可以自己进行设置. * 为了方便直接全部设置为静态 */ // 收件人邮箱 public static String TO = "xxx@xxx.com"; // 发件人邮箱 public static String F

  • Java的Spring框架中实现发送邮件功能的核心代码示例

    Spring中已经封装了邮件操作类,通过spring配置文件可以便捷地注入到controller.action等地方. 下面是配置: <!-- mail sender --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" p:host="${mail.host}" p:port="${mail.por

  • 如何使用JavaMail发送邮件

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

  • java发送内嵌图片邮件

    整体效果: 发送端:网易邮箱:接收端:qq邮箱. 1.web前端 2.在网易邮箱"已发送"中可以看见通过java代码发送的邮件 3.同样在qq邮箱中也可以看到这样的效果 实现过程: 1.web前端(bootstrap布局) <form action="mailAction!sendMail" method="post" name="mailForm" id="mailFormId"> <u

  • Java中使用JavaMail多发邮件及邮件的验证和附件实现

    多发和用户验证 下面先来介绍如何实现将邮件发送给多个收件人和如何利用Authenticators对象实现用户验证.   指定收件人的时候,我们可以有两种方法来指定.上篇博客是在发送邮件的时候临时指定收件人,其实还可以在Message对象中指定. message.addRecipient(Message.RecipientType.TO,new InternetAddress(" 995812509@99.com ")); 这个只是发送给一个收件人而言,但是有多个收件人如何处理?同样有两

  • java发送邮件示例讲解

    本文实例讲解了java发邮件的详细过程,供大家参考,具体内容如下 1.邮件协议 发邮件的:SMTP (Simple Mail Transport  Protocal) 收邮件的协议:pop3 (Post Office Protocal 3) IMAP 新协议 发邮件也可以收邮件. (一步步的与服务器交互) SMTP : 2.收发邮件的过程: 一般情况下,smtp和pop3是两个服务器(主机). Smtp邮件的端口为25. POP3 端口 为110. 发邮件示例 1).安装foxmail: 2).

  • java发送javax.mail邮件实例讲解

    平时我们网上逛网站的时候,经常会用到网站的注册.有很多方法,比如发短信验证,发邮箱验证.最近在SSH框架下,做了一个简单的邮件发送激活链接到邮箱,然后激活注册用户的一个功能.我用到的MailServer是易邮邮件服务器,引用的是javax.mail.jar包.javamail顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输. [常用类介绍] 下面有一些常用的类,给大家介绍一下: [Authenticator] 这个是

  • Java实现简单邮件发送

    JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件.这一机制被广泛的用在注册激活和垃圾邮件的发送等方面. Java邮件发送的大致过程是这样的: 1.构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法.此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利. 2.构建一个proper

  • 解析电子邮件的基本概念及JavaMail API邮件功能使用

    电子邮件的基本概念介绍 电子邮件用于网上的信心传递和交流,它是最重要的Internet服务之一.据统计Internet有30%的业务是电子邮件有关的.同时我们也不可否认它在我们的日常生活.工作办公方面扮演着很重要的角色.譬如:许多办公自动化项目(OA)中都要附带发送邮件的功能,如果还要使用OutLook等手工方式就不适合,在这个高速的时代,我们需要提供工作效率,让工作能够自动化.同时在许多网站中也都需要附带发送邮件的功能:给新注册的用户发送一封包含其注册信息的欢迎E-Mail.将网站的最新活动信

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

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

随机推荐