Python 使用 smtp ssl 模式 发送邮件与附件

2023-11-01

 

参考 :
        发送邮件简单入门 ( 以qq邮箱,163邮箱为例 ) :https://blog.csdn.net/qq_38661599/article/details/81013834
        smtp ssl 模式 发送邮件 与 附件:https://www.cnblogs.com/SunshineKimi/p/10629342.html
        Python3 使用 SMTP 发送带附件邮件:https://www.jb51.net/article/142231.htm

还可以使用 scrapy.mail 模块发送邮件:https://blog.csdn.net/you_are_my_dream/article/details/60868329

 

把代码中这个几设置成你自己的参数:

self._smtp_host = "smtp.mxhichina.com"    # 设置 服务器
self._smtp_port = 465                     # 设置 端口
self._email_address = "xxxxxxxx@xxx.com"  # 用户名
self._email_password = "xxxxxxxxxxxxxxx"  # 口令

完整代码( send_email_attach.py )

# -*- coding: utf-8 -*-
# @Author  : 
# @File    : temp.py
# @Software: PyCharm
# @description : XXX


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import optparse


class SendEmail(object):

    def __init__(self):
        super(SendEmail, self).__init__()

        # 第三方 SMTP 服务
        self._smtp_host = "smtp.mxhichina.com"  # 设置 服务器
        self._smtp_port = 465                   # 设置 端口

        # 默认的发送邮件的邮箱地址和密码。
        # 当没有传递发送者的邮箱地址和密码时,使用默认的邮箱地址和密码发送
        self._email_address = "xxxxxxxx@xxx.com"  # 用户名
        self._email_password = "xxxxxxxxxxxxxxx"     # 口令

        self.frm = None
        self.pwd = None
        self.to = None
        self.email_title = None
        self.email_content = None
        self.attach_path = None
        self.attach_path_list = None
        pass

    def set_args(self, frm=None, pwd=None, to=None, email_title=None, email_content=None, attach_path=None):
        """
            设置参数
        :param frm: 发送者邮箱地址
        :param pwd: 发送者邮箱密码
        :param to:  接收者邮箱地址,多个接收者时以逗号','分割
        :param email_title:  邮件标题
        :param email_content:邮件内容
        :param attach_path:  附件路径,多个附件时以逗号','分割
        :return:
        """
        if frm:
            self.frm = frm
            if not pwd:
                raise Exception('设置邮箱密码')
            else:
                self.pwd = pwd
        else:
            self.frm = self._email_address
            self.pwd = self._email_password
        self.to = to
        self.email_title = email_title
        self.email_content = email_content
        self.attach_path = attach_path

        # 把逗号分割的附件路径变成 list
        if self.attach_path is not None:
            self.attach_path_list = self.attach_path if ',' not in self.attach_path else self.attach_path.split(',')

    def send_email(self):
        multi_part = MIMEMultipart()
        multi_part['From'] = self.frm
        multi_part['To'] = self.to
        multi_part['Subject'] = Header(self.email_title, "utf-8")

        # 添加 邮件 内容
        msg = self.email_content
        email_body = MIMEText(msg, 'plain', 'utf-8')
        multi_part.attach(email_body)

        # 添加附件
        if isinstance(self.attach_path_list, str):
            # 只有一个附件
            attach = MIMEText(open(self.attach_path, 'rb').read(), 'base64', 'utf-8')
            attach["Content-Type"] = 'application/octet-stream'

            # filename not strict
            attach_file_name = self.attach_path_list.split('/')[-1]
            attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
            multi_part.attach(attach)
        elif isinstance(self.attach_path_list, list):
            # 多个附件
            for item in self.attach_path_list:
                attach = MIMEText(open(item, 'rb').read(), 'base64', 'utf-8')
                attach["Content-Type"] = 'application/octet-stream'

                # filename not strict
                attach_file_name = item.split('/')[-1]
                attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
                multi_part.attach(attach)

        # ssl 协议安全发送
        smtp_server = smtplib.SMTP_SSL(host=self._smtp_host, port=self._smtp_port)
        try:
            smtp_server.login(self.frm, self.pwd)
            smtp_server.sendmail(self.frm, self.to, multi_part.as_string())
        except smtplib.SMTPException as e:
            print("send fail", e)
        else:
            print("send success")
        finally:
            try:
                smtp_server.quit()
            except smtplib.SMTPException:
                print("quit fail")
            else:
                print("quit success")


