一、邮件简介


1、邮件服务器与传输协议

  • 邮件服务器:要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
  • SMTP服务器:通常把处理用户 smtp 请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
  • POP3服务器:通常把处理用户 pop3 请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

2、SMTP、POP3 和 IMAP 三大协议

1)、SMTP 协议

SMTP 的全称是 Simple Mail Transfer Protocol,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

2)、POP3 协议

POP3 是 Post Office Protocol 3 的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而 POP3 服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件的。

3)、IMAP 协议

IMAP 全称是 Internet Mail Access Protocol,即交互式邮件存取协议,它是跟 POP3 类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

4)、POP3 和 IMAP 的区别

  • POP3 协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
  • 而 IMAP 提供 webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
  • 同时,IMAP 像 POP3 那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP 提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

总之:IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。

3、开通邮箱的 SMTP 服务

想要通过代码实现 SMTP 邮件的发送,需要在开启邮箱的 SMTP 服务,我们以网易的 163 邮箱为例,介绍如何开启 SMTP 服务。

1)、引入 SMTP 设置页面

首先登录进入 163 邮箱网页,在设置下选择 POP3/SMTP/IMAP 选项,进入 SMTP 服务设置页面:

2)、选择开启相关服务

在开启服务选项中选择想要开启的服务,这里,我选择开启的是 POP3/SMTP 服务,大家可以根据上面提到的协议区别来开启对应的服务。

3)、授权码管理

成功开启服务后,可以在页面下方的授权密码管理中添加、删除和修改授权密码,这个授权密码就是我们通过代码发送邮件时的授权密码,注意保存不要泄露。

4)、邮箱服务器地址

在页面的最下面我们可以看到 163 邮箱各个协议对应的服务器地址:

5)、邮箱各协议相关端口

下面列举了 163 邮箱各个协议的端口,包括加密的 SSL 协议端口和非 SSL 协议端口:

4、Java 发送邮件原理

通过 Java 发送邮件实际就是通过代码来实现邮件的发送,通常我们发送邮件时都是通过登录邮箱平台进去进行邮件的发送,而代码发送邮箱实际上就是充当了一个客户端的作用,代理了我们的界面操作而已,换句话说,由界面操作换成了代码操作。

下面是 Java 发送邮件的过程图:

二、Java 邮件发送实战


1、使用原生的 Javax-Mail-Api

1)、引入 JavaMail 依赖

<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.6</version>
</dependency>

2)、发送普通文本邮件

下面是发送普通文本邮件的代码示例:

import org.junit.Test;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;public class JavaMailDemo {// 163邮箱的SMTP服务地址private String smtpHost = "smtp.163.com";// 邮箱用户(填写自己的邮箱)private String userName = "xxxxxxxx@163.com";// 邮箱授权码(填写自己的邮箱授权码)private String authKey = "xxxxxxxxxxxx";// 收件人private String receiver = "xxxxxxxxx@qq.com";/*** 发送普通文本消息的邮件*/@Testpublic void sendSimpleMail() throws Exception {// 创建参数配置, 用于连接邮件服务器的参数配置Properties properties = new Properties();properties.put("mail.transport.protocol", "smtp");  // 设置协议(JavaMail规范要求)properties.put("mail.smtp.host", smtpHost);         // SMTP 邮箱服务地址properties.put("mail.smtp.auth", "true");           // 需求请求认证// 根据配置创建会话对象, 用于和邮件服务器进行交互Session session = Session.getInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 使用邮箱用户和邮箱授权码进行认证return new PasswordAuthentication(userName, authKey);}});// 开启debug模式,可以查看详细的发送logsession.setDebug(true);// 根据Session获取邮件传输对象Transport transport = session.getTransport();// 连接邮件服务器,使用邮箱用户和邮箱授权码进行认证transport.connect(smtpHost, userName, authKey);// 创建邮件对象MimeMessage message = new MimeMessage(session);// 发送人message.setFrom(new InternetAddress(userName));// 收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));// 邮件主题message.setSubject("这是邮件主题");// 发送日期message.setSentDate(new Date());// 邮件正文message.setContent("这是一封邮件", "text/html; charset=utf-8");// 发送邮件,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人transport.sendMessage(message, message.getAllRecipients());// 关闭连接transport.close();}}

注意

  • 有些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性,邮箱支持 SSL 连接,也可以自己开启);
  • 如果果无法连接邮件服务器,仔细查看控制台打印的 log,如果有有类似 连接失败, 要求 SSL 安全连接 等错误信息,则需要设置开启 SSL 安全连接:
