使用 Docker Compose 部署邮件服务器

使用 Docker Compose 部署邮件服务器

很多时候为了方便, 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码,有些限制发邮箱的次数, 对于一些个人和企业来说, 有自己的域名和服务器为什么不自己搭建一个邮件服务器呢?因此, 笔者在这记录自己学习并且搭建邮箱服务器的步骤与过程。 本文主要使用 docker-mailserver 进行搭建, 其中一些资料和链接, 有需要详细了解的, 请查看参考文献

博主博客

  • https://blog.uso6.com
  • https://blog.csdn.net/dxk539687357

注: 如果有需要查看 docker docker compose 的安装, 可在笔者博客中搜索相关教程, 在这里就不进行赘述。

一、安装 docker-mailserver

1.1 创建目录文件

位置自己定, 我这里指定 ~/mailserver/ 目录。

mkdir ~/mailserver/

目录结构图是这样, 其中 compose.yamlmailserver.env 文件需要准备好, docker-data 是运行容器后自动生成的, 不需要管。

mailserver
├─compose.yaml
├─mailserver.env
└─docker-data

1.2 compose.yaml 配置文件

使用 wget 下载 compose.yaml 文件

wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/compose.yaml"

把文件中的 hostname 修改为自己的域名, 比如我的是 mail.uso6.com

services:mailserver:image: ghcr.io/docker-mailserver/docker-mailserver:latestcontainer_name: mailserver# Provide the FQDN of your mail server here (Your DNS MX record should point to this value)hostname: mail.uso6.comenv_file: mailserver.env# More information about the mail-server ports:# https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/# To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.ports:- "25:25"    # SMTP  (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)- "143:143"  # IMAP4 (explicit TLS => STARTTLS)- "465:465"  # ESMTP (implicit TLS)- "587:587"  # ESMTP (explicit TLS => STARTTLS)- "993:993"  # IMAP4 (implicit TLS)volumes:- ./docker-data/dms/mail-data/:/var/mail/- ./docker-data/dms/mail-state/:/var/mail-state/- ./docker-data/dms/mail-logs/:/var/log/mail/- ./docker-data/dms/config/:/tmp/docker-mailserver/- /etc/localtime:/etc/localtime:roenvironment:- ENABLE_RSPAMD=1- ENABLE_CLAMAV=1- ENABLE_FAIL2BAN=1restart: alwaysstop_grace_period: 1m# Uncomment if using `ENABLE_FAIL2BAN=1`:cap_add:- NET_ADMINhealthcheck:test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"timeout: 3sretries: 0
  • ENABLE_CLAMAV 病毒扫描。默认关闭。会占用大量的服务器资源,默认关闭。0:关闭 1:开启
  • ENABLE_FAIL2BAN 封锁尝试暴力破解的IP地址。默认关闭。0:关闭 1:开启 如果启用 Fail2Ban

1.3 mailserver.env 配置文件

使用 wget 下载 mailserver.env 文件

wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env"

具体参数配置可以查看 这里。

1.4 运行

进入 ~/mailserver/ 目录, 然后启动容器。

# 启动容器
docker compose up -d
# 关闭容器
docker compose down

二、对 docker-mailserver 进行管理

在启动容器时, 使用 docker ps 查看容器的 ID

CONTAINER ID   IMAGE                                                COMMAND                  CREATED          STATUS                    PORTS                                                                                                                                                                                                                       NAMES
318bbf389f9c   ghcr.io/docker-mailserver/docker-mailserver:latest   "/usr/bin/dumb-init …"   31 seconds ago   Up 30 seconds (healthy)   0.0.0.0:25->25/tcp, :::25->25/tcp, 0.0.0.0:143->143/tcp, :::143->143/tcp, 0.0.0.0:465->465/tcp, :::465->465/tcp, 0.0.0.0:587->587/tcp, :::587->587/tcp, 110/tcp, 995/tcp, 0.0.0.0:993->993/tcp, :::993->993/tcp, 4190/tcp   mailserver

可以使用下面命令查看帮助。

docker exec -it <CONTAINER NAME> setup help

比如我上面的 ID318bbf389f9c