if __name__ == '__main__':
    parse = optparse.OptionParser(
        usage='"usage : %prog [options] arg1,arg2"', version="%prog 1.2"
    )
    parse.add_option(
        '-t', '--to', dest='to', action='store', type=str, metavar='to',
        help='接收者的邮箱地址, 多个接收者时以逗号 "," 分隔'
    )
    parse.add_option(
        '-f', '--from', dest='frm', type=str, metavar='from',
        help='发送者的邮箱地址'
    )
    parse.add_option(
        '-p', '--pwd', dest='pwd', type=str, metavar='pwd',
        help='发送者的邮箱密码'
    )
    parse.add_option(
        '-T', '--title', dest='email_title', type=str, metavar='title',
        help='邮件标题'
    )
    parse.add_option(
        '-C', '--content', dest='email_content', type=str, metavar='content',
        help='邮件内容'
    )
    parse.add_option(
        '-A', '--attach', dest='attach_path', type=str, metavar='attach',
        help='邮件的附件路径, 多个附件时以逗号 "," 分隔'
    )
    parse.add_option('-v', help='help')

    options, args = parse.parse_args()

    temp_send = SendEmail()
    temp_send.set_args(
        frm=options.frm, pwd=options.pwd, to=options.to,
        email_title=options.email_title,
        email_content=options.email_content,
        attach_path=options.attach_path
    )
    temp_send.send_email()

可以执行 :python3 send_email_attach.py -h 查看帮助

发送邮件:

