Linux 邮件服务
发布日期:2021-11-09 11:16:46 浏览次数:37 分类:技术文章

本文共 9602 字,大约阅读时间需要 32 分钟。

三个要点
1.smtp协议
2.搭建本地邮件服务器
3.使用外部邮件服务器 实现邮件功能
1.smtp协议 
         SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
         SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 
  增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

        SMTP 在 TCP 协议 25 端口监听连接请求。


      此外还有两个协议需要了解
IMAP协议、
POP3协议
      简单地说,SMTP管‘发’, POP3/IMAP管‘收’。
IMAP协议

        IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的

        它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作

  POP3协议

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

 实例:

网易YEAH 邮箱相关服务器信息:

 邮件服务器名称 服务器地址  端口号
  POP3服务器 pop.yeah.net  110
 SMTP服务器 smtp.yeah.net  25
 IMAP服务器 imap.yeah.net  143
下面使用telnet 演示一下 smtp 交互过程
$telnet smtp.163. com 25                      
发送连接
       220 163.com Anti-spam GT for Coremail System (163com[20141201])     
回应220
 
服务就绪
helo 66                                                 
 HELO命令标记自己的身份   
      250 OK                                           
回应250 请求邮件动作正确,完成
auth login                                               登陆验证
      334 dXNlcm5hbWU6                    要求输入username:
这里输入USERbase64加密后的用户名
      334 UGFzc3dvcmQ6                    
要求输入Password:
这里输入
PASSbase64加密后的密码
      
235 Authentication successful             
回应235 :认证通过

MAILFROM:XXX@163 .COM          表示发送者的邮件地址

       250 Mail OK

RCPTTO:XXX@163 .COM              标识接收者的邮件地址

        250 Mail OK

DATA                              

        354 End data with                            邮件的数据     

        
  .                                                     
  以一个"."开始的行作为数据部分的结束标识

2.搭建本地邮件服务器
      首先还是三个概念
        Internet的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的Outlook,Foxmai,linux下的mail、mailx、nail  等都是用来收信和发信的,称之为MUA:Mail User Agent,邮件用户代理        
        MUA并非直接将邮件发送至收件人手中,而是通过MTA:Mail Transfer Agent,邮件传输代理代为传递,SendmailPostfix就是扮演MTA的角色。        
        一封邮件从MUA发出后,可能通过一个或多个MTA传递,最终到达MDA:Mail Delivery Agent,邮件投递代理,邮件到达MDA后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。

         结合第一部分所讲内容,一封信件发送时从  MUA到MTA,以及MTA到MTA之间使用的协议就是SMTP协议,而收邮件时,MUA到MDA之间使用的协议最常用的是POP3或IMAP

                  发件人:MUA --发送--> MTA -> 若干个MTA... -> MTA -> MDA <--收取-- MUA:收件人

所以我们搭建本地邮件服务器  要提供 邮件传输代理 和 邮件投递代理 两个服务

          目前比较主流的搭配是Sendmail + Dovecot 来提供这两个服务   
  不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail、postfix等等。 例如使用Postfix + Dovecot

      这里主要讲下Sendmail + Dovecot,

2.1     配置域名和网络

          公网ip为1.1.1.1   域名为  yunwei521.top    在dns服务商处添加此解析
           主机记录@   记录类型 MX    记录值 1.1.1.1   这样就可以提供 例如 xxx@yunwei521.top 的邮箱服务。

       如果只是想在内网做一个测试,要先创建一台dns服务器(192.168.1.1),并添加解析 将域名解析到192.168.1.2我们要 创建的邮件服务器 。

2.2 安装软件

      安装邮件服务器
# yum install sendmail sendmail-cf
    安装pop3/imap服务
# yum install dovecot
      安装用户认证
# yum install cyrus-sasl
# yum install cyrus-sasl-md5
# yum install cyrus-sasl-plain
# yum install cyrus-sasl-lib

打开防火墙25(smtp)、143(imap)端口,关闭SELINUX


2.3软件配置

   配置sendmail

进入/etc/mail

# cd /etc/mail


3.1 配置access

# vi /etc/mail/access

通常情况下,Sendmail不会为邮件服务Relay信息,这样可以防止一些有恶意的人利用别人的邮件服务器乱发邮件,所以,access保持默认配置即可

内容如下

Connect:localhost.localdomain           RELAY

Connect:localhost                       RELAY

Connect:127.0.0.1                       RELAY

