JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。

JAVA邮件发送的大致过程是这样的的:

1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。

2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。

3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。

4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。

5、使用javax.mail.Transport工具类发送邮件。

下面是具体代码:

方法一:

/**
* @ClassName : Authentication
* @Description : 验证器
* @author : chenrl
* @date : 2015年10月30日 上午9:59:52
*/
public class Authentication extends Authenticator {
  String username=null;
  String password=null;

  public Authentication(){

  }
  public Authentication(String username, String password) {
    this.username = username;
    this.password = password;
  }
  protected PasswordAuthentication getPasswordAuthentication(){
    PasswordAuthentication pa = new PasswordAuthentication(username, password);
    return pa;
  }
}

public class SendMail {
  // 发送邮件的服务器的IP和端口
  private String mailServerHost;
  private String mailServerPort = "25";
  private String fromAddress;
  private String toAddress;
  private String userName;
  private String password;
  private boolean validate = false;
  private String subject;
  private String content;
  private String[] attachFileNames;

  /**
  * 获得邮件会话属性
  */
  public Properties getProperties() {
    Properties p = new Properties();
    p.put("mail.smtp.host", this.mailServerHost);
    p.put("mail.smtp.port", this.mailServerPort);
    p.put("mail.smtp.auth", validate ? "true" : "false");
    return p;
  }

  //set get

}

public class MailSend {
  public boolean sendTextMail(final SendMail mailInfo) {
    // 判断是否需要身份认证
    Authentication authenticator = null;
    Properties pro = mailInfo.getProperties();
    if (mailInfo.isValidate()) {
      // 如果需要身份认证,则创建一个密码验证器
      authenticator = new Authentication(mailInfo.getUserName(), mailInfo.getPassword());
    }
    // 根据邮件会话属性和密码验证器构造一个发送邮件的session
    /*Session sendMailSession = Session.getDefaultInstance(pro,authenticator); */
    Session sendMailSession = Session.getDefaultInstance(pro, new Authenticator(){
      protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(mailInfo.getUserName(), mailInfo.getPassword());
      }

    });
    try {
      Message mailMessage = new MimeMessage(sendMailSession);
      Address from = new InternetAddress(mailInfo.getFromAddress());
      mailMessage.setFrom(from);
      Address to = new InternetAddress(mailInfo.getToAddress());
      mailMessage.setRecipient(Message.RecipientType.TO,to);
      mailMessage.setSubject(mailInfo.getSubject());
      mailMessage.setSentDate(new Date());
      String mailContent = mailInfo.getContent();
      mailMessage.setText(mailContent);
      Transport.send(mailMessage);
      return true;
    } catch (MessagingException ex) {
      ex.printStackTrace();
    }
    return false;
  }
  /**
  * 以HTML格式发送邮件
  */
  public boolean sendHtmlMail(SendMail mailInfo){
    // 判断是否需要身份认证
    Authentication authenticator = null;
    Properties pro = mailInfo.getProperties();
    if (mailInfo.isValidate()) {
      authenticator = new Authentication(mailInfo.getUserName(), mailInfo.getPassword());
    }
    // 根据邮件会话属性和密码验证器构造一个发送邮件的session
    Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
    try {
      // 根据session创建一个邮件消息
      Message mailMessage = new MimeMessage(sendMailSession);
      Address from = new InternetAddress(mailInfo.getFromAddress());
      mailMessage.setFrom(from);
      Address to = new InternetAddress(mailInfo.getToAddress());
      // Message.RecipientType.TO属性表示接收者的类型为TO
      mailMessage.setRecipient(Message.RecipientType.TO,to);
      mailMessage.setSubject(mailInfo.getSubject());
      mailMessage.setSentDate(new Date());
      Multipart mainPart = new MimeMultipart();
      BodyPart html = new MimeBodyPart();
      html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
      mainPart.addBodyPart(html);
      mailMessage.setContent(mainPart);
      Transport.send(mailMessage);
      return true;
    } catch (MessagingException ex) {
      ex.printStackTrace();
    }
    return false;
  }
}

public class Send {

