python通过163邮箱发送email邮件
发送邮件代码
# !/usr/bin/python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.header import Header# 第三方 SMTP 服务mail_host = "smtp.163.com" # 设置服务器mail_user = "xxx@163.com" # 用户名mail_pass = "xxx" # 口令sender = mail_usersender_name = "admin" # 显示名称receiver = 'xxx@qq.com' # 接收邮件,可设置为你的QQ邮箱或者其他邮箱,列表 发送会报错# 邮件内容message = MIMEText("正文内容", 'plain', 'utf-8')message['From'] = "{0}<{1}>".format(sender_name ,sender)message['To'] = receivermessage['Subject'] = Header("标题", 'utf-8')try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号smtpObj.login(mail_user, mail_pass)smtpObj.sendmail(sender, receiver, message.as_string())print "邮件发送成功"smtpObj.quit()smtpObj.close()except smtplib.SMTPException as e:print "Error: 无法发送邮件", e
封装成简单邮件发送模块
# email_helper.pyfrom email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplibdebug = True # debug开关def debug_info(text):if debug == True:print(text)class EmailClient(object):'邮件发送端初始化类'def __init__(self, smtp_server):'初始化服务器地址'self._smtp_server = smtp_serverself.addrs = [] # 邮件地址列表, 格式(addr, name)def login(self, from_addr, password, from_name=None):'登录'self._from_addr = from_addrself._password = passwordif from_name == None:self._from_name = from_addrelse:self._from_name = from_nametry:self.server = smtplib.SMTP(self._smtp_server, 25)# server.set_debuglevel(1)self.server.login(self._from_addr, self._password)except Exception as e:return -1 # 登录失败debug_info("登录失败")else:return 0 # 登录成功debug_info("登录成功")def _send(self, title, text, to_addr, to_name=None):'发送邮件'if to_name == None: to_name = to_addrtry:# 接受方信息msg = MIMEText(text, 'plain', 'utf-8')msg['From'] = self._format_addr('%s<%s>' % (self._from_name, self._from_addr))msg['To'] = self._format_addr('%s <%s>' % (to_name, to_addr))msg['Subject'] = Header(title, 'utf-8').encode()# 发送内容self.server.sendmail(self._from_addr, to_addr, msg.as_string())return 0except Exception as e:debug_info(e)return -1def add_address(self, addr, name=None):'增加地址到地址列表'if name == None: name = addrself.addrs.append((addr, name))def send_all(self, title, text):'发送所有人'success = 0fail = 0for addr, name in self.addrs:ret = self._send(title, text, addr, name)if ret == 0:success += 1else:fail += 1return success, faildef __del__(self):'析构'self.server.quit()def _format_addr(self, s):'格式化地址'name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))if __name__ == '__main__':# 邮箱服务器地址email_client = EmailClient("smtp.163.com")# 登陆,密码或授权码email_client.login("xxxx@163.com", "password")# 增加收件人email_client.add_address("xxx@qq.com")email_client.add_address("email")email_client.add_address("email")# 发送title = "邮件标题"body = "邮件内容,试试看能不能发送出去"success, fail = email_client.send_all(title, body)# 返回发送结果print("success:", success, "fail:", fail)
实例:整点报时发邮件
引入上面的模块文件,当整点的时候就给自己的邮件发一份邮件,汇报现在时刻
# email_demo.pyfrom email_helper import EmailClient
from datetime import datetime
import timeemail_client = EmailClient("smtp.163.com") # 邮箱服务器地址email_client.login("xxx@163.com", "xxx") # 登陆email_client.add_address("xxxx@qq.com") # 增加收件人# 发送
while True:now = datetime.now()if now.minute == 0 and now.second == 0:title = "整点时间提醒邮件"body = "现在时刻:%s"%nowsuccess, fail = email_client.send_all(title, body)print("success:", success, "fail:", fail) # 返回发送结果time.sleep(5)
scrapy中发送邮件
如果是使用scrapy 爬虫框架,就比较简单了,直接使用如下代码就行,当然也可以将参数配置到setting文件里,多次调用参数。
ps:单独测试没有成功,运行爬虫项目中测试才行
# -*- coding:utf-8 -*-# 测试邮箱发送
from scrapy.mail import MailSendermailer = MailSender(smtphost='smtp.163.com',mailfrom="xxx@163.com",smtpuser="xxx@163.com",smtppass="xxxxx",smtpport=25)mailer.send(to=["xxx@qq.com"],subject="请查收",body="hello world")
优化后的简单实用
支持25端口和465端口设置
# -*- coding: utf-8 -*-import smtplib
from email.mime.text import MIMEText
from email.utils import formataddrclass EmailSender(object):# 邮箱配置# 服务器地址MAIL_HOST = "smtp.163.com"# 服务器端口 25 或者 465(ssl)MAIL_PORT = 465# 发件人邮箱账号MAIL_USER = "xxx@163.com"# 发件人邮箱密码MAIL_PASS = "123456"# 发件人邮箱别名MAIL_NAME = "xxx"# 收件人地址MAIL_TO = "xxx@qq.com"@classmethoddef send(cls, subject, text, to_addrs=None):msg = cls._get_email(subject, text)# 发送邮件if cls.MAIL_PORT == 465:server = smtplib.SMTP_SSL(cls.MAIL_HOST) # ssl 465端口else:server = smtplib.SMTP(cls.MAIL_HOST, cls.MAIL_PORT) # 25端口# 发送地址if to_addrs is None:to_addrs = [cls.MAIL_TO]server.login(cls.MAIL_USER, cls.MAIL_PASS) # 登录server.sendmail(cls.MAIL_USER, to_addrs, msg.as_string()) # 发送server.quit() # 退出@classmethoddef _get_email(cls, subject, text):# 构造邮件msg = MIMEText(text, 'plain', 'utf-8')# 邮箱昵称、发件人邮箱账号msg['From'] = formataddr([cls.MAIL_NAME, cls.MAIL_USER])msg['To'] = formataddr([cls.MAIL_TO, cls.MAIL_TO])msg['Subject'] = subjectreturn msgif __name__ == '__main__':EmailSender.send("你好", "这是内容")
参考:
- SMTP发送邮件 - 廖雪峰博客
- Python SMTP发送邮件 - 菜鸟教程
- scrapy 发送email
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
