Java发送邮件

来源:互联网 发布:金方 绿方 知乎 编辑:程序博客网 时间:2024/06/05 21:09

Java发送邮件

由于项目需要,在网上找了一些Java发送邮件的帖子进行参考和整合,现将该功能实现的源代码贴出来,Mark!

邮件发送接口

主要有 发送模板邮件(简单)、发送模板邮件(带附件)、群发模板邮件(简单)、群发模板邮件(带附件)、发送简单邮件、群发简单邮件、发送附件邮件、群发附件邮件 的功能,根据需求调用即可;

package com.XXX.service.common;import java.io.File;import java.util.List;import java.util.Map;/** * 邮件发送接口 *  * @author gewurong * @date 2016年9月28日 */public interface MailSenderService {    /**     * 发送模板邮件(简单)     *      * @param to     *            收件人     * @param subject     *            邮件主题     * @param templateLocation     *            模板路径     * @param model     *            数据源     */    void sendMailWithTemplate(String to, String subject,            String templateLocation, Map<String, Object> model);    /**     * 发送模板邮件(带附件)     *      * @param to     *            收件人     * @param subject     *            邮件主题     * @param templateLocation     *            模板路径     * @param model     *            数据源     * @param attachments     *            附件集合     */    void sendAttachMailWithTemplate(String to, String subject,            String templateLocation, Map<String, Object> model,            List<File> attachments);    /**     * 群发模板邮件(简单)     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param templateLocation     *            模板路径     * @param model     *            数据源     */    void sendMailsWithTemplate(List<String> recipients, String subject,            String templateLocation, Map<String, Object> model);    /**     * 群发模板邮件(带附件)     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param templateLocation     *            模板路径     * @param model     *            数据源     * @param attachments     *            附件集合     */    void sendAttachMailsWithTemplate(List<String> recipients, String subject,            String templateLocation, Map<String, Object> model,            List<File> attachments);    /**     * 发送简单邮件     *      * @param to     *            收件人     * @param subject     *            邮件主题     * @param content     *            邮件内容     */    void sendSimpleMail(String to, String subject, String content);    /**     * 群发简单邮件     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param content     *            邮件内容     */    void sendSimpleMails(List<String> recipients, String subject, String content);    /**     * 发送附件邮件     *      * @param to     *            收件人     * @param subject     *            邮件主题     * @param content     *            邮件内容     * @param attachments     *            附件集合     */    void sendAttachMail(String to, String subject, String content,            List<File> attachments);    /**     * 群发附件邮件     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param content     *            邮件内容     * @param attachments     *            附件集合     */    void sendAttachMails(List<String> recipients, String subject,            String content, List<File> attachments);}

邮件发送接口具体实现

package com.XXX.service.common.impl;import java.io.File;import java.util.List;import java.util.Map;import javax.annotation.Resource;import org.apache.velocity.app.VelocityEngine;import org.springframework.stereotype.Service;import org.springframework.ui.velocity.VelocityEngineUtils;import com.divingtime.service.common.MailSenderService;import com.divingtime.utilities.EmailUtils;@Servicepublic class MailSenderServiceImpl implements MailSenderService {    @Resource    private VelocityEngine velocityEngine;    @Override    public void sendMailWithTemplate(String to, String subject,            String templateLocation, Map<String, Object> model) {        EmailUtils emailUtils = new EmailUtils();        String mailContent = VelocityEngineUtils.mergeTemplateIntoString(                velocityEngine, templateLocation, "utf-8", model);        emailUtils.sendEmail(to, subject, mailContent);    }    @Override    public void sendAttachMailWithTemplate(String to, String subject,            String templateLocation, Map<String, Object> model,            List<File> attachments) {        EmailUtils emailUtils = new EmailUtils();        String mailContent = VelocityEngineUtils.mergeTemplateIntoString(                velocityEngine, templateLocation, "utf-8", model);        emailUtils.sendEmail(to, subject, mailContent, attachments);    }    @Override    public void sendMailsWithTemplate(List<String> recipients, String subject,            String templateLocation, Map<String, Object> model) {        EmailUtils emailUtils = new EmailUtils();        String mailContent = VelocityEngineUtils.mergeTemplateIntoString(                velocityEngine, templateLocation, "utf-8", model);        emailUtils.sendEmail(recipients, subject, mailContent);    }    @Override    public void sendAttachMailsWithTemplate(List<String> recipients,            String subject, String templateLocation, Map<String, Object> model,            List<File> attachments) {        EmailUtils emailUtils = new EmailUtils();        String mailContent = VelocityEngineUtils.mergeTemplateIntoString(                velocityEngine, templateLocation, "utf-8", model);        emailUtils.sendEmail(recipients, subject, mailContent, attachments);    }    @Override    public void sendSimpleMail(String to, String subject, String content) {        EmailUtils emailUtils = new EmailUtils();        emailUtils.sendEmail(to, subject, content);    }    @Override    public void sendSimpleMails(List<String> recipients, String subject,            String content) {        EmailUtils emailUtils = new EmailUtils();        emailUtils.sendEmail(recipients, subject, content);    }    @Override    public void sendAttachMail(String to, String subject, String content,            List<File> attachments) {        EmailUtils emailUtils = new EmailUtils();        emailUtils.sendEmail(to, subject, content, attachments);    }    @Override    public void sendAttachMails(List<String> recipients, String subject,            String content, List<File> attachments) {        EmailUtils emailUtils = new EmailUtils();        emailUtils.sendEmail(recipients, subject, content, attachments);    }}