  public static void main(String[] args) {
    //设置邮件参数
    SendMail mail = new SendMail();
    //qq邮箱
    //mail.setMailServerHost("smtp.qq.com"); //这里填发送者的邮箱服务器,我以qq举个例子
    //sina
    mail.setMailServerHost("smtp.sina.com");
    mail.setMailServerPort("25");
    mail.setValidate(true);
    /*
    mail.setUserName("发送者的邮箱名字");
    mail.setPassword("发送者邮箱密码");
    mail.setFromAddress("发送者邮箱名字");
    mail.setToAddress("接受者邮箱密码");
    mail.setSubject("标题");
    mail.setContent("内容"); */
    /*qq邮箱测试成功*/
    /*163邮箱测试失败*/
    /*gov.cn邮箱测试失败*/
    /*sina邮箱测试成功*/
    //发送邮件
    MailSend sms = new MailSend();
    sms.sendTextMail(mail);//发送文体格式
    sms.sendHtmlMail(mail);//发送html格式
  }
}

方法二:用下面的方法也可以实现:

/****************************************************************
* 对QQ邮箱使用(对于其他的使用类似的你应该也会更改了)
* 首先把QQ邮箱的POP3 SMTP打开
* 首先确定你的网络正常、非代理
* 确定你的QQ邮箱开启了SMTP
* 如果没有开启,那么这样设置下
* 设置->账户 --在下面-- 把这个选上 [√]SMTP发信后保存到服务器
****************************************************************/
public class SendEmail {

  //设置服务器
  private static String KEY_SMTP = "mail.smtp.host";
  private static String VALUE_SMTP = "smtp.qq.com";
  //服务器验证
  private static String KEY_PROPS = "mail.smtp.auth";
  private static boolean VALUE_PROPS = true;
  //发件人用户名、密码
  private String SEND_USER = EmailConfProperties.getEmail();//你的QQ邮箱
  private String SEND_UNAME = EmailConfProperties.getEmailName(); //你的邮箱名
  private String SEND_PWD = EmailConfProperties.getEmailPwd(); //你的邮箱密码
  //建立会话
  private MimeMessage message;
  private Session s;

  /*
  * 初始化方法
  * */
  public SendEmail(){
    Properties props = System.getProperties();
    props.setProperty(KEY_SMTP, VALUE_SMTP);
    props.put(KEY_PROPS, VALUE_PROPS);
    s = Session.getInstance(props);
    s.setDebug(true);//开启后有调试信息
    message = new MimeMessage(s);
  }

  /**
  * 发送邮件
  * @param headName 邮件头文件名
  * @param sendHtml 邮件内容
  * @param receiveUser 收件人184172133@qq.com
  */
  public void doSendHtmlEmail(String headName,StringBuffer sendHtml,String receiveUser){
    try {
      // 发件人
      InternetAddress from = new InternetAddress(SEND_USER);
      message.setFrom(from);
      // 收件人
      InternetAddress to = new InternetAddress(receiveUser);
      message.setRecipient(Message.RecipientType.TO, to);
      // 邮件标题
      message.setSubject(headName);
      String content = sendHtml.toString();
      // 邮件内容,也可以使纯文本"text/plain"
      message.setContent(content, "text/html;charset=GBK");
      message.saveChanges();
      Transport transport = s.getTransport("smtp");
      // smtp验证,就是你用来发邮件的邮箱用户名密码
      transport.connect(VALUE_SMTP, SEND_UNAME, SEND_PWD);
      // 发送
      transport.sendMessage(message, message.getAllRecipients());
      transport.close();
    } catch (AddressException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (MessagingException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    //发邮件提醒
    SendEmail email = new SendEmail();
    String server_IP = EmailConfProperties.getServerIP();
    String server_Port = EmailConfProperties.getServerPort();
    String server_Name = EmailConfProperties.getServerName();
    String path = "http://" + server_IP + ":" + server_Port + "/" + server_Name;
    String headName = "用户注册信息审核通知";
    StringBuffer sendHtml = new StringBuffer("亲爱的用户,您好:" +
      "<br>&nbsp;&nbsp;&nbsp;&nbsp;验证码已经发送到您的邮箱,请尽快完成密码找回功能,验证码为:" + 123 +
      "<br>&nbsp;&nbsp;&nbsp;&nbsp;您可以:<a href='" + path + "'>点击此处登录</a>" +
      "<br><br>系统邮件,请勿回复");
    String receiveUser = "users516@163.com";
    email.doSendHtmlEmail(headName, sendHtml, receiveUser);
    // System.out.println("邮件已发出,请注意查收!");
  }
}

public class EmailConfProperties {
  private static Properties properties;

  static {
    properties = null;
    try {
      if (properties == null) {
        properties = new Properties();
        properties.load(EmailConfProperties.class.getClassLoader().getResourceAsStream("emailConfig.properties"));
      }
    } catch (Exception e) {
      System.err.println("not find emailConfig.properties");
      e.printStackTrace();
    }
  }
  //发件人邮箱
  public static String getEmail() {
    return properties.getProperty("send_Email");
  }
  //发件人邮箱名
  public static String getEmailName() {
    return properties.getProperty("send_EmailName");
  }
  //发件人邮箱密码
  public static String getEmailPwd() {
    return properties.getProperty("send_EmailPwd");
  }

  public static String getServerIP(){
    return properties.getProperty("server_IP");
  }
  public static String getServerPort(){
    return properties.getProperty("server_port");
  }
  public static String getServerName(){
    return properties.getProperty("server_Name");
  }
}

emailConfig.properties:配置文件

send_Email = 123456789@qq.com
send_EmailName = 123456789
send_EmailPwd = 123456789
server_IP = 192.168.17.92
server_port = 8080
server_Name = ISMS

JAVA邮件发送的简单实现的更多相关文章

  1. 基于JavaMail的Java邮件发送:简单邮件发送

    使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) . 您可以从 Java 网 ...

