PostFix+Dovecot 部署邮件系统

news2024/10/5 15:28:17

Postfix 是一种电子邮件服务器是一个开放源代码的软件. Postfix 是MTA邮件传输代理软件.是sendmail提供替代品的一个尝试,在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件,Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性.

生活中常用的邮件服务器

Sendmail: 资格最古老,运行稳定,但安全性欠佳.
Postfix: 采用模块化设计,在投递效率、稳定性、性能及安全性方面表现优秀,与sendmail保持足够的兼容性.
Qmail: 采用模块化设计,速度快、执行效率高,配置稍微复杂点.
Outook:是一个客户端代理.
FoxMail:也是客户端代理.

PostFix的特点

1.PostFix是免费,开源的,并且兼容sendmail
2.性能好,大约比sendmail快三倍,一台运行postfix的台式pc每天可收发上百万邮件.
3.安全性,PostFix具有多层防御结构,可以有效地抵御恶意入侵者,可以运行在较低的权限之下.
4.灵活性好,postfix是由超过一打的小程序组成的,每个程序完成特定功能.可以通过配置设置每个程序的运行参数.
5.健壮稳定,postfix被设计成在重负荷之下仍然可以正常工作.当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目.当处理的邮件数目增长时,Postfix运行的进程不会跟着增加.

PostFix工作流程图解

1.客户端通过Outlook或网页客户端软件,向邮件服务器发送一封邮件,首先邮件服务器会检查是发往本域,还是发往其他域.

2.如果发送到本域直接存放到Mailbox中,另外一个用户上线,需要收取这封邮件,借助dovecot软件,通过dovecot进入数据库验证身份,验证通过以后,就可以通过MRA调用POP3或者IMAP4的协议,进入邮箱收取邮件,并且将邮件转发给用户.

3.如果发送到其他域,转发之前验证用户身份,是否要为其转发邮件,验证的时候是用到了SASL函数库,用户的信息是放到了数据库中,此时我们需要一个中间层authlib,通过authlib替SASL函数库向数据库进行验证,做"发信认证",认证通过允许转发,验证不通过拒绝转发.

4.通过浏览器访问邮件服务器(EXtmall/FoxMali),转发到其他域,放到邮箱,到数据库验证.

关于邮件系统中的角色

MUA:邮件用户代理 (sendmail qmail postfix)
MTA:邮件传输代理 (outlook)
MDA:邮件分发代理 (maildrop)
MRA:邮件检索代理 (dovecot)

postfix: 实现邮件发送服务器的角色.
dovecot: 作为邮件接收服务器的角色.
extmail: 实现利用web界面收发信件.
extman: 用户注册同个extman的页面.
mysql: 存放用户的账户信息.
cyrus-sasl,courier-authlib: 实现用户的身份验证.

邮件应用使用协议

1.SMTP,简单邮件传输协议,TCP 25端口,加密时使用TCP 465端口,(发送邮件),客户端向其他服务器发送邮件或者服务器向其他服务器转发邮件,发送方使用的都是SMTP协议.
2.POP3,第3版邮局协议,TCP 110端口,加密时使用TCP 995端口,(收邮件) 收取邮件的时候,先将服务器的邮件下载到本地,所有的操作都是在本地完成.
3.IMAP4,第4版互联网消息访问协议,TCP 143端口,加密时使用 993端口,(比POP3灵活)接收邮件,客户端和服务器端交互了以后,在服务器端处理,好处能实现更多的功能,例如查看邮件的信息,但是消耗的系统的资越高.

服务器接收邮件的过程

在开始讲述本例的内容之前,我们先来看看Postfix+Dovecot+MySQL是如何相互协作以实现邮件服务器的各项功能。我们假设 张三通过oschina.net的邮箱zhangsan@oschina.net发送一份邮件给 李四lisi@mydomain.com,则服务器接收邮件的过程大致如下图所示:

