Simple Java Mail邮件发送实现过程解析

 更新时间:2020年11月06日 09:50:50   作者:shuzihua  
这篇文章主要介绍了Simple Java Mail邮件发送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

在我们日常工作中,邮件发送服务经常会用到,我们常用的java邮件服务实现方案有:java原生自带的javamail、apache commons mail工具包、spring mail。但是个人使用这么久而言,感觉使用起来都不太顺手,也略显复杂

在此推荐一个简单易用的类库simple-java-mail

github地址: http://www.simplejavamail.org

下面我会介绍一下这个mail工具类的基本用法,不过基本都是来自于官网,随后我会基于这个mail工具类去封装一个基本通用的邮件服务。

maven引入

<dependency>
  <groupId>org.simplejavamail</groupId>
  <artifactId>simple-java-mail</artifactId>
  <version>4.2.3-java6-release</version>
</dependency>

例子

发送一封简易邮件

写法1 Builder模式:

Email email = new EmailBuilder()
.from("Michel Baker", "m.baker@mbakery.com")
.to("mom", "jean.baker@hotmail.com")
.to("dad", "StevenOakly1963@hotmail.com")
.subject("My Bakery is finally open!")
.text("Mom, Dad. We did the opening ceremony of our bakery!!!")
.build();

new Mailer("server", 25, "username", "password").sendMail(email);

写法二 常规模式:

Email email = new Email();

email.setFromAddress("Michel Baker", "m.baker@mbakery.com");
email.addRecipient("mom", "jean.baker@hotmail.com", RecipientType.TO);
email.addRecipient("dad", "StevenOakly1963@hotmail.com", RecipientType.TO);
email.setSubject("My Bakery is finally open!");
email.setText("Mom, Dad. We did the opening ceremony of our bakery!!!");

new Mailer("server", 25, "username", "password").sendMail(email);

和spring结合使用

<bean id="inhouseMailer" class="org.simplejavamail.mailer.Mailer">
  <constructor-arg value="server" />
  <constructor-arg value="25" />
  <constructor-arg value="username" />
  <constructor-arg value="password" />
</bean>

@Autowired 
Mailer inhouseMailer; 
inhouseMailer.sendMail(email);
inhouseMailer.sendMail(anotherEmail);

添加多个接收者

//添加多个接收者
email.addRecipients(yourRecipient1, yourRecipient2...);
//也可以通过逗号“,”分割多个抄送人
String list = "twister@sweets.com,blue.tongue@sweets.com;honey@sweets.com";
emailNormal.addRecipients(list, RecipientType.BCC);

builder模式:
.to(yourRecipient1, yourRecipient2...)
.bcc("twister@sweets.com,blue.tongue@sweets.com;honey@sweets.com")
...
.build();

支持异步发送

// 第二个参数是true则是异步发送,false则是同步发送
mailer.sendMail(email, true);

配置SSL或TLS

Email email = new Email();

mailer.sendMail(email, TransportStrategy.SMTP_PLAIN); // 此为默认值,不加嵌套任何传输协议
mailer.sendMail(email, TransportStrategy.SMTP_SSL);
mailer.sendMail(email, TransportStrategy.SMTP_TLS);

我们也可以在初始化邮件服务器配置时声明传输协议

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);

发送附件

Email email = new Email();

email.addAttachment("dresscode.txt", new ByteArrayDataSource("Black Tie Optional", "text/plain"));
email.addAttachment("location.txt", "On the moon!".getBytes(Charset.defaultCharset()), "text/plain");

// 当然,你可以传输任何文件格式的附件

email.addAttachment("invitation.pdf", new FileDataSource("invitation_v8.3.pdf"));

内容嵌套图片

Email email = new Email();

email.addEmbeddedImage("smiley", new FileDataSource("smiley.jpg"));

String base64String = "iVBORw0KGgoAAAANSUhEUgAAA ...snip";
email.addEmbeddedImage("thumbsup", parseBase64Binary(base64String), "image/png");