  2. java-基于JavaMail的Java邮件发送

    1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送

  3. 基于JavaMail的Java邮件发送:复杂邮件发送

    参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.ut ...

  4. java邮件发送(含附件)

    1. [代码]java邮件发送(含附件)疯狂的IT人站长整理的:利用Java发送邮件(含附件)的例子:1.邮件发送的配置propertity文件内容如下:(utils.properties文件放在sr ...

  5. Java Mail邮件发送的简单实现

    1.什么是java mail JAVA MAIL是利用现有的邮件账户发送邮件的工具,通过JAVA Mail的操控,让程序自动的使用设置的邮箱发送邮件. 这一机制被广泛的用在注册激活和垃圾邮件的发送等方 ...

  6. Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  7. java 邮件发送工具类

    首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...

  8. java 邮件发送工具类【来源网络自己已经实际应用】

    最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...

  9. 【转】基于JavaMail的Java邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

随机推荐

  1. 【转】SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

    转自:http://www.coderli.com/junit-spring-test-applicationcontext JUnit单元测试用例中使用Spring框架,直接方式如下. @RunWi ...

  2. jquery放大镜效果

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  3. 显式激活数据库( ACTIVATE DATABASE)

    某天值班员联系我说,我负责的一套报送系统没有按时生成报文,因为此报警提前量比较大,加上系统经常发生未按时生成报文的事件,也就是没在意,然后不急不慢的到公司,打开系统页面,发现其中一个存储过程跑了将近8 ...

  4. IEqualityComparer<T>

    在linq中使用union和distinct都不起作用,结果发现必须传入一个实现了IEqualityComparer<T>的比较器 public class CompareUser : I ...

  5. PHP面向对象学习六 多态

    OOP的模式并不仅仅是把很多函数和功能集合起来,目的而是使用类,继承,多态的方式描述我们生活中的一种情况.从而使得我们的代码更具有“物”的意义.帮助我们减少一些重复性的代码和条件语句的判断.   运算 ...

  6. 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版

    2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...

  7. 关于新增元素使用jQuery on()方法重复绑定的问题

    最近写ajax新增元素button绑定click事件的时候发现元素重新添加进来的时候会多执行一次事件函数,找了半天,怀疑是on()的问题,于是测试了一下,果然是因为on()的使用方式造成了有的新增元素 ...

  8. light oj 1047 - Neighbor House 动态规划

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/C 题目: Description The peopl ...

  9. asp.net 网站开发流程总结

    由于这学期要做asp.net的网站开发,导师让我们在前期做详细的计划说明,时间安排.由于网站开发流程不知道,以及需要学什么指示都是盲懂,所以计划安排需在了解大致流程之后才能做出来,一下是询问同学和在网 ...

  10. [LintCode] Move Zeroes 移动零

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...