java mail发送邮件

最近做测试的时候,需要发送邮件,但是实际的邮件收件人,必须是测试或开发,不想每次都改收件人。

所以自己重新写了个发送邮件程序:

1.收件人默认配置开发或者测试;

2.调用的实时发送邮件接口,会实时发送,提高测试效率;

3.收件人,抄送人,密送人会在邮件标题里面列出来,方便测试检查。

后期增加附件的发送。

认证类

package com.info.util;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 邮件
 * 自定义认证器
 * @author menghu
 *
 */
public class MyAuthenticator extends Authenticator {
    String userName = null;
    String password = null;

    public MyAuthenticator() {
    }

    public MyAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
}

自定义邮件对象

package com.info.util;

/**
 * 
 * 邮件
 * 发送邮件工具类
 *     
 */
import java.util.Properties;

public class MailSenderInfo {
    // 发送邮件的服务器的IP和端口
    private String mailServerHost;
    private String mailServerPort;
    // 邮件发送者的地址
    private String fromAddress;
    // 邮件接收者的地址
    private String toAddress;
    // 邮件抄送者的地址
    private String ccAddress;
    // 邮件密送者的地址
    private String bccAddress;
    // 登陆邮件发送服务器的用户名和密码
    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;
    }

    public String getMailServerHost() {
        return mailServerHost;
    }

    public void setMailServerHost(String mailServerHost) {
        this.mailServerHost = mailServerHost;
    }

    public String getMailServerPort() {
        return mailServerPort;
    }

    public void setMailServerPort(String mailServerPort) {
        this.mailServerPort = mailServerPort;
    }

    public boolean isValidate() {
        return validate;
    }

    public void setValidate(boolean validate) {
        this.validate = validate;
    }

    public String[] getAttachFileNames() {
        return attachFileNames;
    }

    public void setAttachFileNames(String[] fileNames) {
        this.attachFileNames = fileNames;
    }

    public String getFromAddress() {
        return fromAddress;
    }

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getToAddress() {
        return toAddress;
    }

    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String textContent) {
        this.content = textContent;
    }

    public String getCcAddress() {
        return ccAddress;
    }

    public void setCcAddress(String ccAddress) {
        this.ccAddress = ccAddress;
    }

    public String getBccAddress() {
        return bccAddress;
    }

    public void setBccAddress(String bccAddress) {
        this.bccAddress = bccAddress;
    }
    
}

发送邮件类

package com.info.util;

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

import javax.mail.Address;
import javax.mail.BodyPart;
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;

/**
 * 邮件 简单邮件(不带附件的邮件)发送器
 * 
 * @author menghu
 * 
 */