// 图片需要在html文本中通过cid:xxxx,的方式引用
<p>Let's go!</p>![](cid:thumbsup)<br/>
<p>Smile!</p>![](cid:smiley)

自定义发送头

Email email = new Email();

email.addHeader("X-Priority", 2);
email.addHeader("X-MC-GoogleAnalyticsCampaign", "halloween_sale");
email.addHeader("X-MEETUP-RECIP-ID", "71415272");
email.addHeader("X-my-custom-header", "foo");

验证邮箱合法性

具体使用的工具类是email-rfc2822-validator

github地址:https://github.com/bbottema/email-rfc2822-validator

//经过使用发现,貌似只是用正则表达式去验证邮箱是否合法
EmailAddressValidator.isValid("your_address@domain.com",
EmailAddressCriteria.RFC_COMPLIANT);
EmailAddressValidator.isValid("your_address@domain.com",
EnumSet.of(EmailAddressCriteria.ALLOW_QUOTED_IDENTIFIERS, EmailAddressCriteria.ALLOW_PARENS_IN_LOCALPART));

使用代理发送

// anonymous proxy
new Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080));

// authenticated proxy
new Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080, "proxy username", "proxy password"));

总结

此工具类方便易用,简洁明了,而且支持Builder模式链式调用。有兴趣的同学可以尝试使用,个人感觉比原生mail,spring mail等易用,更多用法请自行查看官网例子。至于一开始说到的封装通用的邮件服务,这个由于时间关系,我放到下一次再实现。谢谢大家的支持,如果此文对你有所帮助,请点个赞,谢谢。

https://github.com/bbottema/simple-java-mail/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java字符串替换的三种方法实际应用

    Java字符串替换的三种方法实际应用

    这篇文章主要给大家介绍了关于Java字符串替换的三种方法,replace和replaceAll是JAVA中常用的替换字符的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Java ArrayList集合详解(Java动态数组)

    Java ArrayList集合详解(Java动态数组)

    这篇文章主要介绍了Java ArrayList集合详解(Java动态数组),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java多线程从入门到精通看这篇就够了

    java多线程从入门到精通看这篇就够了

    熟悉 Java 多线程编程的同学都知道,当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了,今天通过本文给大家分享java多线程从入门到精通的相关知识,一起看看吧
    2021-06-06
  • IDEA 2020 2全家桶安装激活超详细图文教程

    IDEA 2020 2全家桶安装激活超详细图文教程

    这篇文章主要介绍了IDEA-2020-2 全家桶安装激活超详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java数据结构之有向图的拓扑排序详解

    Java数据结构之有向图的拓扑排序详解

    这篇文章主要为大家详细介绍了Java数据结构中有向图的拓扑排序,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Spring中字段格式化的使用小结

    Spring中字段格式化的使用小结

    Spring提供的一个core.convert包 是一个通用类型转换系统。它提供了统一的 ConversionService  API和强类型的Converter SPI,用于实现从一种类型到另一种类型的转换逻辑,这篇文章主要介绍了Spring中字段格式化的使用详解,需要的朋友可以参考下
    2022-06-06
  • java进行远程部署与调试及原理详解

    java进行远程部署与调试及原理详解

    这篇文章主要介绍了java进行远程部署与调试及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Spring中的ContextLoaderListener详细解析

    Spring中的ContextLoaderListener详细解析

    这篇文章主要介绍了Spring中的ContextLoaderListener详细解析,在web容器即Tomact容器启动web应用即servlet应用时,会触发ServletContextEvent时间,这个事件会被ServletContextListener监听,需要的朋友可以参考下
    2023-12-12
  • Java中BigDecimal类与int、Integer使用总结

    Java中BigDecimal类与int、Integer使用总结

    这篇文章主要给大家介绍了关于Java中BigDecimal类与int、Integer使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • springboot 传参校验@Valid及对其的异常捕获方式

    springboot 传参校验@Valid及对其的异常捕获方式

    这篇文章主要介绍了springboot 传参校验@Valid及对其的异常捕获方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论