Chinaunix首页 | 论坛 | 博客
  • 博客访问: 480862
  • 博文数量: 111
  • 博客积分: 2332
  • 博客等级: 大尉
  • 技术积分: 1187
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(111)

文章存档

2013年(9)

2012年(28)

2011年(17)

2010年(28)

2009年(29)

我的朋友

分类: LINUX

2013-01-08 17:57:56

之前系统一直是通过直接调用sendmail命令来往postfix发信的,搞得我一直都以为发信只能用sendmail,直到最近sendmail命令发信经常提取不到收件人,才促使我好好的看了一下发送邮件相关的一些知识。

首先sendmail其实就是一个客户端,postfix开着25端口,时刻准备着接收smtp报文。sendmail通过往25端口来发送smtp协议的报文来实现邮件的发送。其实只要按照smtp报文的要求,任何程序都可以往postfix服务器发送邮件。python中就有smtp的库。使用代码如下:

点击(此处)折叠或打开

  1. #coding:utf8
  2. import os, smtplib, mimetypes
  3. from email.mime.base import MIMEBase
  4. from email.mime.text import MIMEText
  5. from email.mime.image import MIMEImage
  6. from email.mime.multipart import MIMEMultipart
  7. MAIL_LIST = ["jiajieshi@staff.abc.com.cn"]
  8. MAIL_HOST = "localhost"
  9. MAIL_POSTFIX = "staff.abc.com.cn"
  10. MAIL_FROM = "server@other.abc.com.cn"
  11. def send_mail(subject, content, html=None):
  12.     try:
  13.         message = MIMEMultipart()
  14.         if html != None and html != '1':
  15.             message = MIMEText(content, _subtype='html', _charset='gb2312')
  16.         else:
  17.             message = MIMEText(content, _subtype='plain', _charset='gb2312')
  18.         message["MAIL FROM"] = MAIL_FROM
  19.         message["Subject"] = subject
  20.         message["From"] = MAIL_FROM
  21.         message["To"] = ";".join(MAIL_LIST)
  22.         #message.add_header('Return-Path', 'myname@staff.abc.com.cn')
  23.         message['Return-Path'] = "myname@staff.abc.com.cn"
  24.         smtp = smtplib.SMTP()
  25.         smtp.connect(MAIL_HOST)
  26.         #smtp.login(MAIL_USER, MAIL_PASS)
  27.         smtp.sendmail(MAIL_FROM, MAIL_LIST, message.as_string())
  28.         smtp.quit()
  29.         return True
  30.     except Exception, errmsg:
  31.         print "Send mail failed to: %s" % errmsg
  32.         return False


  33. if __name__ == "__main__":
  34.     if send_mail("test-test", "

    hello world

    bbb"
    , "1"):
  35.         print "发送成功!"
  36.     else:
  37.         print "发送失败!"
现在问题就来了。
jiajieshi@staff.abc.com.cn这个邮箱地址是不存在的,所以staff.abc.com.cn产生了退信(Bounce),这封退信会被退回到postfix的队列中,通过mailq命令可以看到。
r089oJjo003354*       0 Tue Jan  8 17:50
 
r089oKjo003356*    1788 Tue Jan  8 17:50 MAILER-DAEMON
 
然后在过一会上面的两封退信就都没有了,但是多了一封这样的信息
r0735EW5012841     1728 Mon Jan  7 11:05 MAILER-DAEMON
                 (Deferred: Connection timed out with other.abc.com.cn.)
 
这是怎么回事呢。
原来是因为我们postfix所在的机器的主机名不是other.abc.com.cn(这点比较丢人,很不标准),然后因为发信的from是server@other.aaa.com.cn,所以退信要发给他。但问题是postfix所在的机器到other.aaa.com.cn这台机器路由不通,所以就造成了Connection timed out那封信。
阅读(1004) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~