代码控制邮件服务器发送电子邮件

news2025/1/21 0:50:38

1、引言

        在用户注册的时候我们如果需要让用户接收动态验证码通常有两种方式。一种是给用户发送短信验证码,另一种是发送邮箱验证码。而发送短信验证码的话就必须购买短信流量,这无疑增加了投入的成本,那么此时我们可以使用发送邮箱验证码的形式去代替,由于邮件发送的方式已经开放,我们完全可以自己搭建邮件服务器,从而不受限制的发送电子邮件,借此实现验证码发送、订阅推送以及各种相关的校验。

2、准备工作

        首先要搭建邮件服务器,这里我就不介绍搭建邮件服务器的具体方法了,我只提供代码控制发送电子邮件的方式,关于邮件服务器的搭建请直接访问我的主页,然后查看我的收藏夹,其中有一个公开的收藏夹名为服务器问题,在里面我收藏了一篇文章,参照那里就能搭建邮件服务器。

3、jar包引入

        为什么说是jar包引入,因为直接引入maven依赖有些问题,即使在maven项目中也请直接使用普通方法加载jar包的方式,如果要使用依赖方式引入,请自己排除问题,我还没有仔细研究maven项目中是什么原因导致无法发送成功,jar包名如下,请自行在csdn搜索下载:

javax.mail.jar

4、准备邮件工具类

        这里需要准备相关的邮件工具类,我会去掉账号密码等信息,请自行填充自己的账号密码,这里虽然是设置默认发送网页,但是直接发送文本也可以,html网页在这里其实也是一种文本。

package com.user.mails;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

/**
 * 发送邮件的工具类,需要使用javax.mail.jar,更复杂的方式参考csdn服务器问题收藏
 */
public class EmailUtils {
    private String sendMailUserName;
    private String sendMailPassword;
    private String toMail;
    private String title;
    private String content;

    /**
     * @param sendMailUserName 服务器用户名
     * @param sendMailPassword 发件人密码,我这里是服务器密码
     * @param toMail 收件人邮箱
     * @param title 邮件主题
     * @param content 邮件内容
     */
    public EmailUtils(String sendMailUserName, String sendMailPassword,
                    String toMail, String title,
                    String content){
        this.sendMailPassword = sendMailPassword;
        this.sendMailUserName= sendMailUserName;
        this.toMail=toMail;
        this.title =title;
        this.content=content;
    }

