之前系统一直是通过直接调用sendmail命令来往postfix发信的,搞得我一直都以为发信只能用sendmail,直到最近sendmail命令发信经常提取不到收件人,才促使我好好的看了一下发送邮件相关的一些知识。
首先sendmail其实就是一个客户端,postfix开着25端口,时刻准备着接收smtp报文。sendmail通过往25端口来发送smtp协议的报文来实现邮件的发送。其实只要按照smtp报文的要求,任何程序都可以往postfix服务器发送邮件。python中就有smtp的库。使用代码如下:
- #coding:utf8
- import os, smtplib, mimetypes
- from email.mime.base import MIMEBase
- from email.mime.text import MIMEText
- from email.mime.image import MIMEImage
- from email.mime.multipart import MIMEMultipart
- MAIL_LIST = ["jiajieshi@staff.abc.com.cn"]
- MAIL_HOST = "localhost"
- MAIL_POSTFIX = "staff.abc.com.cn"
- MAIL_FROM = "server@other.abc.com.cn"
- def send_mail(subject, content, html=None):
- try:
- message = MIMEMultipart()
- if html != None and html != '1':
- message = MIMEText(content, _subtype='html', _charset='gb2312')
- else:
- message = MIMEText(content, _subtype='plain', _charset='gb2312')
- message["MAIL FROM"] = MAIL_FROM
- message["Subject"] = subject
- message["From"] = MAIL_FROM
- message["To"] = ";".join(MAIL_LIST)
- #message.add_header('Return-Path', 'myname@staff.abc.com.cn')
- message['Return-Path'] = "myname@staff.abc.com.cn"
- smtp = smtplib.SMTP()
- smtp.connect(MAIL_HOST)
- #smtp.login(MAIL_USER, MAIL_PASS)
- smtp.sendmail(MAIL_FROM, MAIL_LIST, message.as_string())
- smtp.quit()
- return True
- except Exception, errmsg:
- print "Send mail failed to: %s" % errmsg
- return False
- if __name__ == "__main__":
- if send_mail("test-test", "
hello world
bbb", "1"):
- print "发送成功!"
- else:
- 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那封信。
阅读(1000) | 评论(0) | 转发(0) |