使用email模块和smtplib模块,内容比较固定,配好了即可实现,代码如下:
一、普通邮件发送
import smtplib from email.mime.text import MIMEText email_host = \'smtp.163.com\' #邮箱地址 email_user = \'XXX@163.com\' # 发送者账号 email_pwd = \'XXX\' # 发送者的密码 maillist =\'XXX@XXXX.com\' #收件人邮箱,多个账号的话,用逗号隔开 me = email_user msg = MIMEText(\'这是个python测试邮件,不用回复。\') # 邮件内容 msg[\'Subject\'] = \'python测试\' # 邮件主题 msg[\'From\'] = me # 发送者账号 msg[\'To\'] = maillist # 接收者账号列表 smtp = smtplib.SMTP(email_host,port=25) # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25 smtp.login(email_user, email_pwd) # 发送者的邮箱账号,密码 smtp.sendmail(me, maillist, msg.as_string()) # 参数分别是发送者,接收者,第三个是把上面的发送邮件的内容变成字符串 smtp.quit() # 发送完毕后退出smtp print (\'email send success.\')
注意
1. 发送者密码这里不是平时登录邮箱的密码,而是开启登录第三方邮件客户端的授权码。
2. 多数邮箱的smtp的端口号都是25,个别的请具体确认。
发邮件的代码封装成函数:
import smtplib from email.mime.text import MIMEText def send_mail(username, passwd, recv, title, content, mail_host=\'smtp.163.com\', port=25): \'\'\' 发送邮件函数,默认使用163smtp :param username: 邮箱账号 xx@163.com :param passwd: 邮箱密码 :param recv: 邮箱接收人地址,多个账号以逗号隔开 :param title: 邮件标题 :param content: 邮件内容 :param mail_host: 邮箱服务器 :param port: 端口号 :return: \'\'\' msg = MIMEText(content) # 邮件内容 msg[\'Subject\'] = title # 邮件主题 msg[\'From\'] = username # 发送者账号 msg[\'To\'] = recv # 接收者账号列表 smtp = smtplib.SMTP(mail_host, port=port) # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25 smtp.login(username, passwd) # 发送者的邮箱账号,密码 smtp.sendmail(username, recv, msg.as_string()) # 参数分别是发送者,接收者,第三个是把上面的发送邮件的内容变成字符串 smtp.quit() # 发送完毕后退出smtp print(\'email send success.\') email_user = \'xxxx@163.com\' # 发送者账号 email_pwd = \'xxxxx\' # 发送者密码 maillist = \'XXX@XXX.com\' title = \'测试邮件标题\' content = \'这里是邮件内容\' send_mail(email_user, email_pwd, maillist, title, content)
二、发带附件的邮件
import smtplib #smtplib这个模块是管发邮件 from email.mime.text import MIMEText #构造邮件内容 from email.mime.multipart import MIMEMultipart #发带附件的邮件用的 email_host = \'smtp.163.com\' #邮箱服务器地址 email_user = \'XXX@163.com\' # 发送者账号 email_pwd = \'XXX\' # 发送者密码是邮箱的授权码,不是登录的密码 maillist = \'XXX@XXX.com\' #收件人邮箱,多个账号的话,用逗号隔开 new_msg = MIMEMultipart() #构建了一个能发附件的邮件对象 new_msg.attach(MIMEText(\'这是Python测试发邮件的邮件,不要回复\')) # 邮件内容 new_msg[\'Subject\'] = \'Python测试邮件带附件\' # 邮件主题 new_msg[\'From\'] = email_user # 发送者账号 new_msg[\'To\'] = maillist # 接收者账号列表 att = MIMEText(open(\'like_report.txt\').read()) att["Content-Type"] = \'application/octet-stream\' att["Content-Disposition"] = \'attachment; filename="haha.txt"\' new_msg.attach(att) smtp = smtplib.SMTP(email_host,port=25) # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25 smtp.login(email_user, email_pwd) # 发送者的邮箱账号,密码 smtp.sendmail(email_user, maillist, new_msg.as_string()) # 参数分别是发送者,接收者,第三个是把上面的发送邮件的内容变成字符串 smtp.quit() # 发送完毕后退出smtp print (\'email send success.\')
三、封装发送邮件的类并验证
class SendMail(object): def __init__(self,username,passwd,recv,title,content, file=None, email_host=\'smtp.163.com\',port=25): self.username = username self.passwd = passwd self.recv = recv self.title = title self.content = content self.file = file self.email_host = email_host self.port = port def send_mail(self): msg = MIMEMultipart() #发送内容的对象 if self.file:#处理附件的 att = MIMEText(open(self.file).read()) att["Content-Type"] = \'application/octet-stream\' att["Content-Disposition"] = \'attachment; filename="%s"\'%self.file msg.attach(att) msg.attach(MIMEText(self.content))#邮件正文的内容 msg[\'Subject\'] = self.title # 邮件主题 msg[\'From\'] = self.username # 发送者账号 msg[\'To\'] = self.recv # 接收者账号列表 self.smtp = smtplib.SMTP(self.email_host,port=self.port) #发送邮件服务器的对象 self.smtp.login(self.username,self.passwd) try: self.smtp.sendmail(self.username,self.recv,msg.as_string()) except Exception as e: print(\'出错了。。\',e) else: print(\'发送成功!\') def __del__(self): self.smtp.quit() if __name__ == \'__main__\': m = SendMail( username=\'XXX@163.com\',passwd=\'XXX\',recv=\'XXX@XXX.com\', title=\'新鞋的发送邮件\',content=\'哈哈哈啊哈哈哈哈\',file=\'like_report.txt\' ) m.send_mail()
说句实在的,挺喜欢拿别人封装好的类直接拿来用。爽歪歪。