发送模板邮件用的是Velocity模板引擎,在Maven的pom.xml引入

<!-- 模板引擎 velocity related dependencies -->        <dependency>            <groupId>org.apache.velocity</groupId>            <artifactId>velocity</artifactId>            <version>1.7</version>        </dependency>

具体的模板文件放在resources下的templates目录中

这里写图片描述

需要了解velocity模板引擎的可百度稍微了解下就行了,.vm后缀文件,让前端写好邮件模板的html文件(尽量使用内联样式),修改后缀为vm,然后嵌套数据即可,如$nickname

这里写图片描述

邮件发送工具类

package com.XXX.utilities;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.GeneralSecurityException;import java.util.Date;import java.util.List;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax.mail.Authenticator;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility;import org.slf4j.LoggerFactory;import ch.qos.logback.classic.Logger;import com.sun.mail.util.MailSSLSocketFactory;/** * 邮箱工具类 *  * @author gewurong * @date 2016年9月20日 *  */public class EmailUtils {    private static String nickname;// 默认帐号昵称    private static String account;// 登录用户帐号    private static String passwd;// 登录帐号密码    private static String from;// 发件地址    private static String protocol;// 协议    private static String host;// 服务器地址    private static String port; // 端口    private static final String KEY_PROTOCOL = "mail.transport.protocol";    private static final String KEY_HOST = "mail.smtp.host";    private static final String KEY_PORT = "mail.smtp.port";    private static final String KEY_AUTH = "mail.smtp.auth";    private static final String KEY_SSL_ENABLE = "mail.smtp.ssl.enable";    private static final String KEY_SSL_SOCKETFACTORY = "mail.smtp.ssl.socketFactory";    // 会话    private Session session;    private MimeMessage message;    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());    // 初始化邮件属性    static {        // 加载属性文件        Properties props = null;        try {            props = AppPropertiesUtil.getAppProps(EmailUtils.class,                    "conf/email.properties");        } catch (IOException e1) {            e1.printStackTrace();            System.out.println("Failed:加载邮件属性文件失败!");        }        nickname = props.getProperty("email.nickname");        account = props.getProperty("email.account");        passwd = props.getProperty("email.passwd");        from = props.getProperty("email.from");        protocol = props.getProperty("email.protocol");        host = props.getProperty("email.host");        port = props.getProperty("email.port");    }    public EmailUtils() {        Properties props = new Properties();        // 协议        props.setProperty(EmailUtils.KEY_PROTOCOL, protocol);        // 服务器        props.setProperty(EmailUtils.KEY_HOST, host);        // 端口        props.setProperty(EmailUtils.KEY_PORT, port);        // 使用smtp身份验证        props.setProperty(EmailUtils.KEY_AUTH, "true");        // 使用腾讯企业邮箱,基于SSL        // 开启安全协议        MailSSLSocketFactory sf = null;        try {            sf = new MailSSLSocketFactory();            sf.setTrustAllHosts(true);        } catch (GeneralSecurityException e) {            e.printStackTrace();        }        props.put(EmailUtils.KEY_SSL_ENABLE, "true");        props.put(EmailUtils.KEY_SSL_SOCKETFACTORY, sf);        session = Session.getDefaultInstance(props, new MyAuthericator(account,                passwd));        session.setDebug(true);// 启动打印调试信息        message = new MimeMessage(session);    }    /**     * 用户名密码验证, 实现抽象类Authenticator的抽象方法PasswordAuthentication     */    static class MyAuthericator extends Authenticator {        String user = null;        String password = null;        public MyAuthericator(String user, String password) {            this.user = user;            this.password = password;        }        @Override        protected PasswordAuthentication getPasswordAuthentication() {            return new PasswordAuthentication(user, password);        }    }    /**     * 发送简单邮件     *      * @param to     *            收件人邮箱     * @param subject     *            邮件主题     * @param content     *            邮件内容     */    public void sendEmail(String to, String subject, String content) {        try {            // 发件人            message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称            // 收件人            message.addRecipient(Message.RecipientType.TO, new InternetAddress(                    to));            // 邮件标题            message.setSubject(subject);            // 邮件日期            message.setSentDate(new Date());            // 邮件内容            message.setContent(content, "text/html;charset=UTF-8");            message.saveChanges();            Transport.send(message);            logger.info("发送成功:  发件人:{}|收件人:{}", from, to);        } catch (UnsupportedEncodingException | MessagingException e) {            e.printStackTrace();            logger.error("发送失败:{},错误信息:{}", from, e.getMessage());        }    }    /**     * 简单邮件群发     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param content     *            邮件内容     */    public void sendEmail(List<String> recipients, String subject,            String content) {        try {            // 发件人            message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称            // 收件人            InternetAddress[] addresses = new InternetAddress[recipients.size()];            for (int i = 0; i < addresses.length; i++) {                addresses[i] = new InternetAddress(recipients.get(i));            }            message.addRecipients(Message.RecipientType.TO, addresses);            // 邮件标题            message.setSubject(subject);            // 邮件日期            message.setSentDate(new Date());            // 邮件内容            message.setContent(content, "text/html;charset=UTF-8");            message.saveChanges();            Transport.send(message);            logger.info("发送成功:  发件人:{}|收件人:{}", from, addresses);        } catch (UnsupportedEncodingException | MessagingException e) {            e.printStackTrace();            logger.error("发送失败:{},错误信息:{}", from, e.getMessage());        }    }    /**     * 发送带附件邮件     *      * @param to     *            收件人邮箱     * @param subject     *            邮件主题     * @param content     *            邮件内容     * @param attachments     *            附件集合     */    public void sendEmail(String to, String subject, String content,            List<File> attachments) {        try {            // 发件人            message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称            // 收件人            message.addRecipient(Message.RecipientType.TO, new InternetAddress(                    to));            // 邮件标题            message.setSubject(subject);            // 邮件日期            message.setSentDate(new Date());            // 邮件内容            Multipart multipart = new MimeMultipart();            // --邮件正文            BodyPart contentPart = new MimeBodyPart();            contentPart.setContent(content, "text/html;charset=UTF-8");            multipart.addBodyPart(contentPart);            // --邮件附件            if (attachments != null) {                for (File attachment : attachments) {                    BodyPart attachmentPart = new MimeBodyPart();                    DataSource source = new FileDataSource(attachment);                    attachmentPart.setDataHandler(new DataHandler(source));                    // 避免中文乱码                    attachmentPart.setFileName(MimeUtility                            .encodeWord(attachment.getName()));                    multipart.addBodyPart(attachmentPart);                }            }            message.setContent(multipart);            message.saveChanges();            Transport.send(message);            logger.info("发送成功:  发件人:{}|收件人:{}", from, to);        } catch (UnsupportedEncodingException | MessagingException e) {            e.printStackTrace();            logger.error("发送失败:{},错误信息:{}", from, e.getMessage());        }    }    /**     * 群发带附件邮件     *      * @param recipients     *            收件人集合     * @param subject     *            邮件主题     * @param content     *            邮件内容     * @param attachments     *            附件集合     */    public void sendEmail(List<String> recipients, String subject,            String content, List<File> attachments) {        try {            // 发件人            message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称            // 收件人            InternetAddress[] addresses = new InternetAddress[recipients.size()];            for (int i = 0; i < addresses.length; i++) {                addresses[i] = new InternetAddress(recipients.get(i));            }            message.addRecipients(Message.RecipientType.TO, addresses);            // 邮件标题            message.setSubject(subject);            // 邮件日期            message.setSentDate(new Date());            // 邮件内容            Multipart multipart = new MimeMultipart();            // --邮件正文            BodyPart contentPart = new MimeBodyPart();            contentPart.setContent(content, "text/html;charset=UTF-8");            multipart.addBodyPart(contentPart);            // --邮件附件            if (attachments != null) {                for (File attachment : attachments) {                    BodyPart attachmentPart = new MimeBodyPart();                    DataSource source = new FileDataSource(attachment);                    attachmentPart.setDataHandler(new DataHandler(source));                    // 避免中文乱码                    attachmentPart.setFileName(MimeUtility                            .encodeWord(attachment.getName()));                    multipart.addBodyPart(attachmentPart);                }            }            message.setContent(multipart);            message.saveChanges();            Transport.send(message);            logger.info("发送成功:  发件人:{}|收件人:{}", from, addresses);        } catch (UnsupportedEncodingException | MessagingException e) {            e.printStackTrace();            logger.error("发送失败:{},错误信息:{}", from, e.getMessage());        }    }}

邮件属性文件email.properties

将对应属性更换为自己的就行了,本人用的是腾讯企业邮箱,另外记得开启对应邮箱的SMTP服务

email.nickname=公司名称/发送人名称、昵称等email.account=发送邮件的邮箱账号email.passwd=邮箱密码email.from=发送邮件的邮箱账号email.host=smtp.exmail.qq.comemail.port=465email.protocol=smtp

使用案例

该例子为发送模板邮件,其他功能以此类推

//嵌套数据Map<String, Object> model = new HashMap<>();model.put("mobile", admin.getMobile());model.put("nickName", admin.getNickname());//附件List<File> attachments = new ArrayList<>();file = new File("文件");attachments.add(file);//发送模板邮件mailSenderService.sendAttachMailWithTemplate("接收邮箱123456@qq.com","邮件标题", "模板路径", model,attachments);

END —我—————是—————有—————底—————线—————的

原创粉丝点击