[nukix@nukixPC mailserver]# docker exec -it 318bbf389f9c setup help
SETUP(1)NAMEsetup - 'docker-mailserver' Administration & Configuration CLISYNOPSISsetup [ OPTIONS... ] COMMAND [ help | ARGUMENTS... ]COMMAND := { email | alias | quota | dovecot-master | config | relay | debug } SUBCOMMANDDESCRIPTIONThis is the main administration command that you use for all your interactions with'docker-mailserver'. Initial setup, configuration, and much more is done with this CLI tool.Most subcommands can provide additional information and examples by appending 'help'.For example: 'setup email add help'[SUB]COMMANDSCOMMAND email :=setup email add <EMAIL ADDRESS> [<PASSWORD>]setup email update <EMAIL ADDRESS> [<PASSWORD>]setup email del [ OPTIONS... ] <EMAIL ADDRESS> [ <EMAIL ADDRESS>... ]setup email restrict <add|del|list> <send|receive> [<EMAIL ADDRESS>]setup email listCOMMAND alias :=setup alias add <EMAIL ADDRESS> <RECIPIENT>setup alias del <EMAIL ADDRESS> <RECIPIENT>setup alias listCOMMAND quota :=setup quota set <EMAIL ADDRESS> [<QUOTA>]setup quota del <EMAIL ADDRESS>COMMAND dovecot-master :=setup dovecot-master add <USERNAME> [<PASSWORD>]setup dovecot-master update <USERNAME> [<PASSWORD>]setup dovecot-master del [ OPTIONS... ] <USERNAME> [ <USERNAME>... ]setup dovecot-master listCOMMAND config :=setup config dkim [ ARGUMENTS... ]COMMAND relay :=setup relay add-auth <DOMAIN> <USERNAME> [<PASSWORD>]setup relay add-domain <DOMAIN> <HOST> [<PORT>]setup relay exclude-domain <DOMAIN>COMMAND fail2ban :=setup fail2ban setup fail2ban ban <IP>setup fail2ban unban <IP>setup fail2ban logsetup fail2ban statusCOMMAND debug :=setup debug fetchmailsetup debug login <COMMANDS>setup debug show-mail-logsEXAMPLESsetup email add test@example.comAdd the email account test@example.com. You will be promptedto input a password afterwards since no password was supplied.setup config dkim keysize 2048 domain 'example.com,not-example.com'Creates keys of length 2048 for the domains in comma-seperated list.This is necessary when using LDAP as the required domains cannot be inferred.setup config dkim helpThis will provide you with a detailed explanation on how to use the config dkim command, showing what arguments can be passed and what they do.

可以看出添加账号使用命令

docker exec -it <CONTAINER NAME> setup email add user@example.com

那么, 我需要添加一个 test@uso6.com 密码为 12345678 的邮箱则使用

docker exec -it 318bbf389f9c setup email add test@uso6.com 12345678

查看邮箱列表

docker exec -it 318bbf389f9c setup email list

三、常用的邮箱协议和端口

3.1 发送邮件协议和端口

3.1.1 非加密端口

25端口(SMTP):25 端口为 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议) 服务所开放的,是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的 25 端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。

3.1.2 加密端口

465端口(SMTP SSL):465 端口是为 SMTP SSL(SMTP-over-SSL) 协议服务开放的,这是 SMTP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPSSMTP 协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

587端口STARTTLS 协议的 属于 TLS 通讯协议 只是他是在 STARTTLS 命令执行后才对之后的原文进行保护的。

3.2 接收邮件协议和端口

3.2.1 非加密端口

143端口(IMAP):143 端口是为 IMAP(INTERNET MESSAGE ACCESS PROTOCOL) 服务开放的,是用于接收邮件的。

110端口(POP3):110 端口是为 POP3(Post Office Protocol Version 3,邮局协议3) 服务开放的,是用于接收邮件的。

3.2.2 加密端口

993端口(IMAP SSL):993 端口是为 IMAP SSL(IMAP-over-SSL) 协议服务开放的,这是 IMAP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 IMAPSIMAP 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

995端口(POP3 SSL):995 端口是为 POP3 SSSL(POP3-over-SSL) 协议服务开放的,这是 POP3 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 POP3SPOP3 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

3.3 IMAP 与 POP3 的区别

POP3 协议允许电子邮件客户端下载服务器上的邮件, 但是在客户端的操作(如移动邮件、标记已读等), 不会反馈到服务器上。

IMAP 协议提供 webmail 与电子邮件客户端之间的双向通信, 客户端的操作都会反馈到服务器上, 对邮件进行的操作, 服务器上的邮件也会做相应的动作。

四、防火墙配置(这里针对 iptables)

建议放行 25587465993 端口。

[nukix@nukixPC mailserver]# vim /etc/sysconfig/iptables-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT

使用 systemctl restart iptables 重启 iptables 防火墙。

五、生成 DKIM 签名

使用下面命令进行生成签名

docker exec -it <CONTAINER NAME> setup config dkim

使用下面命令获取签名公钥, 记得路径中的域名替换成你自己的

[nukix@nukixPC mailserver]# cat ~/mailserver/docker-data/dms/config/opendkim/keys/uso6.com/mail.txtmail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; ""p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3""iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB" )  ; ----- DKIM key mail for uso6.com

