基于163邮箱实现的邮件发送功能

简介: 基于163邮箱实现的邮件发送功能

一、POP3、SMTP和IMAP了解


1.1  什么是POP3


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


1.2  什么是SMTP


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

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

  增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。


1.3  什么是IMAP


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


二、网易163免费邮箱相关服务器信息


2.1  163免费邮客户端设置的POP3、SMTP、IMAP地址


image.png


2.2 163邮箱配置


  网易邮箱已经默认开启 POP3/SMTP/IMAP 服务,方便您可以通过电脑客户端软件更好地收发邮件。

  如果关闭可以通过以下方式开启:

  1. 请登录163邮箱,
  2. 点击页面正上方的“设置”,
  3. 再点击左侧上“POP3/SMTP/IMAP”,
  4. 其中“开启SMTP服务”是系统默认勾选开启的。

  您可勾选图中另两个选项,点击确定,即可开启成功。不勾选图中两个选项,点击确定,可关闭成功。

image.png

以下开始编写代码。


三、163发送邮箱实现


3.1开发环境

  JavaMail 版本: 1.6.0
  JDK 版本: JDK 1.8 
  IDEA
  本测试基于163邮箱


3.2 引入邮件需要的依赖

<!-- mail -->
  <dependency >  
          <groupId >javax.mail </groupId >  
          <artifactId >mail </artifactId >  
          <version >1.4.5 </version >  
      </dependency >  
      <dependency >  
          <groupId >com.sun.mail </groupId >  
          <artifactId >javax.mail </artifactId >  
          <version >1.5.4 </version >  
      </dependency > 


3.3编写EmailUtils

package pro.demo.SpringBootdemo.util;
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 /* 
 * 本测试基于163邮箱
 */
public class EmailUtil  {
  //发件人邮箱 (开通 POP3/SMTP/IMAP服务的邮箱)
  private static final String myEmailAccount = "******@163.com";
  //POP3/SMTP/IMAP客户端授权密码或者邮箱密码
  private static final String myEmailPassword = "******";
  /**
   * 一对一发送邮件
   * 
   * @param fromName  发件人姓名
   * @param receiveMailAccount 收件人邮箱
   * @param title   邮件标题
   * @param content 邮件内容
   * 
   * @return true 成功    false 失败
   * */
    public static boolean sendEmail(String fromName, String receiveMailAccount, String title, String content){
      // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", "smtp.163.com");    // 发件人的邮箱的 SMTP 服务器地址, 163邮箱固定为:smtp.163.com
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        props.setProperty("mail.smtp.port", "25");        // 邮箱服务器端口号   163邮箱SMTP默认是25
        try {
          // 2. 根据配置创建会话对象, 用于和邮件服务器交互
          Session session = Session.getInstance(props);
          session.setDebug(true);                             // 设置为debug模式, 可以查看详细的发送 log
          // 3. 创建一封邮件
          MimeMessage message = new MimeMessage(session);
          // 3.1 From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
          message.setFrom(new InternetAddress(myEmailAccount, fromName, "UTF-8"));
          // 3.2 To: 收件人(可以增加多个收件人、抄送、密送)
          message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAccount, "", "UTF-8"));
          // 3.3 Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
          message.setSubject(title, "UTF-8");
          // 3.4 Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
          message.setContent(content, "text/html;charset=UTF-8");
          // 3.5 设置发件时间
          message.setSentDate(new Date());
          // 3.6. 保存设置
          message.saveChanges();
          // 4. 根据 Session 获取邮件传输对象
          Transport transport = session.getTransport();
          //5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
          transport.connect(myEmailAccount, myEmailPassword);
          // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
          transport.sendMessage(message, message.getAllRecipients());
          // 7. 关闭连接
          transport.close();
          return true;
        } catch (Exception e) {
      return false;
    }
    }


3.4调试发邮件

    /**
     * 调试发邮件功能
     * */
    public static void main(String[] args) {
      boolean bl = sendEmail("测试员", "********@qq.com", "测试数据", "你好,这是一封测试邮件,请忽略");
      if(bl){
        System.out.println("success");  //邮件发送成功
      }else{
        System.out.println("failed"); //邮件发送失败
      }
  }


3.5 接收到测试邮件


  如下图,是接收到的测试邮件截图。好了,一个基于163邮箱的发送功能完成了。

image.png


目录
相关文章
|
API 网络安全 数据安全/隐私保护
.NET邮箱API发送邮件的方法有哪些
本文介绍了.NET开发中使用邮箱API发送邮件的方法,包括SmtpClient类发送邮件、MailMessage类创建邮件消息、设置SmtpClient属性、同步/异步发送、错误处理、发送HTML格式邮件、带附件邮件以及多人邮件。AokSend提供高触达发信服务,适用于大规模验证码发送场景。了解这些技巧有助于开发者实现高效、可靠的邮件功能。
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
479 0
|
缓存 NoSQL Java
分布式锁有哪些应用场景和实现?
电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。
833 0
|
Shell
xhost: unable to open display ":0.0"
-bash: xhost: 未找到命令 原因是因未没有安装相关的包(其他类似command not found命令没有可以用这种方式解决) yum whatprovides "*/xhost" 安装对应版本
2206 0
|
Shell 数据安全/隐私保护
执行jobs命令查看不到任务的原因终于找到了
背景 执行nohup command &后,断开终端,执行jobs命令查看不到任务的原因,终于找到了。 首先执行完如下步骤: 1.nohup scp user@server:path/file localpath 2.输入密码 3.按Ctrl+Z挂起当前进程 4.使用命令bg让挂起的进程继续运行
|
监控 网络协议 网络安全
SMTP操作使用详解并通过python进行smtp邮件发送示例
SMTP操作使用详解并通过python进行smtp邮件发送示例
597 3
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
318 0
|
网络安全
阿里云Could not connect to SITP host: smtp.163.com,port: 25;
阿里云Could not connect to SITP host: smtp.163.com,port: 25;
686 1
|
JavaScript 前端开发 容器
< 每日小技巧: 基于Vue状态的过渡动画 - Transition 和 TransitionGroup>
Vue 的 `Transition` 和 `TransitionGroup` 是用于状态变化过渡和动画的组件。`Transition` 适用于单一元素或组件的进入和离开动画,而 `TransitionGroup` 用于 v-for 列表元素的增删改动画,支持 CSS 过渡和 JS 钩子。
413 1
< 每日小技巧: 基于Vue状态的过渡动画 - Transition 和 TransitionGroup>
|
时序数据库 Docker 容器
Docker安装InfluxDB
Docker安装InfluxDB
399 0