首页 > Linux Usage > Linux下使用postfix发送邮件初探

Linux下使用postfix发送邮件初探

2012-06-28 20:15 星期四    浏览: 5,285    绿 发表评论 阅读评论

为了省时间,记录的有些杂乱

SMTP

当我们在自己PC上使用邮件客户端(如Foxmail或outlook)时,通常使用自己申请的某一个申请的邮箱帐号,如163的邮箱帐号。若向他人发送邮件(如对方是qq的邮箱)。那么这个发送过程是什么样的呢?对方收取邮件的过程又是怎样的呢?

首先来看下什么是SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)。它是基于文本的应用层协议。发送邮件时,客户端向远程服务器的SMTP端口(通常为25)发送连接请求,然后双方通过ASCII码字符集命令发送请求和回复。我们可以使用telnet登录到SMTP服务器的25端口,然后向其发送邮件:

telnet smtp.example.com 25

它打开一个从发送的机器到主机smtp.example.com的SMTP连接。下面的操作示例(摘自参考链接2)展示出双方使用SMTP发送的过程(加粗字体是命令字,s代表着server侧的回复,C是client侧的请求):

S: 220 smtp.example.com ESMTP Postfix
C: HELO mydomain.com
S: 250 Hello mydomain.com
C: MAIL FROM: sender@mydomain.com
S: 250 Ok
C: RCPT TO: friend@example.com
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: test message
C: From: sender@mydomain.com
C: To: friend@example.com
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: quit
S: 221 Bye

因此,SMTP的25端口用于接受发送者的发送连接请求。

在回到前面使用163邮箱往qq邮箱发送邮件的例子。当我们使用客户端软件发送邮件时,通过SMTP协议连接到163邮件服务器 (smtp.163.com)的smtp端口(25),继而163邮件服务器将邮件发到到qq邮件服务器,这个过程163的邮件服务器再次通过SMTP协议向QQ的SMTP server(smtp.qq.com)发送邮件。当对方使用客户端软件收取邮件时,将通过POP3或IMAP协议向QQ邮件服务器收取自己邮箱帐号中的邮件。

当然,若我们使用的机器本身安装有SMTP server,那么我们可以直接使用SMTP协议向对方的邮件服务器(如smtp.qq.com)发送邮件(即直接投递)。也可以配置成不接收客户端的请求(不开放25端口),只是供本机的程序发送邮件。

在Linux系统中,通常使用的Mail Server有,传统的Sendmail,或postfix和Qmail等。

Sendmail最早使用,使用范围较广,但安全性不佳;与其兼容性较好又注重安全的postfix使用范围亦较多。

 postfix

<Based on CentOS>

日志文件:/var/log/maillog

配置文件:/etc/postfix/目录下,主要是main.cf

系统用户的邮件目录:/var/spool/mail/

postfix作为系统的服务运行,可以使用service postfix status查看其运行状态。

使用chkconfig查看开启自动重启设置:
chkconfig –list postfix
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off

查看邮件列表: postqueue -p

sendmail命令来发送邮件,可以使用man sendmail查看其用法。下面测试发送邮件:

sendmail xxxxxxxx@qq.com
FROM:XXXXX@163.com
SUBJECT:hello world
This is a test mail from blog.redwolf-soft.com
.

上面的xxxxxxxx@qq.com是接收地址,填写的发送地址是XXXXX@163.com(这将导致它与实际发送地址不一样,我们可不是163邮箱服务提供者哦),最后一行的原点是结束符号。这样,我们就可以通过sendmail发送邮件了。

亦可使用下面方式发送测试邮件,检查postfix是否工作:

echo my mail content, blabla … |mail -s testMailSubject   xxxxxx@qq.com

然后,可以检查我们的qq邮箱是否有这些邮件。注意,有可能在垃圾箱。

运行在web server中的php脚本可以使用mail()函数,它将使用sendmail来为网站发送邮件。需要检查/etc/php.ini中是否正确:

sendmail_path = "/usr/sbin/sendmail -t -i"

 

另外,若出现不能发送的问题,根本就没有试图去连接远程smtp服务器,那么可能是Selinux在起作用,阻止了发送:

getsebool -a|grep sendmail
httpd_can_sendmail –> off
setsebool -P httpd_can_sendmail on
getsebool -a|grep sendmail
httpd_can_sendmail –> on

打开开关,就应该能解决权限问题。

 

我们可以部署postfix只作为发送服务器,而不接收外部邮件(不用打开25端口)。参见参考链接4和5

参考链接:

1. http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol

2. 简单邮件传输协议 http://zh.wikipedia.org/zh-cn/SMTP

3. SMTP  http://www.hudong.com/wiki/SMTP

4. http://www.kreci.net/linux/how-to-send-mail-in-postfix-through-external-smtp/

5. http://askubuntu.com/questions/47609/how-to-have-my-php-send-mail

6. http://tombuntu.com/index.php/2009/12/22/send-outgoing-email-with-postfix/

本文链接地址: http://blog.redwolf-soft.com/?p=1647

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。