使用 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.yaml
和 mailserver.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
比如我上面的 ID
是 318bbf389f9c
[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
安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS
和 SMTP
协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
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
安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 IMAPS
和 IMAP
协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
995端口(POP3 SSL)
:995 端口是为 POP3 SSSL(POP3-over-SSL)
协议服务开放的,这是 POP3
协议基于 SSL
安全协议之上的一种变种协议,它继承了 SSL
安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 POP3S
和 POP3
协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
3.3 IMAP 与 POP3 的区别
POP3
协议允许电子邮件客户端下载服务器上的邮件, 但是在客户端的操作(如移动邮件、标记已读等), 不会反馈到服务器上。
IMAP
协议提供 webmail
与电子邮件客户端之间的双向通信, 客户端的操作都会反馈到服务器上, 对邮件进行的操作, 服务器上的邮件也会做相应的动作。
四、防火墙配置(这里针对 iptables)
建议放行 25
、587
、465
、993
端口。
[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
主要在控制台进行配置, 比如我用的是 CloudCone
的 VPS
, 如下图所示。
DNS添加DMARC记录(可选)
DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一种邮件验证技术,它可以帮助域名所有者控制其域名下的邮件发送,防止电子邮件被伪造和滥用。DMARC 是 SPF 和 DKIM 的补充,可以对 SPF 和 DKIM 的验证结果进行汇总和分析,并指定如何处理未经验证或验证失败的邮件。
1.DMARC生成器
2.rua
和ruf
的邮箱地址要正确,用于接收邮件头和邮件体等相信信息以及邮件被拒绝的原因,并进行必要的调整。
邮件相关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 证书配置
这里就放一段官方的配置, 跟 nginx
的 SSL
配置差不多, 看不懂的话可以先看看我另外一篇文章 通过阿里云域名服务让 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 搭建邮件服务器
相关文章:
使用 Docker Compose 部署邮件服务器
使用 Docker Compose 部署邮件服务器 很多时候为了方便, 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码,有些限制发邮箱的次数, 对于一些个人和企业来说, 有自己的域名和服务器为什么不自己搭建一个邮…...
FastAPI+React全栈开发21 探索React路由器和其他好东西
Chapter04 Setting Up a React Workflow 21 Exploring React Router and other goodies FastAPIReact全栈开发21 探索React路由器和其他好东西 So far, we have only created a couple of single-page apps that are really single pages, we haven’t touched some advance…...
Java pdfbox 给 PDF 添加文字和图片水印 并旋转45度
POM <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency> 代码: import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdf…...
微信小程序中路由跳转方式
文章目录 wx.switchTab(Object)wx.reLaunch(Object)wx.redirectTo(Object)wx.navigateTo(Object)wx.navigateBack(Object) 常见的微信小程序页面跳转方式有如下: wx.switchTab(Object):跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面&…...
Flutter应用发布前的关键iOS设备测试策略
本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…...
深入理解Linux环境配置文件:.bashrc、.bash_profile和.profile
在Linux世界中,理解各种shell配置文件如.bashrc、.bash_profile和.profile的作用和区别对于有效地管理和定制你的命令行环境至关重要。许多用户经常对这些文件的功能和使用场景感到困惑。本文旨在详细解释这些配置文件的差异、作用以及它们的正确使用方法。 .bashr…...
数据库设计规范(三大范式)
1、第一范式*(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式。 第一范式的合理遵循需要根据系统给的实际需求来确定。比如某些数据库系统中需要用到“地址”这…...
图论模板详解
目录 Floyd算法 例题:蓝桥公园 Dijkstra算法 例题:蓝桥王国 SPFA算法 例题:随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题:聪明的猴子 Floyd算法 最简单的最短路径算法,使用邻接…...
ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?
刚用ArcGIS pro的朋友们可能经常在打开xls或者xlsx文件的时候都会提示,未安装所需的Microsoft驱动程序。 怎么办呢?当然,按照提示装一下驱动就会好吗?有什么状况会出现?有什么临时替代方案呢? 全文目录&a…...
简单了解裸眼3D呈现技术
裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括: 创建立体图像源:首先需要有一…...
单元测试——Junit (断言、常用注解)
单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中,"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值,index…...
【蓝桥杯每日一题】4.2 全球变暖
原题链接:1233. 全球变暖 - AcWing题库 由题意可知: 需要找到淹没的岛屿的数量淹没的岛屿所具备的条件:咩有“高地”,也就是说岛屿(连通块)中的所有元素的 4 4 4-邻域中均含有’ . ’ 思路1:…...
ffmpeg点对点音视频udp协议传输
参考:https://zhuanlan.zhihu.com/p/636152437?utm_id0 ffmpeg查看可用设备: ffmpeg -list_devices true -f dshow -i dummy1、音频 局域网内两台设备间 设备1-音频: ffmpeg -f dshow -i audio"麦克风阵列 (适用于数字麦克风的英特…...
ensp华为AC+AP上线配置
AR1配置: <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…...
JAVA基础02-Java语言基础以及编译准备工作
什么是JAVA语言 Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用的两个特征。 (可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式…...
Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意
Photoshop 2024是一款功能强大的图像处理软件,以其卓越的性能和广泛的应用领域,赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具,让用户能够轻松进行图片编辑、合成、校色、抠图等操作,实…...
【MySQL系列】使用 ALTER TABLE 语句修改表结构的方法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
ElementUI 表格横向滚动条时滚动到指定位置
ElementUI 表格横向滚动条时滚动到指定位置 getColumnOffset(columnProp) {this.$nextTick(() > {const table this.$refs.tableRef.$refs.multipleTable;const columns table.columns;const column columns.find((col) > col.property columnProp);if (column) {// …...
【论文阅读】DETR 论文逐段精读
【论文阅读】DETR 论文逐段精读 文章目录 【论文阅读】DETR 论文逐段精读📖DETR 论文精读【论文精读】🌐前言📋摘要📚引言🧬相关工作🔍方法💡目标函数📜模型结构⚙️代码 Ǵ…...
负载均衡:实现高效稳定的网络服务
随着互联网技术的快速发展,网络应用服务的规模和复杂性日益增加。为了满足日益增长的用户需求,确保服务的高可用性和稳定性,负载均衡技术应运而生。本文将详细介绍负载均衡的概念、原理、分类以及应用场景,帮助读者深入了解这一关…...
2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)
一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …...
极简7照训练法,奇趣相机引领儿童AI摄影潮流
近日,奇趣未来推出一款专注于儿童AI摄影市场的微信小程序——奇趣相机,搭载了专为中国儿童精心研发的AIGC大模型,精准捕捉并贴合亚洲儿童人脸特征,让每一个孩子的笑容都能被完美定格。它不仅涵盖了从3岁至12岁各个年龄段的儿童摄影…...
Flink应用
1.免密登录 2.flink StandAlone模式 3.Flink Yarn 模式 (on per 模式,on session 模式) Flink概述 按照Apache官方的介绍,Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架。通俗地讲,Flink就是一个流计算框架,主要用来处…...
C# 委托与事件 终章
C# 委托与事件 浅尝 C# 委托与事件 深入 委托 委托有什么用? 将函数作为函数的参数传递声明事件并用来注册 强类型委托 Action<T1> Func<T1, TResult>事件 希望一个类的某些成员在发生变化时能被外界观测到 CollctionChangedTextChanged 标准.Ne…...
MySQL-linux安装-万能RPM法
一、MySQL的Linux版安装 1、 CentOS7下检查MySQL依赖 1. 检查/tmp临时目录权限(必不可少) 由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。执行 : chmod -R 777 /tmp2. …...
elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式
需求:要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例:将日期显示类型(type)dateType或将日期绑定值的格式(val…...
基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站
基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站 一、安装 geoip2 扩展依赖 [rootfxkj ~]# yum install libmaxminddb-devel -y二、下载 ngx_http_geoip2_module 模块 [rootfxkj tmp]# git clone https://github.com/leev/ngx_http_geoip2_module.git三、解压模…...
C++经典面试题目(二十)
1、请解释运算符重载的限制。 运算符重载必须至少有一个操作数是用户自定义类型。不能改变运算符的优先级和结合性。不能创建新的运算符。不能重载以下运算符:::, .*, .*, ?:, sizeof, typeid。 2、什么是友元函数?它有什么作用? 友元函数…...
vue3+uniapp 动态渲染组件,兼容h5、app端
1.setup写在js中,使用ref绑定数据,事件和数据都需要return出去。调用数据{数据名}.value。 如果你想要通过接口动态获取组件路径,并据此动态渲染组件,你可以使用异步组件和defineAsyncComponent函数。在Vue 3中,你可以…...
CSS层叠样式表学习(2)
(大家好,今天我们将继续来学习CSS(2)的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…...
中小企业建立网站最经济的方式/查关键词排名软件
最近在弄linux系统的环境,搭建vue环境,由于是第一次接触vue以前也没使用过,所以才搭建环境的时候还是挺闷逼的。记录一下,免得以后忘记了。 安装cnpm 由于不知道vue和npm的关系,所以自己想先安装npm并设置成阿里的cnpm…...
手机软件开发者/优化大师软件下载
很多情况下,我们需要得到该系统的版本号可以运行该文件数。为了做一些额外的动作!实际上可使用jna获得,是这将依赖人家,所以还是Java自己来吧!好啦。直接上代码吧/*** Description: ** Title: FileInfoUtil.java* Pack…...
网站优缺点/百度软文推广怎样收费
2019独角兽企业重金招聘Python工程师标准>>> chart.js 基于H5的canvas,轻量级的图表插件。 有6中图表类型:折线图、条形图、雷达图、饼图、柱状图、极地区域图 关于柱状图的绘制,追加 、更新、删除数据等操作的总结 原文来自于:h…...
企业建站报价方案/自贡网站seo
文章目录R_install参考Anaconda安装R语言解释器及第三方包安装pkgR方式【推荐使用】conda方式手动安装装载包到库中更新更新(R方式):R_install 参考 [genomicranges的学习]https://www.it610.com/article/1288783044492206080.htm 官网 A…...
腾讯云建设个人网站/关键词你们懂的
定义 无偏估计:估计量的均值等于真实值,即具体每一次估计值可能大于真实值,也可能小于真实值,而不能总是大于或小于真实值(这就产生了系统误差)。 估计量评价的标准 (1)无偏性 如上述…...
做网站论坛 前置许可/长沙疫情最新数据消息
场景一:类似于微博,实现关注和被关注功能。 思路: 对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户。当用户A关注用户B的时候,执行两步操作: sadd user:A B sadd user:B A 问题1…...