python通过163邮箱发送email邮件

简介: python通过163邮箱发送email邮件

发送邮件代码

# !/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("你好", "这是内容")

参考:


SMTP发送邮件 - 廖雪峰博客

Python SMTP发送邮件 - 菜鸟教程

scrapy 发送email

相关文章
|
3月前
|
存储 搜索推荐 数据安全/隐私保护
python实战讲解之使用Python批量发送个性化邮件
python实战讲解之使用Python批量发送个性化邮件
|
5天前
|
监控 Python
Python监控主机是否存活,并发报警邮件
Python监控主机是否存活,并发报警邮件
|
8天前
|
数据安全/隐私保护 Python
Python Flask-Mail实现邮件发送
Python Flask-Mail实现邮件发送
|
2月前
|
存储 安全 计算机视觉
用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知
用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知
|
3月前
|
存储 Shell API
Python 自动化指南(繁琐工作自动化)第二版:十八、发送电子邮件和短信
Python 自动化指南(繁琐工作自动化)第二版:十八、发送电子邮件和短信
59 0
|
3月前
|
移动开发 Python HTML5
Python办公自动化【发送普通邮件、发送HTML邮件、发送附件邮件-smtplib、批量发送邮件-smtplib、发送邮件-zmail】(八)-全面详解(学习总结---从入门到深化)
Python办公自动化【发送普通邮件、发送HTML邮件、发送附件邮件-smtplib、批量发送邮件-smtplib、发送邮件-zmail】(八)-全面详解(学习总结---从入门到深化)
47 0
|
4月前
|
Python
【代码】利用Python每天自动发新闻到邮箱
【代码】利用Python每天自动发新闻到邮箱
25 0
|
4月前
|
存储 安全 网络安全
python自动化操作邮箱
python自动化操作邮箱
79 0
|
5月前
|
人工智能 安全 程序员
使用 ChatGPT 帮助小学生编程入门系列之二:使用 Python 编程发送电子邮件
使用 ChatGPT 帮助小学生编程入门系列之二:使用 Python 编程发送电子邮件
56 0