当然也可针对某段IP或某个IP做修改,如要禁止某个ip发信,则可添加

    192.168.0.2   deny

保存文件后运行下面命令进行编译

    # makemap hash access.db < access


3.2 配置TLS(支持加密连接LLS)

首先生成sendmail.pem文件

# cd /etc/pki/tls/certs

# make sendmail.pem

Country Name (2 letter code) [GB]:ch   

State or Province Name (full name) [Berkshire]:sh

Locality Name (eg, city) [Newbury]:sh

Organization Name (eg, company) [My Company Ltd]:test.

Organizational Unit Name (eg, section) []:IT

Common Name (eg, your name or your server's hostname)[]:
server110
.com

E-mail Address []:test@
server110
.com


3.3 配置sendmail.mc

# vi /etc/mail/sendmail.mc

添加:

define(`confAUTH_OPTIONS', `A p y')dnl

define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl

define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl

define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl

define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl

如果有,则默认被dnl注释,删除前面的dnl注释即可

取消如下两行的注释(删除开头的dnl)

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

修改SMTP的监听IP为 0.0.0.0

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

不要改

dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea’)dnl

这句话!保持注释状态。

上面那句话,网上好多文章都说把Port=submission,改成Port=25,说是强制所有用户在25端口

上做认证。

我不知道sendmail以前的版本是怎么样设置smtp认证的。sendmail8.13不用这么设置,这句话

人家sendmail的意思是:取消注释后,一旦当25号端口被重定向或者被屏蔽,或者在25号端口

打不开的情况下,马上使用587备用端口给用户做认证。

本来人家sendmail就已经打开了25端口(Port=smtp了已经),你却在这里还Port=25,把备用

端口也改成25,这不是让sendmail的sm-client认

证进程和sendmail的主进程抢端口么….

生成配置(如果语法有错误是不能执行的)

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf


4、配置dovecot

# vi /etc/dovecot/dovecot.conf

找到

#protocols = imap pop3 lmtp

将之改为

protocols = imap pop3 lmtp

添加域名

# vi /etc/mail/local-host-names

添加域名如:
server110
.com //每个域名一行


5、配置cyrus sasl

vi /etc/sysconfig/saslauthd

将MECH=pam

改为

MECH=shadow


6、停止postfix

# service postfix stop


7、设置开机启动

# chkconfig sendmail on

# chkconfig dovecot on

# chkconfig saslauthd on


8、重启服务

# service sendmail restart

# service dovecot restart

# service saslauthd restart


9、测试SMTP验证

# useradd mailtest

# passwd mailtest //添加邮箱帐号

# vi /etc/passwd

修改bash为/sbin/nologin,这样添加的用户名就没有了shell,只能收发信而不能登录到服务器运行其他程序

测试

# saslauthd -v

看结果支不支持 pam或shadow

# testsaslauthd -u mailtest -p mailtest

如果显示0: OK “Success.”则表明saslauthd工作正常

查看sendmail队列:mailq

察看邮件系统的状态:mailstats

查看暂时存储邮件:ls -l /var/spool/mail |more

/*****************高级功能,可以不用配置

查看映射用户

# sasldblistusers2

运行 saslpasswd2 添加用户

# saslpasswd2 -u 
server110
.com -c mailtest

# sasldblistusers2

# mailtest@
server110
.com: userPassword

删除用户

# saslpasswd2 -d mailtest@
server110
.com

注意:为什么没有设定foxmail中的smtp服务器需要验证,也可以发送E-mail?

要用OUTLOOK来测试,Foxmail似乎可以自动地进行smtp认证。OUTLOOK在smtp服务器验证失败后,有拒绝提示

工具->;帐户->;邮件->;属性->;服务器->;我的服务器要求身份验证(选上)->;设置->;(选择)登录方式->;帐户名:(用saslpasswd2建立的),密码(用saslpasswd2建立的)->;确定.

另外:接收邮件服务器的帐户名与密码应该是系统里的用户名与密码.

saslauthd -v 看结果支不支持 pam或shadow

smtp验证测试: testsaslauthd -u test -p 123456

sasldblistusers2 检查已经增加的smtp验证用户

saslpasswd2增加smtp验证用户:saslpasswd2 -u cencn.com -c test 


/******************

10、验证Sendmail 的SMTP 认证功能

telnet localhost 25 后输入ehlo localhost 验证Sendmail 的SMTP 认证功能

 [root@localhost CentOS]# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Thu, 6 Jan 2011 11:06:19 +0800

ehlo localhost

250-localhost.localdomain Hello localhost.localdomain [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-AUTH DIGEST-MD5 CRAM-MD5

250-DELIVERBY

250 HELP

quit

221 2.0.0 localhost.localdomain closing connection

Connection closed by foreign host.

telnet localhost 110

 [root@localhost CentOS]# telnet localhost 110

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

+OK Dovecot ready.

quit

+OK Logging out

Connection closed by foreign host.

3.使用外部邮件服务器 实现邮件功能
        bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,配置非常麻烦,而且会带来不必要的资源占用。
        而通过修改配置文件可以使用外部SMTP服务器,可以达到不使用sendmail而用外部的smtp服务器发送邮件的目的。
      关闭sendmial服务,修改mail的配置文件
/etc/mail.rc,增加一下类似N行,指定外部的smtp服务器地址、帐号密码等。
   # vi /etc/mail.rc

  set from=发件地址@qq.com

  set smtp=smtp.qq.com

  set smtp-auth-user=?????

  set smtp-auth-password=????

  set smtp-auth=login

然后通过命令来发送邮件

echo  hello word | mail -s " title" @qq.com

最后讲下mail命令的用法(新版本为mailx)
Usage: mail        
[-iInv
]
[-s subject
]
[-c cc-addr
]
[-b bcc-addr
] to-addr ...
[-- sendmail-options ...
]
mail
[-iInNv
]
-f
[name
]
mail
[-iInNv
]
[-u user
]

      使用mail命令发送邮件,有如下三种方式:

1、直接使用shell当编辑器

mail -s "Hello from mzone.cc by shell" admin@mzone.cc      
hello,this is the content of mail.
welcome to www.mzone.cc

      第一行是输入的命令,-s表示邮件的主题,后面的admin@mzone.cc则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D结束输入,此时会提示你输入Cc地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。

2、使用管道进行邮件发送

echo        
"hello,this is the content of mail.welcome to www.mzone.cc"
| mail
-s
"Hello from mzone.cc by pipe" admin
@mzone.cc

     使用管道直接敲入这行命令即可完成邮件的发送,其中echo后的是邮件正文。

3、使用文件进行邮件发送

mail        
-s
"Hello from mzone.cc by file" admin
@mzone.cc
< mail.txt

      使用上面的命令后,我们就可以把mail.txt文件的内容作为邮件的内容发送给admin@mzone.cc了。

      使用上述三种方式都可以给外部邮箱进行邮件发送,但因为前面2中都是直接在shell中敲入邮件内容,因此无法输入中文,即使我们使用粘贴的方式输入了中文,那么收到的邮件也是乱码的。但第3种方式,我们可以在window下编辑好邮件内容后,放到linux下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。

      因为mail程序本身就是调用sendmail来进行邮件发送的,因此我们可以在mail命令中使用sendmail的参数进行配置,比如我想使用特定的发件人发送邮件,可以使用如下命令:

mail        
-s
"Hello from mzone.cc with sender" admin
@mzone.cc
--
-f user
@mzone.cc

      上面的命令中,我们使用了– -f user@mzone.cc这样的参数,这是sendmail的选项,其中-f表示邮件的发送人邮件地址。更多sendmail参数请查看这里,或者在shell中man sendmail进行帮助获取。

      很多情况下,我们也需要使用邮件来发送附件,在linux下使用mail命令发送附件也很简单,不过首先需要安装uuencode软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在CentOS上安装该软件包如下:

yum        
install sharutils

      安装完成后我们就可以来进行附件的发送了,使用如下命令:

uuencode test.txt        
test
| mail
-s
"hello,see the attachement" admin
@mzone.cc

      完成后就可以把text.txt文件作为邮件的附件发送出去了。uuencode有两个参数,第一个是要发送的文件,第二个是显示的文件名称。

      这里我主要介绍的是在CentOS下使用mail发送电子邮件的一些使用方法,需要的要求是你的linux必须安装了sendmail并开启了,同时保证可以连接外网。另外,文章中提到的命令本人都经过亲自测试,保证完全可用,不过你需要将命令中的电子邮件地址换成自己的电子邮件地址。

转载地址:https://blog.csdn.net/zonghua521/article/details/78239195 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ntp时间服务器 时间同步
下一篇:增加linux service 系统服务

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月28日 08时25分12秒