六、配置域名 DNS 解析

x.x.x.x 代表部署邮件服务器的 IP, DKIM 不会拼接的可以看我上面跟下面怎么拼接成即可。

Type		Name				IPv4 address
A			mail				x.x.x.x
MX			@					mail.uso6.com
TXT			@					v=spf1 mx -all
TXT			mail._domainkey		v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB

其中 MX 记录需要指向 A 地址。

  • v=spf1 表示这是 SPF 记录的版本号,目前只有一个版本
  • mx 表示授权由域名对应的 MX 记录中列出的 IP 地址发送邮件
  • SoftFail 和 HardFail 是两种策略,用于指定未经授权的发件人邮件如何处理
    • ~all 宽容策略。如果发件人的 IP 地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器不会拒绝该邮件,而是将该邮件标记为“软失败”,并将其放入接收方的垃圾邮件文件夹或者标记为垃圾邮件。
    • -all 严格策略。如果发件人的IP地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器会拒绝该邮件,并将其退回给发件人或者直接删除

更多的 SPF 语法规则可以看这里 http://www.open-spf.org/SPF_Record_Syntax/。

设置 PTR 记录(或者叫 rDNS),可以通过 IP 地址反向解析出邮箱域名。 不设置也没关系,但是会被某些服务器标记为垃圾邮件。

rDNS 主要在控制台进行配置, 比如我用的是 CloudConeVPS, 如下图所示。
CloudCone rDNS

DNS添加DMARC记录(可选)

DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一种邮件验证技术,它可以帮助域名所有者控制其域名下的邮件发送,防止电子邮件被伪造和滥用。DMARC 是 SPF 和 DKIM 的补充,可以对 SPF 和 DKIM 的验证结果进行汇总和分析,并指定如何处理未经验证或验证失败的邮件。
1.DMARC生成器
2.ruaruf 的邮箱地址要正确,用于接收邮件头和邮件体等相信信息以及邮件被拒绝的原因,并进行必要的调整。

邮件相关DNS配置规范

关于DNS解析配置一些深入理解,尤其针对邮件服务器的配置,上述提到的spf, dkim, dmarc等, 有兴趣可以查看:

  • dns mx: https://www.cloudflare.com/learning/dns/dns-records/dns-mx-record/
  • dns txt: https://www.cloudflare.com/learning/dns/dns-records/dns-txt-record/
  • dns dkim: https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/
  • dns dmarc: https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/
  • dns spf: https://www.cloudflare.com/learning/dns/dns-records/dns-spf-record/
  • dns: https://www.cloudflare.com/learning

七、SSL 证书配置

这里就放一段官方的配置, 跟 nginxSSL 配置差不多, 看不懂的话可以先看看我另外一篇文章 通过阿里云域名服务让 nginx 配置 SSL

volumes:- /usr/syno/etc/certificate/_archive/<your-folder>/:/tmp/dms/custom-certs/
environment:- SSL_TYPE=manual- SSL_CERT_PATH=/tmp/dms/custom-certs/fullchain.pem- SSL_KEY_PATH=/tmp/dms/custom-certs/privkey.pem

八、注意

阿里云 安全违规行为类型说明 里面规定要稍微注意一下。

未经阿里云授权报备,不得将云产品用作邮箱服务器或用于连接第三方邮箱服务器。违规具体情形:未经阿里云授权报备,不得将云产品(包括但不限于ECS,弹性Web托管,云虚拟主机等)用作邮箱服务器或用于连接第三方邮箱服务器。

九、在线测试网站

1.MX Toolbox
2.DMARC Analyzer
3.mail-tester.com
4.multiRBL.valli.org
5.internet.nl

十、发送/接收邮件

docker-mailserver 没有提供图形化界面进行发送与接收邮件, 所以需要借助第三方邮箱。在这推荐使用 eM Client, 用这个邮件客户端的主要原因在于如果连接有问题,它会给出一些提示。

参考文献

  • docker-mailserver GitHub 地址
  • docker-mailserver 官网
  • 目前为止最详细的教程:搭建自己的邮箱服务器|Docker-Mailserver详细教程|避坑指南
  • docker-mailserver 搭建邮件服务器

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

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

相关文章

GESP Python编程五级认证真题 2024年3月

Python 五级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月是29天 &#xff0c;则图中菱形框中应该填入&#xff08; &#xff09;。 A. (yr % 400 0…

Leetcode刷题笔记——多维动态规划篇

Leetcode刷题笔记——多维动态规划篇 第一题:最小路径和 Leetcode64&#xff1a;最小路径和&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的…

稀碎从零算法笔记Day36-LeetCode:H指数

