首页 > 代码库 > java mail发送邮件

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;    }}