三个要点

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,邮件传输代理 
代为传递,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.

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)

  1. Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...
  2. [-- sendmail-options ...]
  3. mail [-iInNv] -f [name]
  4. mail [-iInNv] [-u user]

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

1、直接使用shell当编辑器

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

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

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

  1. 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、使用文件进行邮件发送

  1. 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的参数进行配置,比如我想使用特定的发件人发送邮件,可以使用如下命令:

  1. 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上安装该软件包如下:

  1. yum install sharutils

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

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

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

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

最新文章

  1. Visual Studio无法查找或打开 PDB 文件解决办法
  2. [转]-Android Studio 快捷键整理分享-SadieYu
  3. mysql卸载注意事项
  4. Flink资料(6) -- 如何添加一个新的Operator
  5. gbs remotebuild使用说明
  6. velocity基本语法
  7. VBS get,post函数
  8. 201521123063 《java程序设计》第六周学习总结
  9. vhost:一种 virtio 高性能的后端驱动实现
  10. Sharding-jdbc实现分库分表
  11. Xcode的playground中对于SpriteKit物理对象的更新为何无效
  12. 小小聊天室 Python实现
  13. jenkins主要目录用途
  14. python读Excel
  15. U3D学习资料收集
  16. 模拟器 Unable to execute simctl install Error 117
  17. myslide 插件开发知识点总结和 css3 动画性能问题的研究
  18. S2X环境搭建与示例运行
  19. Git与GitHub学习笔记(五)一次提交失败的记录
  20. centos6.6安装hadoop-2.5.0(一、本地模式安装)

热门文章

  1. 字符串转hash
  2. Google搜索成最大入口,简单谈下个人博客的SEO
  3. Windows 系统安装 Python 3.8 详解
  4. springIOC源码接口分析(十一):ConfigurableApplicationContext
  5. Nginx-入门(源码编译安装http://nginx.org/en/download.html)
  6. HTML:一张思维导图搞懂HTML
  7. koa中间执行机制
  8. Visual Studio 2012 出现关于ActivityLog.xml错误的解决方案
  9. Spring Boot自动装配原理源码分析
  10. Elasticsearch系列