最近由于需要使用Python来发送邮件,网上搜索了下,发现很多代码都功能都较单一
故自己整理个较全面的,当然还不是最全面的,不能支持通过SSL发送的邮件。
碰到了以下几个问题:
1、刚开始使用126的邮箱测试,没有使用认证登录方式,结果换成公司的邮箱后,老是无法发送出邮箱
2、邮件内容中文显示为乱码,发现是编码的问题,在发送前将正文内容字符集知道为gb2312,如下
text = MIMEText(content,'html','gb2312')
3、163邮箱测试通过后,使用公司的邮箱来发送却失败,查了半天,才发现公司的邮箱登录用户名要拼才能认证成功,如:xxxx@XXX.com。而163的认证登录只要xxxx用户名就够了。
搞不清邮箱服务器同mail.xxx.com与smtp.xxx.com有什么区别,有懂的麻烦指点下哈。
代码:
#!/bin/sh
#!/usr/bin/env python
# -*- coding: gbk -*-
import smtplib
from email.mime.text import MIMEText
import base64
from email.MIMEMultipart import MIMEMultipart
from email import Encoders
from email.MIMEBase import MIMEBase
import os
#############
#要发给谁,这里发给2个人
mailto_list=["xxxxx@163.com"]
files=[]
content="正文内容"
subject="主题sds"
#####################
#设置服务器,用户名、口令以及邮箱的后缀
mail_host="smtp.163.com"
mail_user=""
mail_pass=""
mail_postfix="163.com"
######################
#支持邮箱的加密认证发送邮件功能
def send_mail(to_list,sub,content,files=[]):
'''
to_list:发给谁
sub:主题
content:内容
send_mail("aaa@126.com","sub","content")
'''
me=mail_user+""
#创建一个带附件的实例
msg = MIMEMultipart()
#加邮件头/正文
text = MIMEText(content,'html','gb2312')
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ";".join(to_list)
msg.attach(text)
#构造附件
for file in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(file,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'% os.path.basename(file))
msg.attach(part)
try:
server = smtplib.SMTP(mail_host,25)
server.set_debuglevel(1)
#server.connect('mail.dragonsoft.com.cn')
#server.ehlo()
server.docmd("EHLO Server")
server.docmd("AUTH LOGIN")
# 发送用户名,是base64编码过的,用send发送的,所以要用getreply获取返回信息
server.send(base64.encodestring(mail_user))
server.getreply()
server.send(base64.encodestring(mail_pass))
server.getreply()
server.sendmail(me, to_list, msg.as_string())
server.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == '__main__':
if send_mail(mailto_list,subject,content):
print "发送成功"
else:
print "发送失败"