基于spring的邮件发送

今天抽空分享一下基于spring发送邮件的方法,欢迎转载(请注明出处)
http://blog.csdn.net/cage_hunt/article/details/79272298。要想使用java发送邮件,首先就需要设置你的邮箱允许你这样做,也就是需要开启SMTP服务。比如我的是新浪邮箱:
这里写图片描述
上面只是示例,不管什么邮箱,只要设置开启SMTP服务就行。下面先来几个你可能会参考的API地址:1、spring文档email部分,有官方例子2、springAPIjavaEE7API

好不废话了,首先需要引入jar包

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.16</version>
    </dependency>

spring关于email的模块都在spring-context-support里

spring提供了两种邮件内容,直接写text或者用html模板包含内容,在这里有各种方法的最简单使用示例,但是基于Velocity设置模板的方法好像已经被废弃了,spring更支持基于freemarker设置模板的方法。以下是代码

MailModel(email模型)

package com.hanjc.test.mail;

import java.io.Serializable;
import java.util.Map;

public class MailModel implements Serializable {
    private static final long serialVersionUID = 1L;
    private String host;                        //发件人邮箱服务器
    private String from;                        //发件人邮箱
    private String emailUserName;                    //发件人用户名
    private String emailPassword;                    //发件人密码
    private String to;                          //收件人邮箱,多个邮箱以“;”分隔
    private String subject;                          //邮件主题
    private String content;                          //邮件内容
    private Map<String, String> attachments;         //附件

    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getFrom() {
        return from;
    }
    public void setFrom(String from) {
        this.from = from;
    }
    public String getEmailUserName() {
        return emailUserName;
    }
    public void setEmailUserName(String emailUserName) {
        this.emailUserName = emailUserName;
    }
    public String getEmailPassword() {
        return emailPassword;
    }
    public void setEmailPassword(String emailPassword) {
        this.emailPassword = emailPassword;
    }
    public String getTo() {
        return to;
    }
    public void setTo(String to) {
        this.to = to;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Map<String, String> getAttachments() {
        return attachments;
    }
    public void setAttachments(Map<String, String> attachments) {
        this.attachments = attachments;
    }
}

发送email的类LogMail,我这个例子是测试向邮箱发送日志的,所以叫LogMail

package com.hexinyy.jzkfgl.common.mail_and_sms;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.mail.internet.MimeMessage;

import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class LogMail {

    private static final String TEMPLATE_NAME = "log_mail";
    private static final String TEMPLATE_PATH = "D:/java/apache-tomcat-8.5.11/webapps/test/template/mail/logmail.html";
    /*
     * 设置email
     */
    public void init(MailModel mailModel,Object body) throws FileNotFoundException,IOException{

        //加载模板,可能抛出FileNotFoundException,IOException
        Template template = new Template(TEMPLATE_NAME,new FileReader(TEMPLATE_PATH),new Configuration());
        //使用MimeMessagePreparator预先设置email
        MimeMessagePreparator preparator = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws Exception {
                //若添加附件必须设置加true
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
                //邮件主题
                helper.setSubject(mailModel.getSubject());
                //收件人邮箱
                helper.setTo(mailModel.getTo());
                //发件人邮箱
                helper.setFrom(mailModel.getFrom());
                //数据模型,从模型里面获取邮件内容
                Map<String, Object> model = new HashMap<String, Object>();
                model.put("mailModel", body);
                /*
                 * 用模板发邮件需要用到FreeMarkerTemplateUtils类,
                 * 基于Velocity设置模板的方式已经被废弃了
                 */
                String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
                helper.setText(content, true);
                /*
                 * 附件,可能有多个。  body是传进来的邮件实体类,所以此处的MailModel需要注意修改
                 */
//                Map<String, String> attachments = ((SysLogDTO) body).getAttachments();
//                if (attachments != null && attachments.size() > 0) {
//                  Set<String> keySet = attachments.keySet();
//                  Iterator<String> iterator = keySet.iterator();
//                  while (iterator.hasNext()) {
//                      String key = iterator.next();
//                      String value = attachments.get(key);
//                      FileSystemResource file = new FileSystemResource(new File(value));
//                      helper.addAttachment(key, file);
//                  }
//              }
            }
        };
        //发送邮件
        sendEmail(mailModel, preparator);
    }
    /*
     * 发送邮件
     */
    private void sendEmail(MailModel mailModel, MimeMessagePreparator preparator) {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setDefaultEncoding("utf-8");//设置默认编码,否则中文可能出现乱码
        mailSender.setHost(mailModel.getHost());   
        mailSender.setUsername(mailModel.getEmailUserName());
        mailSender.setPassword(mailModel.getEmailPassword());
        mailSender.send(preparator);
    }

}

模板logmail.html