    /**
     * 发送邮件的方法,具体发送内容和主题,根据调用的参数发送,默认为网页内容,
     * 但是直接提供文本内容也可以
     */
    public void send() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Properties props = new Properties();
                props.put("mail.smtp.host", "配置的邮件服务器域名");
                props.put("mail.smtp.auth", "true");
                Session session = Session.getInstance(props, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(sendMailUserName,sendMailPassword);
                    }
                });
                try {
                    Transport transport = session.getTransport("smtp");
                    Message message = new MimeMessage(session);
                    //第一个参数是发件人邮箱,第二个参数是发件人昵称,设置后用户那里将显示昵称,而不是邮箱号
                    message.setFrom(new InternetAddress("邮件服务器中创建的邮箱账号,格式为:服务器用户名@一级域名","发件人昵称"));
                    message.setSubject(title);
                    //message.setText(content);//发送普通文本
                    message.setContent(content,"text/html;charset=UTF-8");//发送网页
                    message.setRecipient(Message.RecipientType.TO,new InternetAddress(toMail));
                    transport.send(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

5、发送文本示例

5.1、代码

        这里在服务器每创建一个用户就对应一个邮箱账号,对应的邮箱格式为用户名@一级域名。

private void notice(){
        String email="接收者邮箱账号";
        String content="我不当大哥好多年";
        EmailUtils mail = new EmailUtils("服务器用户名,这里不要使用root用户,使用普通用户的用户名",
                "对应的服务器用户密码", email, "请收下我的膝盖",content);
        mail.send();
        System.out.println("发送完成");
    }

5.2、效果

6、发送网页示例

6.1、代码

        直接更改content字符串的内容即可:

String content="<!DOCTYPE html>\n" +
        "<html lang=\"zh_CN\">\n" +
        "    <head>\n" +
        "        <meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">\n" +
        "        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
        "        <title>邮件测试</title>\n" +
        "        <style type=\"text/css\">\n" +
        "            body{\n" +
        "                width: 100%;\n" +
        "                color: red;\n" +
        "                font-size: 2ch;\n" +
        "                background-color: yellow;\n" +
        "            }\n" +
        "        </style>\n" +
        "    </head>\n" +
        "    <body>\n" +
        "        哦,大哥,大哥,你好吗?\n" +
        "    </body>\n" +
        "</html>";

6.2、效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1446998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vision Transformer Pytorch 实现代码学习记录

目前运营的社交平台账号&#xff1a; CSDN 【雪天鱼】: 雪天鱼-CSDN博客哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com 可能后续有更新&#xff0c;也可能没有更新&#xff0c;谨慎参考 V1.0 24-02-13 ViT 代码的基本训练, 预测推理脚本运行 1 学习目标 能用官方的 ViT…

渗透测试练习题解析 3(CTF web)

1、[网鼎杯 2020 朱雀组]phpweb 1 考点&#xff1a;反序列化漏洞利用 进入靶场&#xff0c;查看检查信息&#xff0c;发现存在两个参数 func 和 p 查看页面源代码 payload&#xff1a;funcfile_get_contents&pphp://filter/resourceindex.php 整理后&#xff0c;就是 PHP 代…

操作系统——1.3 操作系统运行环境

1.3 操作系统运行环境 一、概念 操作系统运行机制总览 应用程序与内核程序 特权指令与非特权指令 内核态与用户态 CPU在内核态与用户态的切换 操作系统运行机制的总结 中断和异常总览 中断的作用 中断的类型 内中断的例子 外中断的例子 中断的分类&am…

腾讯云4核8G服务器多少钱?轻量和CVM报价2024新版

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

漫漫数学之旅018

文章目录 经典格言数学习题古今评注名人小传 - 库尔特哥德尔 经典格言 一个毫无自由的社会——一个人凡事都要遵循严格统一的规则——将在行为上既不一致也不完全&#xff0c;甚至不能解决某些也许很重要的问题。——库尔特哥德尔&#xff08;Kurt Gdel&#xff09; 库尔特哥德…

机器学习:卷积介绍及代码实现卷积操作

传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动&#xff0c;当前窗口内对应元素相乘然后求和得到结果&#xff0c;一个窗口一个结果。相乘然后求和恰好也是向量内积的计算方式&#xff0c;所以可以将每个窗口内的元素拉成向量&#xff0c;通过向量内积进行运算&#xf…

C++ 音视频原理

本篇文章我们来描述一下音视频原理 音视频录制原理: 下面是对这张思维导图的介绍 摄像头部分: 麦克风采集声音 摄像头采集画面 摄像头采集回来的数据可以用RGB也可以用YUV来表示 图像帧帧率 一秒能处理多少张图像 图像处理 &#xff1a;调亮度 图像帧队列 :意思是将数据取…

算法刷题:盛水最多的容器

盛水最多的容器 .习题链接题目题目解析算法原理我的答案 . 习题链接 盛水最多的容器 题目 题目解析 VH*W h为左右两边低的一边,w为左右两边之间的距离 算法原理 定义两个指针 left0,rightn-1; left从左往右对数组进行遍历,right从右往左进行遍历 遍历的过程中,每一次都需要…

10块钱的AI数字人!

&#x1f525;10元的小报童写‬出了500元的‬价值&#xff01; 所以就爆了&#x1f525;&#xff01; 不到两天‬就冲到‬了近3000人&#xff01; 太恐怖了&#xff0c;大佬的微‬信都被加‬爆了&#xff0c; 10块钱还配套‬了一个‬群 就是这‬么牛逼&#xff01; 可能‬…

有状态DHCPv6快速模式配置及EUI-64介绍

正文共&#xff1a;1024 字 15 图&#xff0c;预估阅读时间&#xff1a;3 分钟 我们现在已经熟悉了IPv6的地址架构&#xff08;IPv6地址架构一本通&#xff09;&#xff0c;掌握了IPv6地址的手工配置方式&#xff08;IPv6从入门到精通&#xff09;和DHCPv6有状态地址配置&#…

svg基础(八)滤镜-feTurbulence(湍流)

feTurbulence&#xff1a;湍流滤镜 湍流滤镜&#xff0c;不稳定气流&#xff0c;能够实现半透明的烟熏或波状图像。 通常用于实现一些特殊的纹理。滤镜利用 Perlin 噪声函数创建了一个图像。噪声在模拟云雾效果时非常有用&#xff0c;能产生非常复杂的质感&#xff0c;利用它可…

算法-----高精度算法1(高精度加法,高精度减法)(详解)

什么是高精度算法&#xff1f; 高精度的意思就是他得名字----高的精度&#xff0c;简单说就是位数很大&#xff0c;而高精度算法就是将这些高精度数&#xff08;位数很大在几百几千几万位的数叫高精度数&#xff09;通过计算机的型式模拟出来结果。 为什么要用高精度算法&…

【运维测试】移动测试自动化知识总结第1篇:移动端测试介绍(md文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论移动测试相关知识。主要知识点包括&#xff1a;移动测试分类及android环境搭建&#xff0c;adb常用命令&#xff0c;appium环境搭建及使用&#xff0c;pytest框架学习&#xff0c;PO模式&#xff0c;数据驱动&#xff0…

力扣精选算法100道——【模板】前缀和(一维)

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 &#x1f388;设定下标为1开始 &#x1f388;取值的范围 &#x1f6a9;实现代码 &#x1f6a9;了解题意 第一行的3和2&#xff0c;3代表行数&#xff0c;2代表q次查询(…

Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

文章目录 题面链接题意题解代码总结 题面 链接 C. Kefa and Park 题意 求叶节点数量&#xff0c;叶节点满足&#xff0c;从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现&#xff0c;当不满足条件时直接返回。 到达叶节点后统计答案&#xff0c;用…

结构体,位段问题

结构体&#xff0c;位段问题 一、结构体二、结构体内存分配问题三、存在内存对齐的原因四、结构体传参问题五、结构体实现位段 一、结构体 1.简单说说结构体是什么?  结构体就是把不同的数据类型整合到一起,组成的一个数据类型!!  2.结构体的创建和初始化 struct Stu {char…

【复现】Supabase后端服务 SQL注入漏洞_48

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Supabase是什么 Supabase将自己定位为Firebase的开源替代品&#xff0c;提供了一套工具来帮助开发者构建web或移动应用程序。 Sup…

【MySQL探索之旅】MySQL数据库下载及安装教程

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

1921:【02NOIP普及组】过河卒

1921&#xff1a;【02NOIP普及组】过河卒 【题目描述】 如图&#xff0c;A点有一个过河卒&#xff0c;需要走到目标B点。卒行走的规则&#xff1a;可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马&#xff08;如上图的C点&#xff09;&#xff0c;该马所在的点和所有…

leetcode(双指针)11.盛最多水的容器(C++详细解释)DAY9

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回…