发送邮件代码

# !/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.163.com" # 设置服务器
mail_user = "xxx@163.com" # 用户名
mail_pass = "xxx" # 口令

sender = mail_user
sender_name = "admin" # 显示名称
receiver = 'xxx@qq.com'
# 接收邮件,可设置为你的QQ邮箱或者其他邮箱,列表 发送会报错

# 邮件内容
message = MIMEText("正文内容", 'plain', 'utf-8')
message['From'] = "{0}<{1}>".format(sender_name ,sender)
message['To'] = receiver
message['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.py

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

debug = True # debug开关


def debug_info(text):
if debug == True:
print(text)


class EmailClient(object):
'邮件发送端初始化类'

def __init__(self, smtp_server):
'初始化服务器地址'
self._smtp_server = smtp_server
self.addrs = [] # 邮件地址列表, 格式(addr, name)

def login(self, from_addr, password, from_name=None):
'登录'
self._from_addr = from_addr
self._password = password
if from_name == None:
self._from_name = from_addr
else:
self._from_name = from_name

try:
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_addr

try:
# 接受方信息
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 0

except Exception as e:
debug_info(e)
return -1

def add_address(self, addr, name=None):
'增加地址到地址列表'
if name == None: name = addr
self.addrs.append((addr, name))

def send_all(self, title, text):
'发送所有人'
success = 0
fail = 0
for addr, name in self.addrs:
ret = self._send(title, text, addr, name)
if ret == 0:
success += 1
else:
fail += 1
return success, fail

def __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.py

from email_helper import EmailClient
from datetime import datetime
import time

email_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"%now
success, 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 MailSender

mailer = 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 formataddr


class 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"

@classmethod
def 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() # 退出

@classmethod
def _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'] = subject
return msg


if __name__ == '__main__':
EmailSender.send("你好", "这是内容")


参考:


  1. ​SMTP发送邮件 - 廖雪峰博客​
  2. ​Python SMTP发送邮件 - 菜鸟教程​
  3. ​scrapy 发送email​