public class SimpleMailSender {
    /**
     * 以文本格式发送邮件
     * 
     * @param mailInfo
     *            待发送的邮件的信息
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public boolean sendTextMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MyAuthenticator(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);
            // 创建邮件的接收者地址,并设置到邮件消息中
            List toList = string2List(mailInfo.getToAddress());
            InternetAddress[] tos = (InternetAddress[]) toList.toArray(new InternetAddress[toList.size()]);
            mailMessage.setRecipients(Message.RecipientType.TO, tos);
            List ccList = string2List(mailInfo.getCcAddress());
            InternetAddress[] ccs = (InternetAddress[]) ccList.toArray(new InternetAddress[ccList.size()]);
            mailMessage.setRecipients(Message.RecipientType.CC, ccs);
            List bccList = string2List(mailInfo.getBccAddress());
            InternetAddress[] bccs = (InternetAddress[]) bccList.toArray(new InternetAddress[bccList.size()]);
            mailMessage.setRecipients(Message.RecipientType.CC, bccs);
            // 设置邮件消息的主题
            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格式发送邮件
     * 
     * @param mailInfo
     *            待发送的邮件信息
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static boolean sendHtmlMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        // 如果需要身份认证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(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);
            // 创建邮件的接收者地址,并设置到邮件消息中
            List toList = string2List(mailInfo.getToAddress());
            InternetAddress[] tos = (InternetAddress[]) toList.toArray(new InternetAddress[toList.size()]);
            mailMessage.setRecipients(Message.RecipientType.TO, tos);
            List ccList = string2List(mailInfo.getCcAddress());
            InternetAddress[] ccs = (InternetAddress[]) ccList.toArray(new InternetAddress[ccList.size()]);
            mailMessage.setRecipients(Message.RecipientType.CC, ccs);
            List bccList = string2List(mailInfo.getBccAddress());
            InternetAddress[] bccs = (InternetAddress[]) bccList.toArray(new InternetAddress[bccList.size()]);
            mailMessage.setRecipients(Message.RecipientType.CC, bccs);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static List string2List(String strs) throws AddressException {
        List list = new ArrayList();// 不能使用string类型的类型,这样只能发送一个收件人
        String[] tosStr = strs.split(";");// 对输入的多个邮件进行逗号分割
        for (String str : tosStr) {
            if (CheckUtils.checkStringNotNull(str)) {
                list.add(new InternetAddress(str));
            }
        }
        return list;
    }
}

发送测试类

package com.info.util.test;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import org.apache.log4j.PropertyConfigurator;
import org.hibernate.HibernateException;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

import com.info.util.ADUtils;
import com.info.util.CheckUtils;
import com.info.util.MailSenderInfo;
import com.info.util.SimpleMailSender;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class TestMail extends TestCase {

    private XmlBeanFactory parent = null;
    private XmlBeanFactory factory = null;

    @Override
    protected void setUp() throws Exception {
        String filePath = TestMail.class.getResource("/").getPath();
        System.out.println(filePath);
        PropertyConfigurator.configure("WebRoot/WEB-INF/log4j.properties");
        PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
        // cfg.setLocation(new ClassPathResource("jdbc.properties"));
        Resource jdbcResource = new FileSystemResource("WebRoot/WEB-INF/jdbc.properties");
        cfg.setLocation(jdbcResource);
        Resource resource = new FileSystemResource("WebRoot/WEB-INF/applicationContext.xml");
        parent = new XmlBeanFactory(resource);
        cfg.postProcessBeanFactory(parent);// 必须采用延后加载
    }

    @Override
    protected void tearDown() throws Exception {
        // TODO Auto-generated method stub
        super.tearDown();
    }

    public void testSendMail() throws HibernateException, SQLException {
        ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) parent.getBean("dataSource");
        SimpleJdbcTemplate jdbcTemplate = (SimpleJdbcTemplate) parent.getBean("jdbcTemplate");
        System.out.println(comboPooledDataSource.getJdbcUrl());
        String queryStr = "SELECT * from SYS_EMAIL_SEND t WHERE t.TIMESTAMP IS NULL";
        String updateStr = "UPDATE SYS_EMAIL_SEND t SET t.TIMESTAMP = '-99' WHERE t.EMAIL_ID = ?";
        //判断数据库配置信息,只针对待发送邮件的数据库
        if ("xxx".equals(comboPooledDataSource.getJdbcUrl())) {
            List<Map<String, Object>> emailList = jdbcTemplate.queryForList(queryStr);
            for (Map<String, Object> email : emailList) {
                MailSenderInfo mailInfo = new MailSenderInfo();
                Long email_id = ((BigDecimal) email.get("email_id")).longValue();
                String recipients = (String) email.get("recipients");
                String carbon_copys = (String) email.get("carbon_copys");
                String blind_carbon_copys = (String) email.get("blind_carbon_copys");
                String title = "[测试邮件]" + (String) email.get("title");
                if (CheckUtils.checkStringNotNull(recipients)) {
                    title = title + " to:" + emails2ADNames(recipients);
                }
                if (CheckUtils.checkStringNotNull(carbon_copys)) {
                    title = title + " cc:" + emails2ADNames(carbon_copys);
                }
                if (CheckUtils.checkStringNotNull(blind_carbon_copys)) {
                    title = title + " bcc:" + emails2ADNames(blind_carbon_copys);
                }
                String content = (String) email.get("content");
                StringBuilder toAddress = new StringBuilder();
                toAddress.append("xxx");
                mailInfo.setToAddress(toAddress.toString());
                mailInfo.setCcAddress("");
                mailInfo.setBccAddress("");
                mailInfo.setSubject(title);
                mailInfo.setContent(content);
                this.sendMail(mailInfo);
                jdbcTemplate.update(updateStr, email_id);
            }
        }
    }

    @SuppressWarnings("static-access")
    private void sendMail(MailSenderInfo mailInfo) {
        mailInfo.setMailServerHost("xxx");
        // mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("xxxx");
        mailInfo.setPassword("xxx");
        mailInfo.setFromAddress("xxx");
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        // sms.sendTextMail(mailInfo);// 发送文体格式
        sms.sendHtmlMail(mailInfo);// 发送html格式
    }

    private String emails2ADNames(String emailStr) {
        String[] strArr = emailStr.split(";");
        String adString = "";
        for (String str : strArr) {
            adString += ADUtils.queryDispalyNameByEmail(str);
        }
        return adString;
    }
}
posted @ 2014-06-28 22:27  humeng126  阅读(295)  评论(0编辑  收藏  举报