Linux 邮件服务
三个要点
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
SMTP 在 TCP 协议 25 端口监听连接请求。
简单地说,SMTP管‘发’, POP3/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 |
220 163.com Anti-spam GT for Coremail System (163com[20141201]) 回应220 服务就绪
这里输入USERbase64加密后的用户名
334 UGFzc3dvcmQ6 要求输入Password:
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,邮件传输代理
代为传递,Sendmail和Postfix就是扮演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.
而通过修改配置文件可以使用外部SMTP服务器,可以达到不使用sendmail而用外部的smtp服务器发送邮件的目的。
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
- 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<mail.txt
上面的命令中,我们使用了– -f user@mzone.cc这样的参数,这是sendmail的选项,其中-f表示邮件的发送人邮件地址。更多sendmail参数请查看这里http://www.courier-mta.org/sendmail.html,或者在shell中man sendmail进行帮助获取。
很多情况下,我们也需要使用邮件来发送附件,在linux下使用mail命令发送附件也很简单,不过首先需要安装uuencode软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在CentOS上安装该软件包如下:
- yum install sharutils
安装完成后我们就可以来进行附件的发送了,使用如下命令:
- uuencode test.txt test | mail -s "hello,see the attachement" admin@mzone.cc<mail.txt
完成后就可以把text.txt文件作为邮件的附件发送出去了。uuencode有两个参数,第一个是要发送的文件,第二个是显示的文件名称。
这里我主要介绍的是在CentOS下使用mail发送电子邮件的一些使用方法,需要的要求是你的linux必须安装了sendmail并开启了,同时保证可以连接外网。另外,文章中提到的命令本人都经过亲自测试,保证完全可用,不过你需要将命令中的电子邮件地址换成自己的电子邮件地址。
最新文章
- Visual Studio无法查找或打开 PDB 文件解决办法
- [转]-Android Studio 快捷键整理分享-SadieYu
- mysql卸载注意事项
- Flink资料(6) -- 如何添加一个新的Operator
- gbs remotebuild使用说明
- velocity基本语法
- VBS get,post函数
- 201521123063 《java程序设计》第六周学习总结
- vhost:一种 virtio 高性能的后端驱动实现
- Sharding-jdbc实现分库分表
- Xcode的playground中对于SpriteKit物理对象的更新为何无效
- 小小聊天室 Python实现
- jenkins主要目录用途
- python读Excel
- U3D学习资料收集
- 模拟器 Unable to execute simctl install Error 117
- myslide 插件开发知识点总结和 css3 动画性能问题的研究
- S2X环境搭建与示例运行
- Git与GitHub学习笔记(五)一次提交失败的记录
- centos6.6安装hadoop-2.5.0(一、本地模式安装)
热门文章
- 字符串转hash
- Google搜索成最大入口,简单谈下个人博客的SEO
- Windows 系统安装 Python 3.8 详解
- springIOC源码接口分析(十一):ConfigurableApplicationContext
- Nginx-入门(源码编译安装http://nginx.org/en/download.html)
- HTML:一张思维导图搞懂HTML
- koa中间执行机制
- Visual Studio 2012 出现关于ActivityLog.xml错误的解决方案
- Spring Boot自动装配原理源码分析
- Elasticsearch系列