// 设置 SSL 安全连接属性
String smtpSSLPort = "465";  // 指定 SSL 端口
properties.put("mail.smtp.port", smtpSSLPort);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", smtpSSLPort);

关于 SMTP 服务的端口:

  • 对于非 SSL 连接的端口一般默认为 25,默认可以不进行设置;
  • 如果开启了 SSL 连接,需要改为对应邮箱的 SMTP 服务器的端口,,具体可查看对应邮箱服务的帮助,比如 QQ 邮箱的 SMTP(SLL) 端口为 465587,而 163 邮箱的 SMTP(SSL) 端口为 465994

SSL 端口可以不用设置,如果不指定 SSL 端口的话,此时会使用默认的 465 端口,我们可以从邮件的 DEBUG 日志打印中查看邮箱服务连接过程中的端口信息:

# 非 SSL 连接,走的是 25 端口
DEBUG: setDebug: JavaMail version 1.4.6
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
220 newxmesmtplogicsvrszc5.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.163.com", port: 25# SSL 连接,默认走的是 465 端口
DEBUG: setDebug: JavaMail version 1.4.6
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.163.com", port 465, isSSL true
220 163.com Anti-spam GT for Coremail System (163com[20141201])
DEBUG SMTP: connected to host "smtp.163.com", port: 465

在设置邮件发送人的时候,其中 InternetAddress 的三个参数分别为:

  • (1)邮箱,这个邮箱必须和用户邮箱一致,否则报错;
  • (2)显示的昵称,如果设置了,收件人看到的发送人将是这个昵称,如果不设置则使用用户邮箱显示发送人;
  • (3)昵称的字符集编码

完整的发送人设置如下(收件人设置相同):

// 发送人:用户邮箱,发送人昵称,编码
message.setFrom(new InternetAddress(userName, "王廷云", "UTF-8"));

除了可以设置接收人以外,还可以增加收件人或者设置抄送人:

// To: 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver));
// To: 增加收件人(可选)
message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver));
// Cc: 抄送(可选)
message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiver));
// Bcc: 密送(可选)
message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(receiver));

这些设置的所有收件人、抄送人、密送人,都会被 message.getAllRecipients() 获取到。

使用 邮箱账号授权码 连接邮箱服务器过程中,如果失败的话,会在控制台输出相应失败原因的 log 信息,仔细查看失败原因,有些邮箱服务器会返回错误码或查看错误类型的链接,根据给出的错误类型到对应邮件服务器的帮助网站上查看具体失败原因。

连接失败的原因通常为以下几点:

  • (1)邮箱没有开启 SMTP 服务;
  • (2)邮箱密码错误, 例如某些邮箱开启了独立密码;
  • (3)邮箱服务器要求必须要使用 SSL 安全连接;
  • (4)请求过于频繁或其他原因, 被邮件服务器拒绝服务;
  • (5)如果以上几点都确定无误, 到邮件服务器网站查找帮助。

3)、发送带图片和附件的邮件

下面是带附件的邮件发送实例代码:

/*** 发送带附件的邮件*/
public void sendAttachmentMail() throws Exception {// 创建参数配置, 用于连接邮件服务器的参数配置Properties properties = new Properties();properties.put("mail.transport.protocol", "smtp");  // 设置协议(JavaMail规范要求)properties.put("mail.smtp.host", smtpHost);         // SMTP 邮箱服务地址properties.put("mail.smtp.auth", "true");           // 需求请求认证// 设置SSLMailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable", "true");properties.put("mail.smtp.ssl.socketFactory", sf);// 根据配置创建会话对象, 用于和邮件服务器进行交互Session session = Session.getInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 使用邮箱用户和邮箱授权码进行认证return new PasswordAuthentication(userName, authKey);}});// 开启debug模式,可以查看详细的发送logsession.setDebug(true);// 根据Session获取邮件传输对象Transport transport = session.getTransport();// 连接邮件服务器,使用邮箱用户和邮箱授权码进行认证transport.connect(smtpHost, userName, authKey);// 创建带图片和附件的邮件,传入session对象MimeMessage message = createMimeMessage(session);// 发送邮件transport.sendMessage(message, message.getAllRecipients());// 关闭连接transport.close();}/*** 创建带附件的邮件消息*/
private MimeMessage createMimeMessage(Session session) throws Exception {// 创建邮件消息对象MimeMessage message = new MimeMessage(session);// 发件人message.setFrom(new InternetAddress(userName, "王廷云", "UTF-8"));// 收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(userName));// 邮件主题message.setSubject("带图片和附件的邮件");// 邮件文本内容MimeBodyPart contentPart = new MimeBodyPart();contentPart.setContent("<p>这是邮件的正文内容</p>", "text/html;charset=utf-8");// 附件资源MimeBodyPart appendix = new MimeBodyPart();FileDataSource fileSource = new FileDataSource("D:\\demo.jpg");DataHandler fileHandler = new DataHandler(fileSource);appendix.setDataHandler(fileHandler);appendix.setFileName("demo.jpg");// 封装邮件所有内容MimeMultipart allFile = new MimeMultipart();allFile.addBodyPart(contentPart);allFile.addBodyPart(appendix);allFile.setSubType("mixed");// 放到message消息中message.setContent(allFile);message.saveChanges(); // 保存修改return message;
}

设置邮件服务器属性配置时,使用了另一种设置 SSL 的方式:

// 设置SSL
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);