有点绕的一个题&#xff0c;题目描述的有点奇怪&#xff08;可以看下英文&#xff1f;&#xff09; 题型&#xff1a;数组、模拟 链接&#xff1a;274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 citations &am…

SpringBoot登录校验(四)过滤器Filter

JWT令牌生成后&#xff0c;客户端发的请求头中会带有JWT令牌&#xff0c;服务端需要校验每个请求的令牌&#xff0c;如果在每个controller方法中添加校验模块&#xff0c;则十分复杂且冗余&#xff0c;所以引入统一拦截模块&#xff0c;将请求拦截下来并做校验&#xff0c;这块…

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里…

Golang | Leetcode Golang题解之第12题整数转罗马数字

题解&#xff1a; 题解&#xff1a; var (thousands []string{"", "M", "MM", "MMM"}hundreds []string{"", "C", "CC", "CCC", "CD", "D", "DC", "…

UNITY实战进阶-BatchRendererGroup+Jobs+Burst+RVO2+GPUAnimation 实现万人团战(一)

研究思路&#xff1a;GPUAnimation把动画放入GPU中处理&#xff0c;BatchRendererGroup进行动态批量渲染处理&#xff0c;JobsBurst进行多线程处理逻辑&#xff08;移动、攻击等&#xff09;&#xff0c;RVO2采用Jobs的寻路导航。 准备工作&#xff1a; Editor > Project S…

VMware虚拟机(Rocky9.3)硬盘扩容详细图文教程

参考<<鸟哥的Linux>>以及VMware虚拟机硬盘扩容详细图文教程 原因: 用户空间不足,且系统是用LVM&#xff08;logical volume manager&#xff09;进行分区 df -h #查看/home目录下磁盘容量不足磁盘扩容步骤 关闭虚拟机,选择编辑虚拟机, 点击硬盘,再点击扩容 这个…

Redis安装说明

Redis安装说明 大多数企业都是基于Linux服务器来部署项目&#xff0c;而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址&#xff1a;https://redis.io/ 1.单机安装Redis 1.1.…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

VLAN 与 VXLAN:一个字母之差,到底两者有什么区别?

来源&#xff1a;网络技术联盟站 网络虚拟化技术在现代网络架构中扮演着至关重要的角色&#xff0c;而其中的两个重要代表——虚拟局域网&#xff08;VLAN&#xff09;和虚拟扩展局域网&#xff08;VXLAN&#xff09;——在网络管理和扩展性方面发挥着独特的作用。本文将深入研…

LeetCode-1483. 树节点的第 K 个祖先【树 深度优先搜索 广度优先搜索 设计 二分查找 动态规划】

LeetCode-1483. 树节点的第 K 个祖先【树 深度优先搜索 广度优先搜索 设计 二分查找 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;暴力解法会超时&#xff01;【一级一级往上跳&#xff0c;效率太低】解题思路二&#xff1a;倍增&#xff0c;利用二进制运算&#xf…

gin框架提高篇(三)

多服务器程序运行 package mainimport ("fmt""github.com/gin-gonic/gin""golang.org/x/sync/errgroup""net/http""time" )var g errgroup.Group // 使用 errgroup.Group 来并发启动这两个服务器func main() {// 服务器1se…

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…

HarmonyOS 应用开发之wrapBuilder:封装全局@Builder

全局Builder作为wrapBuilder的参数返回WrappedBuilder对象&#xff0c;实现 全局Builder 可以进行赋值和传递。 说明&#xff1a; 从API version 11开始使用。 接口说明 wrapBuilder是一个模板函数&#xff0c;返回一个WrappedBuilder对象。 declare function wrapBuilder<…

机器学习数据预处理—统计分析方法

数据预处理 1 数据规范化 量纲&#xff0c;指将一个物理导出量用若干基本量的乘方之积表示出来的表达式。数据的比较需要关注两点——绝对数值和量纲&#xff0c;而特征间因为量纲的存在导致无法直接通过绝对数值比较大小&#xff0c;也就无法判断特征间的重要性。例如若某个…

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

刷题之Leetcode209题(超级详细)

209.长度最小的子数组 力扣题目链接(opens new window)https://leetcode.cn/problems/minimum-size-subarray-sum/ 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条…

数据可视化高级技术Echarts(快速上手柱状图进阶操作)

目录 1.Echarts的配置 2.程序的编码 3.柱状图的实现&#xff08;入门实现&#xff09; 相关属性介绍&#xff08;进阶&#xff09;&#xff1a; 1.标记最大值/最小值 2.标记平均值 3.柱的宽度 4. 横向柱状图 5.colorBy series系列&#xff08;需要构造多组数据才能实现…

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…