`
weknow619
  • 浏览: 62184 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【Spring】使用Spring发送邮件

阅读更多
Spring Email抽象的核心是MailSender接口,MailSender的实现能够通过连接Email服务器实现邮件发送的功能,如下图:

Spring自带一个MailSender的实现就是JavaMailSenderImpl,它也是使用JavaMail API来发送Email,在使用之前,必须先将JavaMailSenderImpl装配为Spring应用上下文中的一个bean,如下所示:
@Bean
public MailSender mailSender (Environment env) {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost(env.getProperty("mailserver.host"));    
    return mailSender;
}

默认情况下,JavaMailSenderImpl假设邮件服务器监听25端口,如果邮件服务器监听不同的端口,可以使用port属性指定其端口号,在上面的mailSender()方法中添加:
mailSender.setPort(env.getProperty("mailserver.port"));

如果邮件服务器需要认证的话,还需要设置username和password:
mailSender.setUsername(env.getProperty("mailserver.username"));
mailSender.setPassword(env.getProperty("mailserver.password"));

这样JavaMailSenderImpl已经配置完成,到此可以创建自己的邮件会话,如果已经在JNDI中配置了javax.mail.MailSession的话就没有必要为JavaMailSenderImpl配置详细的服务器细节了,可以配置它使用JNDI中已就绪的MailSession。

使用JndiObjectFactoryBean,可以在如下的@Bean方法中配置一个bean,它会从JNDI中查找MailSession:

@Bean
public JndiObjectFactoryBean mailSession ( ) {
    JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
    jndi.setJndiName("mail/Session");
    jndi.setProxyInterface(MailSession.class);
    jndi.setResourceRef(true);    
    return jndi;
}

接着可以使用Spring的<jee:jndi-lookup>元素从JNDI中获取对象,这里可以使用<jee:jndi-lookup>来创建一个bean,它引用了JNDI中的邮件会话:
<jee:jndi-lookup id="mailSession" jndi-name="mail/Session" resource-ref="true">

邮件会话准备好后,就可以将其装配到mailSender bean中了:
@Bean
public MailSender mailSender (MailSession mailSession) {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setSession(mailSession);    
    return mailSender;
}

通过将邮件会话装配到JavaMailSenderImpl的session属性中,就完全替换了原来的服务器配置,现在邮件会话完全通过JNDI进行配置和管理,JavaMailSenderImpl就可以专注于发送邮件而不必自己处理邮件服务器了。

接着需要将mailSender装配到我们的业务层实现类中(假设为SpitterEmailServiceImpl类),如下:

@Autowired
JavaMailSender mailSender;

接着想要给Spitter用户发送Email提示他的朋友写了新的Spittle,这时需要一个方法来发送Email,这个方法要接受Email地址和Spittle对象信息,如下方法就是使用邮件发送器完成该功能:
public void sendSimpleSpittleEmail (Stirng to, Spittle spittle) {
    SimpleMailMessage message = new SimpleMailMessage();
    String spitterName = spittle.getSpitter().getFullName();
    message.setFrom("...@spitter.com");  // email地址
    message.setTo(to);
    message.setSubject("New spittle from " + spitterName);
    message.setText(spitterName + "says: " + spittle.getText());
    mailSender.send(message);
}

上面代码中最后一步将消息传递给邮件发送器的send()方法,这样邮件就发送出去了。

发送带附件的Email
消息发送成功了,现在尝试发送带有附件的Email,要发送附件先要创建multipart类型的消息,Email由多个部分组成,其中一部分是Email体,其他部分就是附件。要发送multipart类型的Email,需要创建一个MIME的消息,可以从邮件发送器的createMimeMessage( )方法开始:
MimeMessage message = mailSender.createMimeMessage();

不过这里使用javax.mail.internet.MimeMessage的API相对有点繁琐,可以使用Spring提供的MimeMessageHelper简便操作,实例化它时将MimeMessage传给它。
MimeMessageHelper helper = new MimeMessageHelper(message, true);  // true表示是multipart类型

得到MimeMessageHelper实例后,就可以开始组装Email消息了:
String spitterName = spittle.getSpitter().getFullName();
helper.setForm("...@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " +spittle.getText());

下面添加附件,以图片为例,只要将这个资源传递给helper的addAttachment方法即可:
FileSystemResource image = new FileSystemResource("/file/test.png"); 
helper.addAttachment("test.png", image);

这里使用Spring的FileSystemResource来加载位于类路径下的test.png,再调用addAttachment(),第一个参数是要添加到Email中附件的名称,第二个参数是资源文件。

到这里multipart类型的Email已经构建完成,现在就要使用MimeMessageHelper发送带有附件的Email,完整代码如下:

public void sendSpittleEmailWithAttachment (Stirng to, Spittle spittle) throws MessagingException {
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    String spitterName = spittle.getSpitter().getFullName();
    helper.setForm("...@spitter.com");
    helper.setTo(to);
    helper.setSubject("New spittle from " + spitterName);
    helper.setText(spitterName + " says: " +spittle.getText());
    FileSystemResource image = new FileSystemResource("/file/test.png"); 
    helper.addAttachment("test.png", image);
    mailSender.send(message);
}

到此就成功发送一个带有附件的Email了。



注:更多文章欢迎公众号中查看,公号Id:weknow619。


分享到:
评论

相关推荐

    Spring Boot整合邮件发送并保存历史发送邮箱

    和上面对比,这次发送邮件使用 MimeMessageHelper 类。MimeMessageHelper 支持发送复杂邮件模板,支持文本、附件、HTML、图片等,接下来我们会继续使用。 (3)发送带附件的邮件 在 MailService 添加 ...

    spring各种邮件发送

    首先,Spring框架提供了`JavaMailSender`接口,它是发送邮件的核心接口。通过实现这个接口,我们可以配置SMTP服务器的相关参数,如主机地址、端口、用户名、密码等,来设置邮件发送的环境。`JavaMailSender`提供了...

    java发送邮件 spring发送邮件

    通过以上步骤,你就可以在Java应用中使用Spring发送邮件了。当然,实际的邮件发送可能更复杂,涉及HTML内容、附件、多部分消息等,可以使用`MimeMessage`和`MimeMessageHelper`类来构建复杂的邮件结构。例如,添加...

    spring mail通过代理发送邮件

    在描述中提到的博客链接(由于实际链接无法访问,这里不进行详细分析),可能会详细解释如何配置和使用Spring Mail通过代理发送邮件的过程,包括代码示例和可能遇到的问题。通常,博客会涵盖异常处理、身份验证机制...

    java 发送邮件 spring发送邮件Mail

    Spring框架提供了一种优雅的方式来处理这个任务,它整合了JavaMailSender接口和JavaMail API,使得在Java应用程序中发送邮件变得更加简单。让我们深入探讨这个主题。 首先,JavaMail API是Java用来处理邮件收发的...

    Spring 高效批量邮件发送

    在本话题中,我们将探讨“Spring高效批量邮件发送”这一技术点,这通常涉及到Spring框架中的邮件服务模块以及如何优化邮件发送的效率。 首先,Spring框架的MailSender接口是处理邮件发送的核心组件。它提供了send()...

    spring发送邮件demo

    下面将详细介绍如何使用Spring发送邮件。 首先,我们需要在项目中引入Spring的邮件支持。这通常通过添加`spring-context-support`依赖来完成,该依赖包含了处理邮件发送所需的类。在Maven项目中,可以在pom.xml文件...

    struts spring 实现简单的邮件发送

    Struts和Spring是两个在Java Web开发中广泛使用的框架,它们分别是MVC(Model-View-Controller)架构的实现和依赖注入(DI)/面向切面编程(AOP)的工具。邮件发送功能在Web应用中很常见,比如用于验证码验证、通知...

    Spring邮件发送

    `sendSimpleEmail`方法接收收件人邮箱、主题和正文作为参数,创建一个`SimpleMailMessage`对象并设置相关属性,最后通过`emailSender.send()`发送邮件。 为了发送更复杂的邮件,如HTML格式或包含附件的邮件,我们...

    spring框架使用以及邮件发送

    8. **邮件发送**:Spring框架提供了`JavaMailSender`接口和相关的实现类,可以方便地发送邮件,支持HTML格式、附件等,这对于发送通知或报告非常有用。 在实际开发中,Spring框架的强大功能可以极大地提高开发效率...

    spring定时发送邮件

    首先,定义一个`Runnable`实现类,这个类中包含发送邮件的逻辑,使用Spring Mail的API。然后,将这个任务实例化,并在Spring配置中设置定时任务,通过cron表达式定义执行时间。例如,如果你想让任务在每天的6点30分...

    使用Spring Boot 开发支持多附件邮件发送微服务平台代码

    在Spring Boot应用中,你可以创建一个`MailService`接口和其实现类,使用`JavaMailSender`接口来发送邮件。以下是一个简单的示例: ```java @Service public class MailServiceImpl implements MailService { @...

    Spring邮件发送源码

    接下来,我们将介绍如何使用Spring发送不同类型的邮件: 1. **发送纯文本邮件**: 要发送纯文本邮件,你可以创建一个`SimpleMailMessage`对象,设置发件人、收件人、主题和正文,然后调用`JavaMailSender`的`send...

    Spring邮件发送服务(java邮件发送)

    开发者可以通过配置SMTP服务器信息,并使用`JavaMailSender`接口发送邮件,同时支持添加多个附件和指定多个接收者、抄送人和密送人。结合`SpringMailUtil`这样的工具类,可以更方便地在实际项目中实现邮件功能。

    spring整合quartz定时发送邮件

    Spring 整合 Quartz 定时发送邮件是一种常见的任务调度场景,用于定期执行如发送通知、报告等操作。Quartz 是一个开源的作业调度框架,它允许开发者创建、调度和管理任务。而Spring作为一个强大的企业级应用开发框架...

    基于Spring Boot的邮件发送服务设计源码

    本资源提供了一套基于Spring ...这些文件详细展示了如何使用Spring Boot构建一个邮件发送服务,该服务支持文本、附件、模板等多种实现,并具有队列和线程定时任务功能。这些文件非常适合用于学习和参考Java项目的开发。

Global site tag (gtag.js) - Google Analytics