这种方式和第一种方式差不多,都可以使用,一般没什么问题就选第一种方式吧。

实例中的附件文件是存放在本地的文件,如果附件文件是网络文件的话,比如阿里云OSS文件存储路径,需要使用另一个文件资源加载方式:

// 附件资源:网络文件
MimeBodyPart appendix = new MimeBodyPart();
URL url = new URL("https://malltestenv.oss-cn-shenzhen.aliyuncs.com/testnormal/demo.jpeg");
URLDataSource fileSource = new URLDataSource(url);
DataHandler fileHandler = new DataHandler(fileSource);
appendix.setDataHandler(fileHandler);
appendix.setFileName("demo.jpg");

2、使用 SpringBoot 工程

JavaMail 提供了 SpringBoot 工程中对应的 starter 版本,可以方便我们快速进行邮件功能的开发,下面介绍如何在 SpringBoot 工程中进行使用。

1)、在 SpringBoot 工程中引入相关依赖

<!-- 引入 mail 模块 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.3.4.RELEASE</version>
</dependency><!-- 使用 web 请求方式发送 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.10.RELEASE</version>
</dependency>

由于我们使用的是 web 请求的方式进行邮件发送的调用,所以我们的依赖中需要添加 web 所需的相关依赖。

2)、添加 mail 相关配置

编辑 application.yml 文件,添加 mail 相关的配置信息:

spring:mail:default-encoding: utf-8         # 邮件编码host: smtp.163.com              # smtp主机地址username: xxxxxxxxxxxxx@163.com # 邮箱用户名,发送邮件的邮箱地址password: xxxxxxxxxxxxxxxx      # smtp授权密码,不是邮箱密码# 下面是一些可选的加密设置properties.mail.smtp.port: 994  # 465或者994properties.mail.smtp.starttls.enable: trueproperties.mail.smtp.starttls.required: trueproperties.mail.smtp.ssl.enable: true# 自定义配置from: xxxxxxxxxxxxx@163.com     # 设置邮箱发送人,必须和用户邮箱一致

配置信息需要注意的是:

  • SMTP 端口可以不设置,如果设置则需要注意:

    • 126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
    • 163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
    • yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
  • 如果 QQ 企业邮箱,需要开启并设置 ssl;
  • STARTTLS,是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用 SSL 或 TLS 加密),而不需要使用另一个特别的端口来进行加密通信,属于机会性加密

3)、编写邮件发送接口

为了方便邮件的发送,我们对邮件的发送功能进行接口封装:

package com.example.demo.service;/*** @author 王廷云* @Description: 封装邮件发送接口* @Date: 2020-12-10*/
public interface MailService {/*** 发送普通文本邮件* @param to 收件人* @param subject 主题* @param content 邮件内容*/void sendSimpleMail(String to, String subject, String content);/*** 发送邮件内容为HTML的邮件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容*/void sendHtmlMail(String to, String subject, String content);/*** 发送带有附件的邮件,附件为本地文件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容* @param filePath 本地文件路径*/void sendLocalAttachmentMail(String to, String subject, String content, String filePath);/*** 发送带有附件的邮件,附件为网络文件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容* @param urlPath 文件的网络URL地址*/void sendUrlAttachmentMail(String to, String subject, String content, String urlPath);}