1.zhangsan@oschina.net发送邮件到lisi@mydomain.com
2.oschina.net服务器会通过DNS查询mydomain.com的MX记录并找到Postfix所在的服务器
3.邮件被发送给Postfix
4.Postfix转向MySQL求助,以查询mydomain.com是不是需要处理的域名
5.MySQL返回确认信息给Postfix
6.Postfix将接受到的邮件投递给Dovecot的LMTP服务以便做处理
7.Dovecot将邮件内容保存到lisi@mydomain.com用户对应的磁盘路径

用户查收邮件的过程

上述例子中我们看到了服务器接收邮件的过程,接下来我们看看,当大家通过用户名密码登录邮箱查看邮件时,会发生什么事情:

1.邮件客户端 to Dovecot:尊敬的Dovecot大人,您好!我阔以建立一个IMAP加密连接吗?
2.Dovecot to 邮件客户端:当然阔以。这是我的SSL证书,请您告诉我帐号和密码!
3.邮件客户端 to Dovecot:好滴!这是我的用户名和密码,千万不要告诉别人哦!
4.Dovecot to MySQL:Hi 美女!请问下,这个用户名和密码是正确的嘛?
5.MySQL to Dovecot:好的,请稍后!呃……这个用户名和密码是正确的哦!
6.Dovecot打开存放在本地磁盘/var/mail/mydomain.com/llisi的mailbox
7.Dovecot获取到最新的邮件及其他相关信息
8.Dovecot将邮件及其相关的其他信息通过IMAP协议发送给客户端

用户发送邮件的过程

查收了最新的邮件之后,李四lisi@mydomain.com发现张三给他发来了邮件。现在,李四回复一封邮件给张三,会发生什么事情:

1.邮件客户端 to Postfix:尊敬的Postfix大人,您好!我阔以建立一个安全的SMTP连接嘛?
2.Postfix to 邮件客户端:说人话!可以就是可以,干嘛要说「阔以」啊!你丫贱啊,找抽啊!想建立SMTP连接可以,不过要加密。这是我的SSL证书,告诉我你的帐号和密码!
3.邮件客户端 to Postfix:对不起,大人,我错鸟!这是我的帐号和密码,不要告诉别人哦!
4.Postfix to Dovecot:Hi 帅哥,帮我查一下这个帐号和密码!
5.Dovecot to MySQL:Hi 美女,这个帐号和密码是正确的呢?!还是正确的呢?!还是……
6.MySQL to Dovecot:好啦,你乖啦!我查过啦,这个帐号密码是正确的啦!表卖萌哦,Dovecot君!
7.Dovecot to Postfix:大锅,则个帐号密码斯正缺滴!
8.Postfix to 邮件客户端:贱人,过来!你给的帐号密码是正确的,允许你发送邮件!
9.邮件客户端将编写好的邮件通过SMTP协议发送给Postfix
10.Postfix将收到的邮件转发给对方

面试技巧

SMTP 简单邮件传输协议(发邮件)TCP 25端口,加密时使用TCP 465端口
POP3 第三版邮局协议(收邮件)TCP 110 端口,加密时使用 TCP 995端口
IMAP4 第四版互联网邮件访问协议(收邮件)TCP 143端口,加密时使用TCP 993端口

配置DNS域名解析

首先我们需要配置bind为客户端提供dns域名解析

1.安装bind,为客户提供解析服务

[root@localhost ~]# yum install -y bind
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Server                                                                            00:00:00
Resolving Dependencies
--> Running transaction check
---> Package bind.x86_64 32:9.9.4-61.el7 will be installed
--> Processing Dependency: bind-libs = 32:9.9.4-61.el7
......
Installed:
  bind.x86_64 32:9.9.4-61.el7
Dependency Installed:
  bind-libs.x86_64 32:9.9.4-61.el7
Complete!
[root@localhost ~]#

2.修改dns主配置文件,区域文件和域名配置文件等

