Ubuntu 申请 SSL证书并搭建邮件服务器
文章目录
- Log
 
- 一、域名连接到泰坦(Titan)电子邮件
- 二、NameSilo Hosting 避坑
- 三、Ubuntu 搭建邮件服务器
- 1. 环境准备
- 2. 域名配置
- 3. 配置 Postfix 和 Dovecot
- ① 安装 Nginx
- ② 安装 Tomcat
- ③ 申请 SSL 证书(Let's Encrypt)
- ④ 配置 postfix
- ⑤ 配置 Dovecot
 
- 4. 配置 SpamAssassin 和 OpenDKIM
- ① 配置 SpamAssassin
- ② 配置 OpenDKIM
 
 
- 参考教程:
- 总结
Log
2024.01.13啊,2024年了啊,稍微记录下吧。查了一圈似乎没有相关的教程,那咱就自己摸索着写一篇吧
2024.01.15有事鸽了一天,今天继续;乐了,不支持SSH,退款了
2024.01.16来了
2024.01.17继续搞;教程有点老了,各种版本更新、服务停止支持,跟扒皮一样一层层去找下一步的解决方案,过程倒是挺有趣,但人也有点麻;Let’s Encrypt的证书申请完了发现网站进不去了,查解决方案的时候发现之前网站配置CDN的时候用的Cloudflare提供自签证书。。。
2024.01.18接着搞;配置完了客户端连接测试 SSL连接错误,还得再测测,从头查查吧
2024.01.25终于有眉目了,服务器厂家没开放465端口,联系下然后加个 TXT 记录防止邮件滥用。问题解决了就发布叭;并没有,被认为是垃圾邮件发出去了收不到;搞定了。
- 前置条件:注册Namesilo账号,并购买一个域名和一个服务器 - 如果要买 NameSilo 的服务器,请先看 章节二
 
一、域名连接到泰坦(Titan)电子邮件
- 参考教程: Setup Titan MX and TXT records for NameSilo
- 登录  N a m e S i l o \rm NameSilo NameSilo 账户,进入域名管理页面,随后点击管理此域的 DNS 选项。
  
- 如果是刚入手的域名,需要删除原有的记录,然后根据自己的服务器的IP添加以下两条记录:
| Hostname | Type | TTL | 
|---|---|---|
| A | 3600 | |
| www | A | 3600 | 
- 随后设置 MX 记录和 TXT 记录(用于验证域名所有权并激活电子邮件服务),添加以下两条记录:
| Hostname | Type | Target Hostname | TTL | Distance | 
|---|---|---|---|---|
| @ | MX | mx2.titan.email | 3600 | 20 | 
| Hostname | Type | Text | TTL | 
|---|---|---|---|
| @ | TXT/SPF | v=spf1 include:spf.titan.email ~all | 3600 | 
- MX记录:邮件交换记录 (Mail Exchange Record),域名系统(DNS)中的一种资源记录类型,用于指定负责处理发往收件人域名的邮件服务器。
- SPF记录:发信者策略架构(Sender Policy Framework),为了防范垃圾邮件而提出来的一种DNS记录类型,用于登记某个域名拥有的用来外发邮件的所有IP地址。
- 最终结果如下:
  
- 进入添加管理邮件页面(需要购买 NameSilo 的 Hosting 服务,第一次进入需要设置备用邮箱,并连接到  T i t a n E m a i l \rm Titan\ \ Email Titan  Email):
  
- 等待域名解析生效后(24小时以内)再次验证:
   
- 连接成功后就可以添加邮箱了
二、NameSilo Hosting 避坑
-  搞了一下午,最后问客服发现在 NameSilo 上买的服务器不支持 SSH,只能在 cPanel 里点点点,不能用 terminal 敲命令行还玩什么呢。 
  
-  单纯写博客用来记录的话倒是可以试下,直接用网站模板拖拽修改排版倒是挺不错的(如果涉及到比较复杂的后台逻辑,想要直接部署一个项目运行的话就不推荐了): 
  
-  取消 Hosting 服务退款以后和 Titan 相关的邮箱都会失效(退款到账时间有点小长,还扣了点手续费)。 
  
三、Ubuntu 搭建邮件服务器
- 绕回来还是要自己搞,那就找点教程实操一遍,记录下过程和遇到的问题,留以不时之需:
1. 环境准备
- 版本: Ubuntu 22.04 LTS
- 安装 MySQL:sudo apt install mysql-server- 命令执行完后 apt已经默认开启服务,因此不需要开启服务以及设置开机自启动
 
- 命令执行完后 
- 相关命令: - 系统视图: - 查看状态: service mysql status
- 启动/停止/重启服务: sudo service mysql start/stop/restart
- 查看密码: sudo cat /etc/mysql/debian.cnf
- 进入 MySQL: sudo mysql
 
- 查看状态: 
- MySQL 视图: - 重置 root 密码: - ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new-password';
- FLUSH PRIVILEGES;
 
- 远程登录: - 新建 root 用户: create user 'root'@'%' identified by 'complex-reomteLogin-password';
- 用户授权: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
- 刷新: FLUSH PRIVILEGES;
 
- 新建 root 用户: 
- 报错:
   - 停止服务: sudo systemctl stop mysql
- 编辑文件: sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf- 注释该配置项: bind-address = 127.0.0.1
 
- 注释该配置项: 
- 开启服务: sudo service mysql start
  
 
- 停止服务: 
 
- 重置 root 密码: 
 
- 系统视图: 
2. 域名配置
- 在已有的两条 A 类型解析记录(如下)的基础上进行配置:
| Hostname | Type | TTL | 
|---|---|---|
| A | 3600 | |
| www | A | 3600 | 
- 添加三个子域名 A 记录:
| Hostname | Type | TTL | 
|---|---|---|
| mx | A | 3600 | 
| smtp | A | 3600 | 
| pop3 | A | 3600 | 
- 添加一个 MX 记录:
| Hostname | Type | Target Hostname | TTL | Distance | 
|---|---|---|---|---|
| @ | MX | mx.XXX.xxx | 3600 | 20 | 
- 添加一个 SPF 记录:
| Hostname | Type | Text | TTL | 
|---|---|---|---|
| @ | TXT | v=spf1 mx ~all | 3600 | 
- 添加一个 DMARC 记录:
| Hostname | Type | Text | TTL | 
|---|---|---|---|
| _dmarc | TXT | v=DMARC1; p=reject; fo=1; rua=mailto:a***@XXX.xxx | 3600 | 
3. 配置 Postfix 和 Dovecot
- 安装: - apt update
- apt install postfix postfix-mysql dovecot-core dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-mysql
 
- 数据库配置: - 创建三个数据库表 virtual_domains、virtual_users、virtual_aliases:
 
- 创建三个数据库表 
CREATE TABLE `virtual_domains` (`id`  INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `virtual_users` (`id` INT NOT NULL AUTO_INCREMENT,`domain_id` INT NOT NULL,`password` VARCHAR(106) NOT NULL,`email` VARCHAR(120) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `virtual_aliases` (`id` int(11) NOT NULL auto_increment,`domain_id` int(11) NOT NULL,`source` varchar(100) NOT NULL,`destination` varchar(100) NOT NULL,PRIMARY KEY (`id`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 插入数据: - 域名: insert into virtual_domains values(1,'XXX.xxx')
- 用户: insert into virtual_users values(1,域名序号,md5('密码'),'user@XXX.xxx');
- 别名: insert into virtual_aliases values(1,1,'aliase@XXX.xxx','user@XXX.xxx')- (aliase@XXX.xxx需要先存在于virtual_users中,virtual_aliases中的转发记录才能生效)
 
- (
 
- 域名: 
① 安装 Nginx
- 安装Nginx 弹出 “Daemons using outdated libraries”,参考解决方案。
  
- 报错 “./configure: error: the HTTP gzip module requires the zlib library.”,解决:sudo apt-get install zlib1g-dev
- 访问网址显示下图界面为安装成功:
  
- 备份配置文件: cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
② 安装 Tomcat
- 安装Java环境: sudo apt install openjdk-17-jre-headless
- 安装Tomcat:sudo wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
- 解压Tomcat:sudo tar -xzvf apache-tomcat-10.1.18.tar.gz -C /usr/local/- -C:指定解压⽬录,解决当前⽬录下找不到- /usr/local报错
 
- 启动Tomcat: - cd /usr/local/apache-tomcat-10.1.18/bin
- ./startup.sh
 
- 域名:8080访问进入下图界面为安装成功:
  
③ 申请 SSL 证书(Let’s Encrypt)
-  安装 snap: - sudo apt update
- sudo apt install snapd
- snap version
 
-  通过 snap 安装 certbot: sudo snap install --classic certbot
-  创建的软链接,便于 certbot 命令的使用: ln -s /snap/bin/certbot /usr/bin/certbot
-  获取证书(Nginx 方式): certbot certonly --nginx --email 1***@qq.com -d ***.top -d www.***.top- 报错:Error while running nginx -c /etc/nginx/nginx.conf -t
- 解决: - 查看 Nginx 配置路径: sudo nginx -t
- 自定义路径:certbot --nginx --nginx-server-root=/usr/local/nginx/conf
- 设定完路径就可以根据提示一步步注册了:
  
 
- 查看 Nginx 配置路径: 
- 报错:Could not automatically find a matching server block for XXX.xxx. Set the 'server_name' directive to use the Nginx installer.
- 解决:修改 Nginx 配置文件,将 server_name改为自己的两个域名
  
- 重新安装还是报上面的路径错误,用同样的命令解决,随后按照提示一步步就安装成功了:
  
 
- 报错:
-  更新证书: certbot renew
-  续订并重启 Nginx: certbot renew --renew-hook "service nginx restart"- 如果未到期会提示证书尚未到期更新,也不会重启 Nginx
 
-  自动续订证书: 30 4 * * 1 certbot renew --renew-hook "service nginx restart" --quiet > /dev/null 2>&1 &- 翻译:每周一的凌晨4点30分,使用Certbot来续订证书,并在完成后重启Nginx服务。所有的输出和错误信息都会被重定向到/dev/null,并且命令会在后台运行。
- 设置系统为北京时间: sudo timedatectl set-timezone Asia/Shanghai
 
-  安装完证书访问网站报错,重定向次数过多,解决方法很简单,只需要将 Cloudflare 中的加密模式由灵活(默认模式)修改为完全即可。详细原因可以参考这篇文章的 三:Cloudflare。
  
④ 配置 postfix
-  官网文档:Postfix文档 
-  备份 postfix 的默认配置文件: cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
-  编辑 main.cf:- vim /etc/postfix/main.cf
- 注释掉下面这部分代码:
  - 添加自己的配置(路径里的域名换成自己的): - smtpd_tls_auth_only = yes注释掉表示允许 tls 的 587 端口以及不需要 ssl 验证的 25 端口,用来解决使用 Foxmail 的时候每次登陆都会弹出一个 “安全证书”的问题。
 
 
# 使用自己的ssl证书
smtpd_tls_cert_file=/etc/letsencrypt/live/000.top/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/000.top/privkey.pem
smtpd_use_tls=yes
#smtpd_tls_auth_only = yessmtp_tls_cert_file=/etc/letsencrypt/live/000.top/fullchain.pem
smtp_tls_key_file=/etc/letsencrypt/live/000.top/privkey.pem
smtp_use_tls=yessmtpd_tls_CApath=/etc/letsencrypt/live/000.top
smtpd_tls_security_level=may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scachesmtp_tls_CApath=/etc/letsencrypt/live/000.top
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache# 使用dovecot来做身份认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
- 域名相关的基本配置,其他的一般用默认的就行:
myhostname = 000.top
myorigin = $myhostname
mydomain = $myhostname
- 其他配置:
# 确保将邮件投递给 mysql 表中列出的虚拟域
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Postfix 配置虚拟域、用户和别名
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
- 创建上面配置里的三个配置文件并进行配置: - mysql-virtual-mailbox-domains.cf- vim /etc/postfix/mysql-virtual-mailbox-domains.cf- user = root password = 123456 hosts = 127.0.0.1:3306 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
 
- mysql-virtual-mailbox-maps.cf- vim /etc/postfix/mysql-virtual-mailbox-maps.cf- user = root password = 123456 hosts = 127.0.0.1:3306 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
 
- mysql-virtual-alias-maps.cf- vim /etc/postfix/mysql-virtual-alias-maps.cf- user = root password = 123456 hosts = 127.0.0.1:3306 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
 
- 重启服务: systemctl restart postfix
- 测试是否配置成功: - postmap -q 000.top mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf成功则输出- 1
- postmap -q user@000.top mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf成功则输出- 1
- postmap -q aliase@000.top mysql:/etc/postfix/mysql-virtual-alias-maps.cf成功则输出- user@000.top
 
 
- 配置 master.cf:- vim /etc/postfix/master.cf
- 取消下图所示的注释,以开启 587 端口和 465 端口的服务
  
 
⑤ 配置 Dovecot
-  配置 dovecot.conf:- vim /etc/dovecot/dovecot.conf
- 确保启用: !include conf.d/*.conf
- 加入配置,启用协议: protocols = imap lmtp pop3
 
-  配置 10-mail.conf:- vim /etc/dovecot/conf.d/10-mail.conf
- 确保存在配置(该配置确保将邮件存放目录设置在 /var/mail中):- mail_location = maildir:/var/mail/vhosts/%d/%n
- mail_privileged_group = mail
 
 
-  创建用户来作为 /var/mail路径的所属人:- groupadd -g 5000 vmail
- useradd -g vmail -u 5000 vmail -d /var/mail
- chown -R vmail:vmail /var/mail
 
-  配置 10-auth.conf:- vim /etc/dovecot/conf.d/10-auth.conf
- 确保配置为: - disable_plaintext_auth = yes(表示拒绝明文密码登录,如果客户端登不上可以尝试把这里改成- no)
- auth_mechanisms = plain login
 
- 禁用系统用户登陆,并开启 mysql 支持(第一个注释掉,开启第二个):
  
 
-  配置 auth-sql.conf.ext:- vim /etc/dovecot/conf.d/auth-sql.conf.ext
- 修改为以下内容:passdb {driver = sqlargs = /etc/dovecot/dovecot-sql.conf.ext } userdb {driver = staticargs = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
 
-  配置 dovecot-sql.conf.ext:- vim /etc/dovecot/dovecot-sql.conf.ext
- 确保添加如下配置: - driver = mysql
- connect = host=127.0.0.1 port=3306 dbname=mailserver user=root password=123456
- default_pass_scheme = MD5
- password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
 
 
-  将 /etc/dovecot的拥有者改为vmail:dovecot:- chown -R vmail:dovecot /etc/dovecot
- chmod -R o-rwx /etc/dovecot
 
-  配置 10-master.conf:- vim /etc/dovecot/conf.d/10-master.conf
- 将 imap-login、pop3-login下第一个的port设置为0,以禁用非 ssl 加密的 imap 和 pop3 协议
- 将 lmtp、auth、auth-worker中的内容修改为以下对应内容:service lmtp {unix_listener /var/spool/postfix/private/dovecot-lmtp {mode = 0600user = postfixgroup = postfix}# Create inet listener only if you can't use the above UNIX socket#inet_listener lmtp {# Avoid making LMTP visible for the entire internet#address =#port =#} }service auth {unix_listener /var/spool/postfix/private/auth {mode = 0666user = postfixgroup = postfix}unix_listener auth-userdb {mode = 0600user = vmail#group =}user = dovecot }service auth-worker {# Auth worker process is run as root by default, so that it can access# /etc/shadow. If this isn't necessary, the user should be changed to# $default_internal_user.user = vmail }
 
-  配置 10-ssl.conf以开启 ssl 认证:- vim /etc/dovecot/conf.d/10-ssl.conf
- 找到并修改为:ssl = required- required:必须要有 ssl
- yes:开启 ssl 也允许非 ssl
 
- 设置 ssl 证书路径: - ssl_cert = </etc/letsencrypt/live/000.top/fullchain.pem
- ssl_key = </etc/letsencrypt/live/000.top/privkey.pem
 
 
-  查看当前 Dovecot 配置: dovecot -n
-  配置完成,重启后可以使用 Foxmail 连接了: - service postfix restart
- service dovecot restart
 
-  登录失败,到 /var/log查看日志
-  终于找到问题了,记得看看自己的主机厂商有没有开启 465 等端口。 
4. 配置 SpamAssassin 和 OpenDKIM
- 登录上以后发送邮件收不到,试了下这个网站(每天免费测试三次):Newsletters spam test by mail-tester.com
  
- 难绷,还得再搞搞,按照这里面的一条条改吧:
  
① 配置 SpamAssassin
- 安装: sudo apt-get install spamassassin spamc
- 添加用户: sudo adduser spamd --disabled-login- 查看用户(详细信息): cat /etc/passwd
- 查看用户(仅用户名): cat /etc/passwd | cut -d: -f1
 
- 查看用户(详细信息): 
- 配置 spamassassin:- vim /etc/default/spamassassin
- 确保配置:ENABLED=1 SAHOME="/var/log/spamassassin/" OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir /home/spamd/ -s /home/spamd/spamd.log" PIDFILE="/var/run/spamd.pid" CRON=1
 
- 配置 local.cf(用于添加规则):- vim /etc/spamassassin/local.cf
- 确保开启配置:rewrite_header Subject ***** SPAM _SCORE_ ***** required_score 5.0 use_bayes 1 bayes_auto_learn 1
 
- 配置 master.cf:- vim /etc/postfix/master.cf
- 添加如下配置至如图所示:-o content_filter=spamassassin spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} 
- 确保 smtp/smtps/submission下均添加如下参数:- -o content_filter=spamassassin
 
 
- 重新启动 Postfix 和 SpamAssassin: - sudo service postfix restart
- sudo service spamassassin restart
 
② 配置 OpenDKIM
- 安装: sudo apt install opendkim opendkim-tools
- 配置 opendkim.conf:- vim /etc/opendkim.conf
- 添加以下配置(域名改成自己的):Domain 000.top KeyFile /etc/dkimkeys/dkim.key Selector dkim SOCKET inet:8891@localhost
 
- 配置 opendkim:- vim /etc/default/opendkim
- 添加配置: - SOCKET="inet:8891@localhost"
 
 
- 生成 DKIM 密钥对(DKIM :域名密钥识别邮件标准(DomainKeys Identified Mail),电子邮件验证标准) - 执行命令(域名换成自己的,生成的 dkim.private和dkim.txt在根目录下):- sudo opendkim-genkey -t -s dkim -d 000.top
 
- 移动 dkim.private:- sudo mv dkim.private /etc/dkimkeys/
 
- 切换路径并更改所有者 - cd /etc/dkimkeys/
- sudo chown opendkim:opendkim dkim.private
 
- 修改文件名(不然重启时会报错): - mv dkim.private dkim.key
 
 
- 执行命令(域名换成自己的,生成的 
- 配置 main.cf(Postfix):- vim /etc/postfix/main.cf
- 添加如下配置:#DKIM smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891 milter_protocol = 2 milter_default_action = accept
 
- 重启服务: - sudo service opendkim restart
- sudo service postfix restart
 
- 将根目录之前生成的 dkim.txt中括号中的内容去除双引号和换行,作为 TXT 记录添加到域名中
| Hostname | Type | Text | 
|---|---|---|
| dkim._domainkey | TXT | v=DKIM1; h=sha256; k=rsa; t=y;p=… | 
- 都弄完以后又测了一遍,看起来效果还不是很好 (T——T),不过往QQ发的邮件已经可以被收到了:
  
参考教程:
- ubuntu20 安装和配置mysql8.0.23
- Ubuntu用Postfix+Dovecot搭建优秀的邮件服务器
- 申请免费ssl证书
- Ubuntu免费ssl证书(Let’s Encrypt)配置
- Ubuntu Nginx 安装与基本配置
- 在ubuntu上使用git克隆github上的项目
- 如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示
- 【Tomcat】ubuntu系统安装Tomcat
- 全民https时代,Let’s Encrypt免费SSL证书的申请及使用(Tomcat版)
- certbot-auto不再支持所有的操作系统,新的ssl证书方法
- Let’s Encrypt:Your system is not supported by certbot-auto anymore解决方法(证书更新)
- Ubuntu中snap包的安装,删除,更新使用入门教程
- https免费证书(certbot)
- 访问后台出现重定向次数过多该怎么办?-建站需知
- 关于iredmail邮箱系统不使用ssl校验的配置
- Ubuntu下为postfix配置DKIM
- How to Setup SpamAssassin With Postfix On Ubuntu 16.04
官网以及官方文档:
- Postfix主页(德语)
- Postfix文档
- Postfix TLS 支持
- Postfix基本配置
总结
本文记录了如何在一台 Ubuntu 服务器上搭建邮件服务器,主要是安装和配置 Postfix 和 Dovecot,以及 SpamAssassin 和 OpenDKIM 的安装和配置。同时也介绍了如何申请 SSL 证书以及其他服务的相关配置。
相关文章:
 
Ubuntu 申请 SSL证书并搭建邮件服务器
文章目录 Log 一、域名连接到泰坦(Titan)电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书(Lets Encrypt)④ 配置 pos…...
 
视频监控方案设计:EasyCVR视频智能监管系统方案技术特点与应用
随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…...
pyspark.sql.types 中的类型有哪些
对 pyspark.sql.types 中的类型做个记录 1、首先正常使用的时候,我们需要引用他们: from pyspark.sql.types import MapType,StringType # 或者 from pyspark.sql.types import *PySpark SQL TYPES是PySpark模型中的一个类,用于定义PySpark数…...
 
开源CRM客户管理系统-FeelCRM
FeelCRM客户管理系统 开源项目介绍 FeelCRM客户管理系统,符合中小企业业务流程;支持线索管理、客户管理、商机管理、合同管理、审核管理等多个模块;希望能为广大中小企业以及开发者们提供一个更多的可能性;本版本是我公司跨语言…...
Linux创建新分区挂载后普通用户没有读写权限
Linux创建新分区挂载后普通用户没有读写权限 为了使用更大的空间,楼主按照 ubuntu 16.04 硬盘分区,挂载,硬盘分区方案 这个教程新建硬盘分区给普通用户挂载后,发现普通用户没有权限对挂载的文件夹进行读写。 导致无论是创建文…...
 
清越 peropure·AI 国内版ChatGP新功能介绍
当OpenAI发布ChatGPT的时候,没有人会意识到,新一代人工智能浪潮将给人类社会带来一场眩晕式变革。其中以ChatGPT为代表的AIGC技术加速成为AI领域的热门发展方向,推动着AI时代的前行发展。面对技术浪潮,清越科技(PeroPure)立足多样化生活场景、精准把握用户实际需求,持续精确Fin…...
 
力扣1027. 最长等差数列
动态规划 思路: 可以参考力扣1218. 最长定差子序列目前不清楚公差,可以将序列最大最小值找到,公差的范围是 [-(max - min), (max - min)],按公差递增迭代遍历求出最长等差数列; class Solution { public:int longest…...
GraphicsMagick 的 OpenCL 开发记录(二十三)
文章目录 ImageMagick和GraphicsMagick函数及宏对照表 <2022-04-14 周四> ImageMagick和GraphicsMagick函数及宏对照表 在开发过程中收集了这两个项目中的一些相同或相似功能的函数或者宏定义,希望对大家有所帮助,如下: TypeImageMa…...
 
通过Android Logcat分析firebase崩溃
参考:UnityIL2CPP包Crash闪退利用Android Logcat还原符号表堆栈日志 - 简书 一、安装Android Logcat插件 1、新建空白unity工程,打开PackageManager窗口,菜单栏Window/PackageManager 2、PackageManager中安装Android Logcat日志工具 3、安…...
 
【AI大模型】WikiChat超越GPT-4:在模拟对话中事实准确率提升55%终极秘密
WikiChat,这个名字仿佛蕴含了无尽的智慧和奥秘。它不仅是一个基于人工智能和自然语言处理技术的聊天机器人,更是一个能够与用户进行深度交流的智能伙伴。它的五个突出特点:高度准确、减少幻觉、对话性强、适应性强和高效性能,使得…...
 
【C语言刷题系列】水仙花数的打印及进阶
1.水仙花数问题 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number) 水仙花数是指一个 3 位数&a…...
 
ICSpector:一款功能强大的微软开源工业PLC安全取证框架
关于ICSpector ICSpector是一款功能强大的开源工业PLC安全取证框架,该工具由微软的研究人员负责开发和维护,可以帮助广大研究人员轻松分析工业PLC元数据和项目文件。 ICSpector提供了方便的方式来扫描PLC并识别ICS环境中的可疑痕迹,可以用于…...
 
HCIA——29HTTP、万维网、HTML、PPP、ICMP;万维网的工作过程;HTTP 的特点HTTP 的报文结构的选择、解答
学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…...
面试经典题---3.无重复字符的最长子串
3.无重复字符的最长子串 我的解法: 滑动窗口: 维护一个[left, right)的滑动窗口,其中[left, right - 1]都是不重复子串;每轮while循环都计算一个滑动窗口的无重复子串长度len,每轮也让right后移一步; 内部…...
 
使用Robot Framework实现多平台自动化测试
基于Robot Framework、Jenkins、Appium、Selenium、Requests、AutoIt等开源框架和技术,成功打造了通用自动化测试持续集成管理平台(以下简称“平台”),显著提高了测试质量和测试用例的执行效率。 01、设计目标 平台通用且支持不…...
 
Java基础进阶02-xml
目录 一、XML(可拓展标记语言) 1.学习网站: 2.作用 3.XML标签 4.XML语法 5.解析XML (1)常见解析思想DOM 6.常见的解析工具 7.DOM4j的使用 8.文档约束 (1)概述 (2…...
《开始使用PyQT》 第01章 PyQT入门 03 用户界面介绍
03 用户界面介绍 《开始使用PyQT》 第01章 PyQT入门 03 用户界面介绍 The user interface (UI) has become a key part of our everyday lives, becoming the intermediary between us and our ever-growing number of machines. A UI is designed to facilitate in human-co…...
HTML-列表
列表 abbr: li : list item ol : orderd list ul : unordered list dl : definition list dt : definition title dd : definition description 1.有序列表(order list) 概念:有顺序或侧重顺序的列表 <h2>要把大象放冰箱总共分几步</h2> &…...
 
OceanBase创建租户
租户是集群之上的递进概念,OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念,是 Zone 和节点的集合,租户则偏向于资源层面的逻辑概念,是在物理节点上划分的资源单元,可以指定其资源规格,包括…...
 
Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?
文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题,下面这道题目大家应该不陌生: Integer i 127; Integer j 127;Integer m 128; Integer n 128;System.out.println(i j); // 输出为 true System.o…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
 
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
 
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
 
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
 
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
 
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
 
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
 
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