<html>
    <body>
        <h3>系统异常提醒!以下为异常日志······</h3>

        <div>
            <h4>异常发生时间:</h4>${mailModel.time }
        </div>
        <div>
            <h4>异常发生位置:</h4>${mailModel.location}
        </div>
        <div>
            <h4>实际参数:</h4>${mailModel.params}
        </div>
        <div>
            <h4>异常内容:</h4>${mailModel.exception}
        </div>
    </body>
</html>

日志信息SysLogDTO

package com.hanjc.test.mail;

import java.util.Map;

public class SysLogDTO {
    private String time;                        //发生时间
    private String location;                  //发件位置
    private String params;                    //实际参数
    private Exception exception;                    //异常内容
    private Map<String, String> attachments;         //附件
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public String getParams() {
        return params;
    }
    public void setParams(String params) {
        this.params = params;
    }
    public Exception getException() {
        return exception;
    }
    public void setException(Exception exception) {
        this.exception = exception;
    }
    public Map<String, String> getAttachments() {
        return attachments;
    }
    public void setAttachments(Map<String, String> attachments) {
        this.attachments = attachments;
    }
}

接下来就是利用AOP,在执行方法之前发送邮件ServiceAspect

package com.hanjc.test.aop;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import com.hanjc.test.exception.BusinessException;
import com.hanjc.test.mail.LogMail;
import com.hanjc.test.mail.MailModel;
import com.hanjc.test.mail.SysLogDTO;

/**
 * Aspect切面
 */
@Component
@Aspect//声明这是一个切面Bean
public class ServiceAspect {

    private static Logger logger = LogManager.getLogger(LoggerAspect.class.getName());

    private static final String TO = "接收email的邮箱";
    private static final String FROM = "发送email的邮箱";
    private static final String HOST = "发送email的邮箱的服务器地址,例如新浪smtp.sina.com.cn";
    private static final String USERNAME = "发送email的邮箱账户";
    private static final String PASSWORD = "密码";
    private static final String SUBJECT = "邮件主题";

    /*
     * 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
     */
    @Pointcut("execution(* com.hanjc.test.service.impl..*(..))")
    public void aspect(){}

    /*
     * 配置前置通知,使用在方法aspect()上注册的切入点
     * 同时接受JoinPoint切入点对象,可以没有该参数
     */
    @Before("aspect()")
    public void before(JoinPoint joinPoint) throws FileNotFoundException,IOException{

        logger.log("开始测试eamil");

        SysLogDTO sysLog = new SysLogDTO();//日志内容
        //时间,必须String类型,否则模板不能解析
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = simpleDateFormat.format(new Date());
        sysLog.setTime(time);
        //执行方法名
        sysLog.setLocation(joinPoint.toString());
        //获取方法实际参数,经过迭代组成一个字符串
        Object[] params = joinPoint.getArgs();
        StringBuilder sb = new StringBuilder();
        if (params != null && params.length > 0) {
            for (Object param : params) {
                sb.append(param+" , ");
            }
            sysLog.setParams(sb.toString());
        }
        //异常,这里设置自定义异常只是为了有异常数据,无实际意义
        BusinessException e = new BusinessException("此处是异常内容");
        sysLog.setException(e);

        logger.error("抛出异常{[方法:"+method+"],[参数:"+sb.toString()+"]}");

        MailModel mailModel = new MailModel();
        mailModel.setTo(TO);
        mailModel.setFrom(FROM);
        mailModel.setHost(HOST);
        mailModel.setSubject(SUBJECT);
        mailModel.setEmailUserName(USERNAME);
        mailModel.setEmailPassword(PASSWORD);

        LogMail logMail = new LogMail();
        logMail.init(mailModel, sysLog);
    }
}

其他的代码,比如service之类的就不贴了,没什么用。这个例子可以完成发邮件的功能,但是结构上仍需要进行很多的改进,比如将email的subject,host等属性提取到properties文件里面等等,这里就不多说了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架。它提供了许多开箱即用的功能,包括邮件发送。下面是使用Spring Boot实现邮件发送的步骤: 1. 添加依赖:在项目的pom.xml文件中添加Spring Boot的邮件依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 2. 配置邮件信息:在application.properties或application.yml文件中配置邮件服务器的相关信息,例如: ```properties spring.mail.host=smtp.example.com spring.mail.port=587 spring.mail.username=your-email@example.com spring.mail.password=your-email-password spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true ``` 3. 创建邮件服务类:创建一个邮件服务类,用于发送邮件。可以使用JavaMailSender来发送邮件,例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; @Service public class EmailService { @Autowired private JavaMailSender mailSender; public void sendEmail(String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(text); mailSender.send(message); } } ``` 4. 调用邮件服务类:在需要发送邮件的地方调用邮件服务类的sendEmail方法,例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class EmailController { @Autowired private EmailService emailService; @GetMapping("/sendEmail") public String sendEmail() { emailService.sendEmail("[email protected]", "Test Email", "This is a test email."); return "Email sent successfully."; } } ``` 以上就是使用Spring Boot实现邮件发送的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值