[root@localhost ~]# vim /etc/named.conf

 12 options {
 13         listen-on port 53 { any; };                                  #修改IPV4的侦听端口
 14         listen-on-v6 port 53 { ::any; };                             #修改IPV6的侦听端口
 15         directory       "/var/named";
 16         dump-file       "/var/named/data/cache_dump.db";
 17         statistics-file "/var/named/data/named_stats.txt";
 18         memstatistics-file "/var/named/data/named_mem_stats.txt";
 19         allow-query     { any; };                                    #允许迭代
 20
 21         /*

3.修改named.rfc1912.zones区域配置文件,或者写在named.conf的底部也可以

[root@localhost ~]# vim /etc/named.rfc1912.zones

 42
 43 zone "lyshark.com" IN {                                         #添加此处区域文件
 44         type master;                                            #声明为主dns
 45         file "lyshark.com.zone";                                #声明区域配置文件名称
 46         allow-update {none;};                                   #是否迭代
 47 };

4.拷贝默认区域配置文件,修改成lyshark.com.zone并做邮件交换记录配置

[root@localhost ~]# cd /var/named/
[root@localhost named]#
[root@localhost named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]#
[root@localhost named]# cp -a named.localhost lyshark.com.zone
[root@localhost named]#
[root@localhost named]# ls
data  dynamic  lyshark.com.zone  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]#
[root@localhost named]# vim lyshark.com.zone

  1 $TTL 1D
  2 @       IN SOA  dns.lyshark.com. root.lyshark.com. (
  3                                         0       ; serial
  4                                         1D      ; refresh
  5                                         1H      ; retry
  6                                         1W      ; expire
  7                                         3H )    ; minimum
  8         NS      dns.lyshark.com.
  9         MX 3    mail.lyshark.com.
 10 dns     A       127.0.0.1
 11 mail    A       192.168.1.20
 12         AAAA    ::1

5.重启named解析服务,并设置成开机自启动

[root@localhost named]# systemctl restart named
[root@localhost named]# systemctl enable named

6.此处在其他电脑配置好,dns解析地址,解析到本机,并测试是否能解析

C:\Users\LyShark>ping 192.168.1.20

正在 Ping 192.168.1.20 具有 32 字节的数据:
来自 192.168.1.20 的回复: 字节=32 时间<1ms TTL=64

C:\Users\LyShark>nslookup mail.lyshark.com
服务器:  UnKnown
Address:  192.168.1.20

名称:    mail.lyshark.com
Addresses:  ::1
          192.168.1.20

C:\Users\LyShark>

配置PostFix服务程序

postfix是由IBM赞助研发的一款免费开源的电子邮件服务程序,它能够很好的兼容sendmail,可以很方便的将sendmail用户迁移到postfix服务上,postfix服务的收发邮件能力强于sendmail,而且能够自动,增加,减少进程的数量来保证邮件服务器的高性能运转,postfix有许多小模块组成,方便了功能的添加,拓展和删除,提高了可用性,用户可以灵活搭配使用.

1.安装postfix服务程序,rhel7系统默认集成,这里只做演示

[root@localhost ~]# yum install -y postfix

Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package 2:postfix-2.10.1-6.el7.x86_64 already installed and latest version
Nothing to do

2.配置邮局系统的主机名,在第76行,一个名为myhostname的变量,用来保存服务器主机名

[root@localhost ~]# vim /etc/postfix/main.cf

 68 # INTERNET HOST AND DOMAIN NAMES
 69 #
 70 # The myhostname parameter specifies the internet hostname of this
 71 # mail system. The default is to use the fully-qualified domain name
 72 # from gethostname(). $myhostname is used as a default value for many
 73 # other configuration parameters.
 74 #
 75 #myhostname = host.domain.tld
 76 myhostname = mail.lyshark.com                       #解除注释,定义服务器主机名
 77

3.配置邮局系统的域名,在第83行,一个名为mydomain的变量,用来定义邮件域

[root@localhost ~]# vim /etc/postfix/main.cf

 78 # The mydomain parameter specifies the local internet domain name.
 79 # The default is to use $myhostname minus the first component.
 80 # $mydomain is used as a default value for many other configuration
 81 # parameters.
 82 #
 83 mydomain = lyshark.com                              #解除注释,指定邮件域
 84

4.配置本机发出的域名称,在第99行,一个名为myorigin的变量,用来定义邮件域

[root@localhost ~]# vim /etc/postfix/main.cf

 94 # For the sake of consistency between sender and recipient addresses,
 95 # myorigin also specifies the default domain name that is appended
 96 # to recipient addresses that have no @domain part.
 97 #
 98 myorigin = $myhostname                             #解除注释,设置允许发信的用户的邮件域
 99 myorigin = $mydomain                               #解除注释,例:admin@lyshark.com
100

5.配置侦听网卡接口,在第116行,一个名为inet_interfaces的变量,用来定义网卡接口

[root@localhost ~]# vim /etc/postfix/main.cf

108 # See also the proxy_interfaces parameter, for network addresses that
109 # are forwarded to us via a proxy or network address translator.
110 #
111 # Note: you need to stop/start Postfix when this parameter changes.
112 #
113 inet_interfaces = all                             #解除注释,设置所有IP都提供邮件服务
114 #inet_interfaces = $myhostname
115 #inet_interfaces = $myhostname, localhost
116 #inet_interfaces = localhost                      #注释掉
117

6.配置接收邮件的主机名或域名,在第164行,一个名为mydestination的变量,用来定义可接收邮件的主机名或域名列表,这里可以直接调用前面的两个变量myhostname和mydomain变量(如果不想调用变量,也可直接调用变量中的值)

[root@localhost ~]# vim /etc/postfix/main.cf

156 # Specify a list of host or domain names, /file/name or type:table
157 # patterns, separated by commas and/or whitespace. A /file/name
158 # pattern is replaced by its contents; a type:table is matched when
159 # a name matches a lookup key (the right-hand side is ignored).
160 # Continue long lines by starting the next line with whitespace.
161 #
162 # See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
163 #
164 #mydestination = $myhostname, localhost.$mydomain, localhost             #注释掉,设置取出那些邮件
165 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain   #解除注释
166 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
167 #       mail.$mydomain, www.$mydomain, ftp.$mydomain

7.配置邮件存储位置,在第619行,一个名为home_mailbox的变量,用来定义邮件保存位置

[root@localhost ~]# vim /etc/postfix/main.cf

413 # The home_mailbox parameter specifies the optional pathname of a
414 # mailbox file relative to a user's home directory. The default
415 # mailbox file is /var/spool/mail/user or /var/mail/user.  Specify
416 # "Maildir/" for qmail-style delivery (the / is required).
417 #
418 #home_mailbox = Mailbox
419 home_mailbox = Maildir/                            #解除注释
420

8.最后,创建一个邮件测试账号admin,重启postfix服务,并设置成开机自启动

[root@localhost ~]# useradd -s /sbin/nologin admin
[root@localhost ~]# passwd admin
Changing password for user admin.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#
[root@localhost ~]# systemctl restart postfix
[root@localhost ~]# systemctl enable postfix

配置Dovecot服务程序

dovecot是一款能够为linux系统提供IMAP和POP3电子邮件服务的开源服务程序,安全性极高,配置简单,执行效率高,而且占用服务器资源极低,是一款很好的收件服务器.

1.通过yum安装dovecot服务程序的软件包,和依赖

[root@localhost ~]# yum install -y dovecot dovecot-devel clucene-core
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager .
Package 1:dovecot-2.2.10-8.el7.x86_64 already installed and latest version
Package clucene-core-2.3.3.4-11.el7.x86_64 already installed and latest version
Nothing to do

2.配置dovecot服务,在第24行,把服务的电子邮件协议改为 imap,pop3和lmtp,在这一行下面添加 disable_plaintext_auth 允许用户明文使用邮件系统.

[root@localhost ~]# vim /etc/dovecot/dovecot.conf

 16 # Default values are shown for each setting, it's not required to uncomment
 17 # those. These are exceptions to this though: No sections (e.g. namespace {})
 18 # or plugin settings are added by default, they're listed only as examples.
 19 # Paths are also just examples with the real defaults being based on configure
 20 # options. The paths listed here are for configure --prefix=/usr
 21 # --sysconfdir=/etc --localstatedir=/var
 22
 23 # Protocols we want to be serving.
 24 protocols = imap pop3 lmtp                   #取消注释,开启验证类型
 25 disable_plaintext_auth = no                  #添加字段,开启允许使用明文传输

3.配置允许登陆的网段,在第48行,设置允许来自于指定网段的主机使用,如果想任何人则无需修改本参数

[root@localhost ~]# vim /etc/dovecot/dovecot.conf

 45 # Space separated list of trusted network ranges. Connections from these
 46 # IPs are allowed to override their IP addresses and ports (for logging and
 47 # for authentication checks). disable_plaintext_auth is also ignored for
 48 # these networks. Typically you'd specify your IMAP proxy servers here.
 49 login_trusted_networks = 192.168.1.0/24         #允许指定网段使用,屏蔽掉默认all
 50

4.配置邮箱位置,子配置文件中,在第24行

[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf

 22 # See doc/wiki/Variables.txt for full list. Some examples:
 23 #
 24 mail_location = maildir:~/Maildir                         #解除注释
 25 #   mail_location = mbox:~/mail:INBOX=/var/mail/%u
 26 #   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n

5.重启收件服务器,并设置开机自启动

[root@localhost ~]# systemctl restart dovecot
[root@localhost ~]# systemctl enable dovecot

配置SSL加密传输

由于上面的过程配置的邮件服务器使用的是明文传输,无法将其用于生产环境,下面的步骤将开启邮件服务器的SSL加密模式,让其可以在生产环境中使用

1.生成SSL密钥文件,并自行放入合适的位置

[root@localhost ~]# openssl genrsa -des3 -out server.key 1024
[root@localhost ~]# openssl req -new -key server.key -out server.csr
[root@localhost ~]# openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out servernew.crt

[root@localhost ~]# ls
server.csr  server.key  servernew.crt
[root@localhost ~]# cp -a * /etc/pki/CA/certs/
[root@localhost ~]# ls /etc/pki/CA/certs/
server.csr  server.key  servernew.crt

2.修改PostFix配置文件,在文件中修改以下几个位置,启用SSL加密参数

[root@localhost ~]# vim /etc/postfix/main.cf

681 # SSL CRT 添加如下配置到末尾
682
683 smtpd_use_tls = yes
684 smtpd_tls_cert_file = /etc/pki/CA/certs/servernew.crt
685 smtpd_tls_key_file = /etc/pki/CA/certs/server.key
686 smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

[root@localhost ~]# vim /etc/postfix/master.cf

 25 #  -o milter_macro_daemon_name=ORIGINATING
 26 smtps     inet  n       -       n       -       -       smtpd
 27 #  -o syslog_name=postfix/smtps
 28 -o smtpd_tls_wrappermode=yes

3.接着修改dovecot额配置文件,指定开启SSL模式,并指定证书位置.

[root@localhost ~]# vim /etc/dovecot/conf.d/10-ssl.conf
  5 # SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
  6 # disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
  7 # plain imap and pop3 are still allowed for local connections
  8 ssl = yes
  9
 10 # PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
 11 # dropping root privileges, so keep the key file unreadable by anyone but
 12 # root. Included doc/mkcert.sh can be used to easily generate self-signed
 13 # certificate, just make sure to update the domains in dovecot-openssl.cnf
 14 ssl_cert = </etc/pki/CA/certs/dovecot.pem
 15 ssl_key = </etc/pki/CA/private/dovecot.pem

4.重启PostFix和Dovecot服务,并设置开机自启动.

[root@localhost ~]# systemctl restart postfix
[root@localhost ~]# systemctl restart dovecot
[root@localhost ~]# systemctl enable postfix
[root@localhost ~]# systemctl enable dovecot

5.如果iptables在开启状态,那么设置iptables开放SMTPS/POP3S/IMAPS的端口.

[root@localhost ~]# iptables -I INPUT 1 -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT 
[root@localhost ~]# iptables -I INPUT 2 -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT 
[root@localhost ~]# iptables -I INPUT 3 -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT

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

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

相关文章

【bp靶场portswigger-服务端2】身份认证-16个实验(全)

目录 一、身份验证定义 1、三个身份验证因素 2、身份验证和授权 3、身份验证漏洞的产生 4、实验的字典 二、基于密码的登录中的漏洞 1、强制策略 2、用户枚举 3、有缺陷的强力保护 实验1&#xff1a;通过不同响应的用户名枚举 实验4&#xff1a;通过细微不同的响应进…

BPF学习笔记(六)-- 使用bpf实现xdp的例子

本篇文章参考《Linux Observability with BPF》中第7章的例子&#xff0c;主要功能是借助于ip命令作为前端&#xff0c;对其他主机访问tcp的8000端口进行限制&#xff0c;这里需要使用较新版本的iproute2软件工具包. 1. 下载编译iproute2 工具包&#xff0c;使用最新的ip命令…

gRPC学习

首先什么了解什么是RPC? 不同于 TCP 和 HTTP&#xff0c;TCP 和 HTTP 是网络传输协议&#xff0c;而 RPC 是一种设计、实现框架&#xff0c;通讯协议只是其中一部分&#xff0c;RPC 不仅要解决协议通讯的问题&#xff0c;还有序列化和反序列化&#xff0c;以及消息通知。 一…

IDEA的使用技巧积累

本文主要是记录一些在使用IDEA过程中遇到的一些问题解决方法、以及快捷键等 添加框架支持 打开模块设置 (文件—>项目结构也是同理) 主要用于配置模块&#xff0c;例如web&#xff0c;springboot模块 设置 主要设置maven的一些信息 CtrlShiftF (java代码审计基础中出现…

WebSocket的基本使用

目录 为何使用websocket 1.后端搭建 2.搭建webSocket前后分离 1.配置跨域过滤器与初始化websocket 2.定义websocket服务 3.定义控制器进行测试webSocket向前端发送消息 2.前端准备 3.进行测试 向后端发送消息测试 后端向前端发送消息测试 为何使用websocket 在浏览器…

小型云台机械手红外搬运功能的实现

1. 功能说明 在小型云台机械手前方安装近红外传感器&#xff0c;如果近红外触发&#xff08;检测到有货物&#xff09;&#xff0c;机械手开始抓取货物&#xff0c;并将货物从一个区域搬运到另一个指定区域&#xff1b;否则&#xff0c;机械臂不动作。 2. 使用样机 本实验使用…

【LeetCode】从前序与中序遍历序列构造二叉树 [M](二叉树重构)

105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1&…

ASEMI整流桥MB10S,DB207S和ABS210有什么区别

编辑-Z ASEMI整流桥MB10S&#xff0c;DB207S和ABS210有什么区别&#xff1f;这几个型号从外观看都是很相似的&#xff0c;那么他们参数有什么不一样呢&#xff1f; MB10S参数&#xff1a; 型号&#xff1a;MB10S 封装&#xff1a;MBS-4 最大重复峰值反向电压&#xff08;VR…

缓冲区Buffer类的设计(参考Muduo实现)

Buffer的功能需求&#xff1a; Buffer类的设计目的是再创造一层应用层缓冲区。 其对外表现为一块连续的内存(char* p, int len)&#xff0c;以方便客户代码的编写。 size() 可以自动增长&#xf…

Java如何自定义一个变长数组?

文章目录思路分析实现代码测试结果首先需要声明的是&#xff0c; Java本身是提供了变长数组的&#xff0c;即 ArrayList。那么自定义一个变长数组有啥用&#xff1f;其实没啥用或者说用处不大&#xff0c;主要就是为了了解下变长数组的设计理念而已。实际工作中直接使用 ArrayL…

文华财经期货背离信号准确率高指标公式,单边趋势行情增仓上行多空共振策略

由“短线震荡波段王”和“三柱共振-高把握”指标合成 功能 : 1.红绿小波段黄蓝中波段粉青大波段 2.红绿中小波段 3.顶背底背提示 4.金叉死叉提示 5.多和空提示-金叉死叉改写 优点:宽幅震荡和窄幅震荡 弊端:单边行情(可结合多空趋势主图规避) 功能: 1.红绿波段 2.大中量仓-单…

MySQL索引详解

目录 1、为什么要有索引&#xff1f; 2、预备知识 3、为何IO交互要是 Page&#xff1f; 4、如何理解Page以及索引理解 5、索引操作 <1> 创建主键索引 <2> 创建唯一索引 <3> 普通索引的创建 <4> 全文索引的创建 <5> 查询索引 <5>…

Python图像识别实战(五):卷积神经网络CNN模型图像二分类预测结果评价(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

BOOT进程控制模式与故障排错

1. BOOT reboot and shutdown—使用systemctl 命令。 systemctl poweroff–关机 systemctl reboot --重启 systemctl halt 禁用CPU 在7版本中使用systemctl 工具。 选择systemd target graphical.target 桌面图形模式 multi-user.target 多用户模式–命令行 rescue.target 救援…

Linux驱动开发基础__总线设备驱动模型

目录 1 驱动编写的三种方法 1.1 传统写法 1.2 总线设备驱动模型 1.3 设备树 2 在 Linux 中实现“分离”&#xff1a;Bus/Dev/Drv 模型 3 匹配原则 4 函数调用关系 1 驱动编写的三种方法 1.1 传统写法 1.2 总线设备驱动模型 引入platform_device、platform_driver&…

二叉数题型2

目录 二叉搜索树的众数 二叉树的最近公共祖先 修剪二叉树 二叉搜索树的众数 问题描述&#xff1a; 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#…

PROJ 9.1.1源码下载编译(Win10+VS2022)

目录PROJ什么是PROJPROJ下载方式资源结构编译PROJ打包编译成功的库PROJ 什么是PROJ Proj是一个免费的GIS工具。 它专注于地图投影的表达&#xff0c;以及转换。采用一种非常简单明了的投影表达PROJ&#xff0c;比其它的投影定义简单&#xff0c;但很明显。很容易就能看到各种…

无人机倾斜摄影测量技术的优势有哪些?

传统的地理信息获取工作一般是通过人工测量的方式进行&#xff0c;但这样的测量方式具有工作强度大、成本高等问题。随着现代科技的不断发展&#xff0c;测绘行业对地理信息数据的准确性、时效性要求也越来越高&#xff0c;人工成本和时间成本也为行业带来了巨大的压力。因此&a…

GIT回退到指定版本的两种方法(reset/revert)

实现多人合作程序开发的过程中&#xff0c;我们有时会出现错误提交的情况&#xff0c;此时我们希望能撤销提交操作&#xff0c;让程序回到提交前的样子&#xff0c;本文总结了两种解决方法&#xff1a;reset、revert。 命令特点reset该命令会强行覆盖当前版本和要回退的版本之…

ArcGIS基础实验操作100例--实验15设置字段属性域

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验15 设置字段属性域 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&a…