邮箱截图

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 使用 smtp ssl 模式 发送邮件与附件 的相关文章

  • Django:模拟模型上的字段

    如何将模拟对象分配给该模型上的用户字段 无论如何都要绕过 SomeModel user 必须是 User 实例 检查吗 class SomeModel models Model user models ForeignKey User 我不会
  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 与 while 循环一样,如何跳过 for 循环中的步骤?

    我尝试像 while 循环一样跳过 for 循环中的几个步骤 在 while 循环中 步骤根据特定条件进行调整 如下面的代码所示 i 0 while i lt 10 if i 3 i 5 else print i i i 1 result
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • 基于AF的HTTP

    搬搬砖头而已 iOS 基于AF的HTTP请求类 OKHTTPRequestManager h OKHTTPRequestManager h LL Created by Morris on 2020 9 22 Copyright 2020 L
  • 蓝桥杯训练——最小乘积(基本型)

    试题 算法训练 最小乘积 基本型 资源限制 时间限制 1 0s 内存限制 512 0MB 问题描述 给两组数 各n个 请调整每组数的排列顺序 使得两组数据相同下标元素对应相乘 然后相加的和最小 要求程序输出这个最小值 例如两组数分别为 1
  • Java设计模式——单例模式

    文章目录 为什么要用单例模式 单例模式 饿汉式 DCL 静态内部类 为什么要用单例模式 单例对象 Singleton 是一种常用的设计模式 在Java应用中 单例对象能保证在一个JVM中 该对象只有一个实例存在 这样的模式有几个好处 某些类
  • 大数相加和大数相乘

    1 大数相加 int或者long类型的数据往往满足不了数据容量的要求 这时需要用到数组或者字符串进行操作 考虑到数据的位数并不是一个确定的值 运用string来处理可以简化思维 在进行运算之前 需要明确下面几点要求 1 将两组数据中位数大的
  • vue单页面给页面添加锚点实现锚点跳转

    使用Element scrollIntoView 详情情查看 scrollIntoView 参数 alignToTop可选 一个Boolean值 如果为true 元素的顶端将和其所在滚动区的可视区域的顶端对齐 相应的 scrollIntoV
  • 虚拟专用网拨号出现错误提示:没有设置允许基本路由封装GRE协议数据包通过-原因解决方法

    今天给用户配置虚拟专用网拨号到单位的服务器 操作系统为win10 执行拨号后 提示上面的信息经过百度搜索 发现这个问题和网络运营商有关系 因为你使用的是移动或联通宽带 服务商阻止了虚拟专用网通道 只要换电信宽带就好了 恰巧就是使用了联通的移
  • C语言工资管理系统

    include
  • 03.前后端分离中台框架 zhontai 项目代码生成器的使用

    zhontai 项目 基于 Net7 x Vue 等技术的前后端分离后台权限管理系统 想你所想的开发理念 希望减少工作量 帮助大家实现快速开发 后端地址 https github com zhontai Admin Core 前端地址 ht
  • flutter实现APP版本更新(全局弹窗overlay实现)

    升级说明 Android 应用内更新下载 安装 iOS 跳转到appstore下载安装 注 可以通过热更新技术进行升级 我不会 引用插件 获取当前版本 package info 0 4 3 2 版本内更新 ota update 2 4 1
  • Mac下终端(Terminal)中打开某应用的技巧

    Mac下一般都是点击某一个应用的图标 或者在Alfred中键入应用名称打开该应用 但有时候在终端执行某些代码 此时想打开程序 以上操作都不流畅 所以琢磨能否在终端下直接打开某些程序 比如要 编辑路径下的shell脚本文件 但又不想使用vim
  • 基于Stable Diffusion的AIGC服饰穿搭实践

    本文主要介绍了基于Stable Diffusion技术的虚拟穿搭试衣的研究探索工作 文章展示了使用LoRA ControlNet Inpainting SAM等工具的方法和处理流程 并陈述了部分目前的实践结果 通过阅读这篇文章 读者可以了解
  • python爬虫学习笔记-requests高级

    简历模板下载拓展 import requests from lxml import etree import os headers User Agent Mozilla 5 0 Macintosh Intel Mac OS X 10 15
  • http与websocket

    http与websocket HTTP 是一个在计算机世界里专门在两点之间传输文字 图片 音频 视频等超文本数据的约定和规范 WebSocket是HTML5出的东西 协议 也就是说HTTP协议没有变化 或者说没关系 但HTTP是不支持持久连
  • 小程序中使用CANVAS实现手写签名并写入模板图片中

    实测 开发者工具中滚动条位置会影响书写 显示会有些问题 并且会卡顿 安卓 苹果手机上测试正常 index js const App getApp Page 页面的初始数据 data curScrollTop 0 生命周期函数 监听页面加载
  • python计时模块——timeit

    timeit模块 timeit 模块定义了接受两个参数的 Timer 类 两个参数都是字符串 第一个参数是你要计时的语句或者函数 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句 从内部讲 timeit 构建起一个独立的
  • PWM驱动MOS管H桥电路分析

    H桥是一个典型的直流电机控制电路 因为它的电路形状酷似字母H 故得名与 H桥 4个三极管组成H的4条垂直腿 而电机就是H中的横杠 注意 图中只是简略示意图 而不是完整的电路图 其中三极管的驱动电路没有画出来 01 H桥驱动原理 1 电机驱动
  • 网络安全-文件包含漏洞原理、攻击及防御

    目录 简介 类型 原理 攻击 仅本地文件包含 防御 简介 文件包含 是一个功能 在各种开发语言中都提供了内置的文件包含函数 可以使开发人员在一个代码文件中直接包含 引入 另外一个代码文件 类型 根据不同的配置环境 文件包含漏洞分为如下两种情
  • Qt - QLabel设置字体颜色

    Qt QLabel设置字体颜色 第一种 使用setPalette 方法如下 QLabel label new QLabel tr Hello Qt QPalette pe pe setColor QPalette WindowText Qt
  • 等级保护2.0四级通用要求测评方法

    等级保护2 0四级通用要求测评方法
  • Python 使用 smtp ssl 模式 发送邮件与附件

    参考 发送邮件简单入门 以qq邮箱 163邮箱为例 https blog csdn net qq 38661599 article details 81013834 smtp ssl 模式 发送邮件 与 附件 https www cnblo