下面是邮件发送接口的实现类:

package com.example.demo.service.impl;import com.example.demo.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.UrlResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;@Service
public class MailServiceImpl implements MailService {// 日志工具private final Logger logger = LoggerFactory.getLogger(this.getClass());// Spring Boot 提供的一个邮件发送类@Autowiredprivate JavaMailSender mailSender;// 邮件发送人@Value("${spring.mail.from}")private String from;/*** 发送普通文本邮件* @param to 收件人* @param subject 主题* @param content 邮件内容*/@Overridepublic void sendSimpleMail(String to, String subject, String content) {// 创建SimpleMailMessage对象SimpleMailMessage message = new SimpleMailMessage();// 邮件发送人message.setFrom(from);// 邮件接收人message.setTo(to);// 邮件主题message.setSubject(subject);// 邮件内容message.setText(content);// 发送邮件mailSender.send(message);}/*** 发送邮件内容为HTML的邮件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容*/@Overridepublic void sendHtmlMail(String to, String subject, String content) {try {// 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);// 邮件发送人messageHelper.setFrom(from);// 邮件接收人messageHelper.setTo(to);// 邮件主题messageHelper.setSubject(subject);// 邮件内容, html 格式messageHelper.setText(content, true);// 发送邮件mailSender.send(message);// 日志信息logger.info("邮件已发送!");} catch (MessagingException e) {// 记录错误日志logger.error("邮件发送发生异常!", e);}}/*** 发送带有附件的邮件,附件为本地文件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容* @param filePath 本地文件路径*/@Overridepublic void sendLocalAttachmentMail(String to, String subject, String content, String filePath) {try {// 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);// 邮件发送人messageHelper.setFrom(from);// 邮件接收人messageHelper.setTo(to);// 邮件主题messageHelper.setSubject(subject);// 邮件内容, 支持 html 格式messageHelper.setText(content, true);// 创建附件: 附件为本地文件FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = filePath.substring(filePath.lastIndexOf(File.separator)+1);messageHelper.addAttachment(fileName, file);// 发送邮件mailSender.send(message);// 日志信息logger.info("邮件已发送!");} catch (MessagingException e) {// 记录错误日志logger.error("邮件发送发生异常!", e);}}/*** 发送带有附件的邮件,附件为网络文件* @param to 收件人* @param subject 邮件主题* @param content 邮件内容* @param urlPath 文件的网络URL地址*/@Overridepublic void sendUrlAttachmentMail(String to, String subject, String content, String urlPath) {try {// 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);// 邮件发送人messageHelper.setFrom(from);// 邮件接收人messageHelper.setTo(to);// 邮件主题messageHelper.setSubject(subject);// 邮件内容, 支持 html 格式messageHelper.setText(content, true);// 创建附件: 附件为网络文件UrlResource dataSource = new UrlResource(new URL(urlPath));String fileName = urlPath.substring(urlPath.lastIndexOf('/')+1);messageHelper.addAttachment(fileName, dataSource);// 发送邮件mailSender.send(message);// 日志信息logger.info("邮件已发送!");} catch (MessagingException me) {logger.error("邮件发送发生异常!", me);} catch (MalformedURLException mue) {logger.error("url格式异常", mue);}}
}

注意messageHelp.setText() 的第二参数为是否把发送内容设置为 HTML 文本,发送普通文本和 HTML 文本的区别在于:

  • 如果内容为普通文本则设置内容类型为:text/plain
  • 如果内容为HTML文本的话则设置内容类型为:text/html
  • HTML文本内容可以兼容普通文本内容

下面是邮件发送功能的测试用例:

package com.example.demo;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.example.demo.service.MailService;@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {// 注入邮件发送的接口@Autowiredprivate MailService mailService;// 邮件接收者private String to = "1793172997@qq.com";// 测试发送普通文本邮件@Testpublic void sendMail() {String subject = "主题:普通文本邮件";String content = "内容:这是一封普通文本邮件";mailService.sendSimpleMail(to, subject, content);}// 测试发送HTML文本邮件@Testpublic void sendHtmlMail() {String subject = "主题:HTML文本邮件";String content = "<h2>内容:</h2><p>这是一封HTML邮件</p>";mailService.sendHtmlMail(to, subject, content);}// 测试发送本地附件邮件@Testpublic void sendLocalAttachmentMail() {String subject = "主题:本地附件邮件";String content = "内容:这是一封本地附件的邮件";String filePath = "D:\\demo.jpg";   // 本地文件路径mailService.sendLocalAttachmentMail(to, subject, content, filePath);}// 测试发送网络文件的附件邮件@Testpublic void sendUrlAttachmentMail() {String subject = "主题:网络文件的附件邮件";String content = "内容:这是一封网络文件的附件邮件";String urlPath = "https://malltestenv.oss-cn-shenzhen.aliyuncs.com/testnormal/demo.jpeg"; // 网络文件地址mailService.sendUrlAttachmentMail(to, subject, content, urlPath);}}

【编程开发】之 Java 实现邮件发送相关推荐

  1. Java Mail 邮件发送(一):入门Demo

    本文首发于简书,Java Mail 邮件发送(一):Demo 上周公司的项目要求开发邮件发送功能.自己在网上跟着教程边学边做了一下午,现在基本开发完成了.由于一个同事也想看下该怎么写,顺便学习下.所以 ...

  2. 用java实现邮件发送

    电子邮件 1.基础知识铺垫 要在网络上实现邮件功能,必须要有专门的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服 ...

  3. 用java实现邮件发送验证码

    java实现邮件发送验证码 网易邮箱开通POP3SMTP服务的步骤 java实现邮件发送验证码 建议不要用qq邮箱,我使用qq邮箱直接一直给我报530错误,我一直认为我代码写的有错误或者POP3/SM ...

  4. java实现邮件发送, 抄送及多附件发送

    java实现邮件发送, 抄送及多附件发送 所需的jar包  mailapi.jar和smtp.jar  或  javax-mail-xxx.jar(如javax.mail-1.5.6.jar)  ht ...

  5. 网易学院 - 编程开发系 - Java技术专栏

    网易学院 - 编程开发系 - Java滚动更新列表 http://tech.163.com/special/0009159F/JAVA.html

  6. [Java工具] 邮件发送工具

    注册邮箱 去163邮箱(或其他邮箱)注册一个邮箱,并开启SMTP授权码. 程序 需要注意的是,由于阿里云服务器不让使用默认的25端口,所以会出现Windows下测试发送邮件成功,Linux服务器下发送 ...

  7. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  8. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  9. Java实现邮件发送 超详细!!!(以QQ邮箱个人版和企业版为例)

    Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 文章目录 Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 个人邮箱示例 配置依赖 简单了解涉及的两个传输协议 Q ...

  10. java实现邮件发送共鞥_Java实现复杂邮件发送功能(基于JavaMail)的实例

    这篇文章主要为大家详细介绍了基于JavaMail的Java实现复杂邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发 ...

最新文章

  1. LaxTex-----参考文献中同名作者被默认缺省的问题
  2. 什么是Code Review 代码审查
  3. 深度学习(神经网络) —— BP神经网络原理推导及python实现
  4. 5分钟教你写出一份完美的PRD文档(附案例)
  5. dos 一行两条命令
  6. WolframAlpha 的使用
  7. 解决- SecureCRT上运行 linux vim 命令中文出现乱码
  8. java 产生无重复的随机数,Java创建无重复的随机数
  9. php socket通信(tcp/udp)
  10. 京瓷1020手动双面打印提示_解决京瓷2201复印机不能双面打印问题
  11. LP3667B反激式开关电源5W(5V1A)输出电路
  12. Moviepy音视频剪辑:视频添加雪花飘落特效
  13. win10关闭系统更新后,还会提示更新
  14. 【剑指 Offe】11. 旋转数组的最小数字
  15. 财务报表版本在开发报表中的应用
  16. 单片机学习笔记——微机基础知识
  17. AWS KVS(Kinesis Video Streams)之WebRTC移植编译(一)
  18. 《linux内核设计分析》 第一周作业
  19. 十种数据挖掘分析法:一种算法就能独步天下
  20. (架构)后端技术体系框架

热门文章

  1. Python字符串拼接的四种方法
  2. SYN FLOOD攻击防范
  3. 手机端追剧神器,最新最火电影免费看,非常牛批!
  4. H3CNE GB0-191最新题库 加解释四份材料
  5. 投资组合报告-马科维茨模型
  6. 【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码
  7. ubuntu安装pr_Ubuntu 18.04 安装 Openbravo-3.0PR19Q1
  8. MT6755芯片资料文档
  9. 数据库的长连接和短链接
  10. 一行JS代码实现ie浏览器升级弹窗