Spring 实现发送普通邮件

Spring 邮件抽象层

下面所列出的jar文件必须加到你应用程序的classpath中,因为这些都是Spring Framework邮件抽象层所依赖的库文件。

JavaMail mail.jar库

JAF activation.jar库

所有这些依赖的库都可以在 Spring Framework 的 Spring-with-dependencies 的 release 包中获得 (同时也可以在网上免费获得)。

Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理。

Spring邮件抽象层的主要包为 org.springframework.mail。它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性如from, to,cc, subject,text。 包里还包含一棵以MailException为根的checked Exception继承树,它们提供了对底层邮件系统异常的高级别抽象。 要获得关于邮件异常层次的更丰富的信息,请参考Javadocs。

为了使用JavaMail中的一些特色, 比如MIME类型的信件, Spring提供了MailSender的一个子接口, 即org.springframework.mail.javamail.JavaMailSender。 Spring还提供了一个回调接口org.springframework.mail.javamail.MimeMessagePreparator, 用于准备JavaMail的MIME信件。

使用Spring 邮件抽象

假设某个业务接口名为OrderManager:

public interface OrderManager {
    void placeOrder(Order order);
}

我们同时假设有一个用例:需要生成带有订单号的email信件, 并向客户发送该订单。

1. MailSender 和 SimpleMailMessage 的基本用法

import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;

public class SimpleOrderManager implements OrderManager {

    private MailSender mailSender;
    private SimpleMailMessage templateMessage;

    public void setMailSender(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void setTemplateMessage(SimpleMailMessage templateMessage) {
        this.templateMessage = templateMessage;
    }

    public void placeOrder(Order order) {

        // Do the business calculations...

        // Call the collaborators to persist the order...

        // Create a thread safe "copy" of the template message and customize it
        SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
        msg.setTo(order.getCustomer().getEmailAddress());
        msg.setText(
            "Dear " + order.getCustomer().getFirstName()
                + order.getCustomer().getLastName()
                + ", thank you for placing order. Your order number is "
                + order.getOrderNumber());
        try{
            this.mailSender.send(msg);
        }
        catch(MailException ex) {
            // simply log it and go on...
            System.err.println(ex.getMessage());            
        }
    }
}

上面代码中的 bean 应该是这样定义的

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  <property name="host" value="mail.mycompany.com"/>
</bean>

<!-- this is a template message that we can pre-load with default state -->
<bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
  <property name="from" value="customerservice@mycompany.com"/>
  <property name="subject" value="Your order"/>
</bean>

<bean id="orderManager" class="com.mycompany.businessapp.support.SimpleOrderManager">
  <property name="mailSender" ref="mailSender"/>
  <property name="templateMessage" ref="templateMessage"/>
</bean>

2. 使用 JavaMailSender 和 MimeMessagePreparator

下面是OrderManager的另一种实现, 使用了MimeMessagePreparator回调接口。
请注意在这个用例中,mailSender属性是JavaMailSender类型,
所以我们可以使用JavaMail的MimeMessage类:

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMessage;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;

public class SimpleOrderManager implements OrderManager {

    private JavaMailSender mailSender;
    
    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void placeOrder(final Order order) {

        // Do the business calculations...

        // Call the collaborators to persist the order...
        
        MimeMessagePreparator preparator = new MimeMessagePreparator() {
        
            public void prepare(MimeMessage mimeMessage) throws Exception {
        
                mimeMessage.setRecipient(Message.RecipientType.TO, 
                        new InternetAddress(order.getCustomer().getEmailAddress()));
                mimeMessage.setFrom(new InternetAddress("mail@mycompany.com"));
                mimeMessage.setText(
                    "Dear " + order.getCustomer().getFirstName() + " "
                        + order.getCustomer().getLastName()
                        + ", thank you for placing order. Your order number is "
                        + order.getOrderNumber());
            }
        };
        try {
            this.mailSender.send(preparator);
        }
        catch (MailException ex) {
            // simply log it and go on...
            System.err.println(ex.getMessage());            
        }
    }
}

注意
以上的邮件代码是一个横切关注点,能被完美地重构为自定义Spring AOP切面的候选者,这样它就可以在目标对象OrderManager的一些合适的连接点(joinpoint)中被执行了。

Spring Framework的邮件支持直接提供两种MailSender的实现。标准的JavaMail实现和基于Jason Hunter编写的MailMessage类之上的实现,后者位于 com.oreilly.servlet包中。请查阅相关Javadocs以获得进一步的资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用Spring Boot发送邮件的示例代码: 首先需要在pom.xml文件中添加Spring Boot Mail依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 然后在application.properties文件中配置邮件服务器相关信息: ```properties # 邮件服务器地址 spring.mail.host=smtp.example.com # 邮件服务器端口号 spring.mail.port=587 # 邮件发送者账号 spring.mail.username=sender@example.com # 邮件发送者密码 spring.mail.password=**************** # 是否开启SSL spring.mail.properties.mail.smtp.ssl.enable=true # 是否开启TLS spring.mail.properties.mail.smtp.starttls.enable=true ``` 接下来创建一个EmailService类: ```java @Service public class EmailService { @Autowired private JavaMailSender mailSender; public void sendSimpleMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(content); mailSender.send(message); } public void sendHtmlMail(String to, String subject, String content) throws MessagingException { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); mailSender.send(message); } } ``` 其中,sendSimpleMail方法用于发送普通文本邮件,sendHtmlMail方法用于发送HTML格式邮件。 最后,可以在Controller中调用EmailService进行邮件发送: ```java @RestController public class EmailController { @Autowired private EmailService emailService; @GetMapping("/sendSimpleMail") public String sendSimpleMail() { String to = "recipient@example.com"; String subject = "测试邮件"; String content = "这是一封测试邮件"; emailService.sendSimpleMail(to, subject, content); return "发送成功"; } @GetMapping("/sendHtmlMail") public String sendHtmlMail() throws MessagingException { String to = "recipient@example.com"; String subject = "测试邮件"; String content = "<html><body><h1>这是一封测试邮件</h1></body></html>"; emailService.sendHtmlMail(to, subject, content); return "发送成功"; } } ``` 以上就是一个简单的使用Spring Boot发送邮件的示例代码,你可以根据自己的需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值