天天看點

java實作背景自動發郵件功能

ava實作背景自動發郵件功能

web.xml檔案 

<?xml version="1.0" encoding="utf-8"?>

<!doctype web-app public "-//sun microsystems, inc.//dtd web application 2.3//en" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <servlet>

    <servlet-name>mailsenderservlet</servlet-name><!--郵件發送程式-->

    <servlet-class>com.email.mailsenderservlet</servlet-class>

    <init-param>

      <param-name>server</param-name><!--郵件伺服器smtp位址-->

      <param-value>smtp.163.com</param-value>

    </init-param>

      <param-name>port</param-name><!--郵件伺服器smtp端口-->

      <param-value>25</param-value>

      <param-name>address</param-name><!--郵件位址-->

      <param-value>[email protected]</param-value>

      <param-name>username</param-name><!--郵件賬号-->

      <param-value>username</param-value>

      <param-name>password</param-name><!--密碼-->

      <param-value>******</param-value>

      <param-name>validate</param-name><!--smtp伺服器是否要求驗證-->

      <param-value>true</param-value>

      <param-name>time</param-name><!--掃描資料庫時間間隔(分鐘)-->

      <param-value>5</param-value>

    <load-on-startup>1</load-on-startup>

  </servlet>

</web-app> 

servlet: 

package com.email; 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*; 

public class mailsenderservlet

    extends httpservlet {

  private mailsender sender;

  private thread t; 

  public void init() throws servletexception {

    sender = new mailsender();

    sender.setroot(root);

    string server = getinitparameter("server"); 

string port = getinitparameter("port");

    string address = getinitparameter("address");

    string username = getinitparameter("username");

    string password = getinitparameter("password");

    if (server == null || port == null || address == null || username == null ||

        password == null) {

      system.out.println("系統檔案web.xml錯誤:郵件發送程式初始化失敗!");

      return;

    }

    sender.setserver(server);

    sender.setport(port);

    sender.setaddress(address);

    sender.setusername(username);

    sender.setpassword(password); 

    string time = getinitparameter("time");

    if (time != null) {

      sender.settime(integer.parseint(time));

    string validate = getinitparameter("validate");

    if (validate != null) {

      sender.setvalidate(boolean.valueof(validate).booleanvalue());

    t = new thread(sender);

    t.start(); //啟動郵件發送線程

  } 

  public void destroy() {

    sender.stop(); //停止郵件發送線程

    try {

      t.join(1000);

      if (t.isalive()) {

        system.out.println("郵件發送線程未停止。");

      }

    catch (exception e) {}

郵件發送程式 

import java.io.*;

import java.sql.*;

import java.util.*;

import java.util.date;

import javax.activation.*;

import javax.mail.*;

import javax.mail.message.*;

import javax.mail.internet.*; 

/**

 * <p>copyright: copyright (c) 2004</p>

 * @author [email protected]

 * @version 1.0

 */ 

public class mailsender

    implements runnable { 

private int time = 5 * 60 * 1000; //掃描資料庫時間間隔

  private boolean flag = true; //停止線程标記

  private string server = "127.0.0.1"; //smtp伺服器位址

  private string port = "25"; //smtp伺服器端口

  private string address; //用于發送email的發送者位址

  private string username; //發送者的使用者名

  private string password; //發送者的密碼

  private boolean validate = true; //郵件伺服器是否要求驗證

  private file root = null; //web根目錄

  mailconfigmanager manager = mailconfigmanager.getinstance(); 

  public mailsender() {

  public void setaddress(string address) {

    this.address = address;

  public void setpassword(string password) {

    this.password = password;

  public void setport(string port) {

    if (port != null && port.length() > 0) {

      this.port = port;

  public void setserver(string server) {

    this.server = server;

  public void setusername(string username) {

    this.username = username;

  public void setvalidate(boolean validate) {

    this.validate = validate;

  public void settime(int minute) {

    this.time = minute * 60 * 1000;

  public void run() {

    long lasttime = new date().gettime(); //儲存前一次發送郵件的時間

    while (flag) { //伺服器停止時退出線程

      long k = new date().gettime() - lasttime;

      if (k < -1000) { //防止系統修改時間

        lasttime = new date().gettime();

        continue;

      if (k > time) { //超過設定時間間隔開始發送郵件

        senddata();

      try {

        thread.sleep(100);

      catch (exception e) {}

  public void stop() {

    flag = false; 

  /**

   * 檢索資料庫,并發送郵件

   */

  private void senddata() {

    resultset rs=null;//讀取資料庫資料

      session session = session.getinstance(getproperties(), new authentic());

      while(flag) {//伺服器停止時退出線程

        string toaddress = null;//發送位址(從rs中得到)

        string subject = null;//郵件主題

        string content = null ;//郵件内容

        string file[] = null;//所有附件(絕對路徑)

        sendmail(session, toaddress, subject, content, file);//發送郵件

    catch (exception e) {

      e.printstacktrace();

    finally {

      if(rs!=null){

        try{

          rs.close();

        }

        catch(sqlexception e){}

   * 發送郵件

   * @param session 會話

   * @param toaddress 目的位址

   * @param subject 郵件主題

   * @param content 郵件内容(html)

   * @param files 郵件附件

   * @return 是否發送成功

  private boolean sendmail(session session, string toaddress, string subject,

                           string content, string[] files) { 

    toaddress = "[email protected]"; 

      message rs = new mimemessage(session); 

      address from = new internetaddress(address);

      rs.setfrom(from); //發送位址

      rs.setrecipient(recipienttype.to, new internetaddress(toaddress)); //接收位址

      rs.setsubject(subject); //郵件主題

      multipart mp = new mimemultipart();

      bodypart html = new mimebodypart(); 

      html.setcontent(content, "text/html; charset=gbk"); //郵件html内容

      mp.addbodypart(html);

      if (files != null && files.length > 0) { //郵件附件

        for (int i = 0; i < files.length; i++) {

          mimebodypart mbp = new mimebodypart();

          filedatasource fds = new filedatasource(files[i]);

          mbp.setdatahandler(new datahandler(fds));

          mbp.setfilename(mimeutility.encodeword(files[i]), "gbk", null));

          mp.addbodypart(mbp);

      rs.setcontent(mp); //郵件全部内容

      rs.setsentdate(new date()); //發送時間

      transport.send(rs); //發送

      return true;

      return false;

   * 郵件會話屬性

   * @return 會話屬性

  private properties getproperties() {

    properties rs = new properties();

    rs.put("mail.smtp.host", server);

    rs.put("mail.smtp.port", port);

    rs.put("mail.smtp.auth", validate ? "true" : "false");

    return rs;

  public void setroot(file root) {

    this.root = root;

  class authentic

      extends authenticator { //驗證密碼 

    public authentic() {

    } 

    public passwordauthentication getpasswordauthentication() {

      return new passwordauthentication(username, password);

本文出自seven的測試人生公衆号最新内容請見作者的github頁:http://qaseven.github.io/