python的email模块_python email 模块

import smtplib

import os

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

import traceback

import time

def send(self,content=None):

'''''

发送邮件

'''

server = None

index = 1 #邮件重试

while index < 3:

index += 1

try:

server = smtplib.SMTP_SSL("smtp.exmail.qq.com",port=465)

server.login(self.user,self.passwd)

server.sendmail("" % self.user, self.to_list + self.cc_list, self.get_attach(content=content))

server.close()

print("send email successful")

break

except Exception as e:

traceback.print_exc()

time.sleep(5)

print("send email failed")

finally:

try:

if server is not None:

server.close()

except Exception as e:

traceback.print_exc()

def get_attach(self,content=None,subtype='html'):

'''''

构造邮件内容

'''

attach = MIMEMultipart()

#添加邮件内容

txt = MIMEText(content, _subtype=subtype, _charset='utf-8')

attach.attach(txt)

if self.subject is not None:

#主题,最上面的一行

attach["Subject"] = self.subject

if self.user is not None:

#显示在发件人

attach["From"] = "Data Team" % self.user

if self.to_list:

attach["To"] = ";".join(self.to_list)#收件人列表

if self.cc_list:

attach["Cc"] = ";".join(self.cc_list)#抄送列表

if self.doc:

#估计任何文件都可以用base64,比如rar等

#文件名汉字用gbk编码代替

name = os.path.basename(self.doc).encode("gbk")

f = open(self.doc,"rb")

doc = MIMEText(f.read(), "base64", "gb2312")

doc["Content-Type"] = 'application/octet-stream'

doc["Content-Disposition"] = 'attachment; filename="' + name +'"'

attach.attach(doc)

f.close()

return attach.as_string()

def get_jobs_descript(self):

"""

获取任务的执行str

:return:

"""

html =''

html += ''

html += '

'

html += ''

html += '

调度报告'

html += ''

html +=''

html +='

'

till = str(datetime.datetime.now() - self.start_time)

till = till[0:till.index(".")] #精确到秒级小数点,然后要自己弄好,

html +='

启动时间:[' + self.start_time.strftime("%Y-%m-%d %H:%M:%S") +'] 结束时间:[' + self.get_end_time_str() +'] 持续时间:'+till+'

'

ss = 0

er = 0

skip = 0

run_c = 0

pl = ''

for job_name in self.job_run_:

node = self.dag_job.get_node(job_name=job_name)

if node.status == 1:

if node.is_active == False:

skip += 1

else:

ss += 1

elif node.status == -1:

er += 1

elif node.status == 0:

run_c += 1

pl += node.get_job_mail_str()

html +="

统计 [成功:" + str(ss) +'\t错误:' + str(er)+'\t跳过:'+str(skip)+'\t未执行:' + str(self.job_size - ss - er - skip)+'] 总任务数: ' + str(self.job_size)+'

'

html +='

邮件发送时间:' + str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M')) +'

'

html += '

调度报告

'

html +='

html +=''

html +='

'

html +='

状态'

html +='

任务名'

html +='

创建时间'

html +='

结束时间'

html +='

持续时间'

html +='

重试次数'

html +='

重试上限'

html +='

是否跳过'

html +='

一定正确'

html +='

优先级'

html +='

'

html +='

'

html +='

'

html += pl

html +='

'

return html

def get_job_mail_str(self):

"""

获取发送邮件的行数

:return:

"""

sz = "

"

if self.start_time is None:

sz += "

SKIP" + self.name +''

else:

if self.status == 1:

sz += "

SUCCEED" + self.name+''

elif self.status ==-1:

sz += "

ERROR" + self.name+''

elif self.status ==0:

sz += "

RUNNING" + self.name+''

elif self.status is None:

sz += "

NOT_RUN" + self.name+''

if self.start_time is not None:

sz +='

' + self.start_time.strftime('%Y-%m-%d %H:%M:%S')+''

else:

sz +='

'

if self.end_time is not None:

sz +='

'+self.end_time.strftime('%Y-%m-%d %H:%M:%S') +''

else:

sz +='

'

if self.start_time is None or self.end_time is None:

sz +='

'

else:

plz = str(self.end_time - self.start_time)

if plz.index(':') == 1:

sz += '

0' + str(self.end_time - self.start_time)[0:7] +''

else:

sz += '

' + str(self.end_time - self.start_time)[0:8] +''

sz += '

' + str(self.retry_time) + ''

sz += '

' + str(self.retry_limit) + ''

if self.is_active:

sz +='

'

else:

sz += '

' + str(self.is_active == False) +''

if self.forver_right:

sz += '

' + str(self.forver_right == True) +''

else:

sz += '

'

sz += '

' + str(self.priority) +''

sz += ''

return sz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle查被锁存储过程,oracle 结束被锁的包或存储过程

问题现象&#xff1a;在pl/sql编译包或者是存储过程procedure等&#xff0c;编译一直未响应。问题原因&#xff1a;ORACLE 存储过程或包被锁&#xff0c;编译不了问题解决方法&#xff1a;第一步&#xff1a;查找存储过程被哪些session锁住而无法编译select * FROM dba_ddl_loc…

redis aof 备份和恢复_Redis 持久化机制的介绍,了解这些流程很重要

我们已经知道对于一个企业级的redis架构来说&#xff0c;持久化是不可减少的。企业级redis集群架构&#xff1a;海量数据、高并发、高可用持久化主要是做灾难恢复&#xff0c;数据恢复&#xff0c;也可以归类到高可用的一个环节里面去&#xff0c;比如你redis整个挂了&#xff…

oracle 作业已存在,ORA-31634: 作业已存在

服务器上数据泵定时备份任务失败&#xff0c;查看日志报错如下&#xff1a;[oraclehs02 log]$ more expdp_bi_2019-11-02.logExport: Release 11.2.0.4.0 - Production on 星期六 11月 2 00:00:03 2019Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights res…

最近公共祖先_leetcode No.236 二叉树的最近公共祖先

承接二叉搜索树的最近公共祖先。题目链接&#xff1a;二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;​leetcode-cn.com题目描述&#xff1a;给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T…

python methodtype_Python的实例定属性和方法或类绑定方法

一、给实例对象绑定属性和方法&#xff1a;1、给实例绑定属性&#xff1a;先定义一个Student类#!/usr/bin/pythonclass Student(object):pass然后绑定属性&#xff1a;s Student()s.name AAA # 动态给实例绑定一个属性print(s.name)#输出AAA2、给实例绑定方法&#xff1a;先定…

oracle 时间间隔,ORACLE JOB间隔时间参考

关键字: oracle job 间隔时间 trunc假设你的存储过程名为PROC_RAIN_JM再写一个存储过程名为PROC_JOB_RAIN_JM内容是&#xff1a;Create Or Replace Procedure PROC_JOB_RAIN_JM Is li_jobno Number; Begin DBMS_JOB.SUBMIT(li_jobno,PROC_RAIN_JM;,SYSDATE,TRU…

canvas画布会黑屏吗_Android SurfaceView 黑屏问题

说一个真实的案例。其中需求要做一个绘图功能&#xff0c;一听到绘图&#xff0c;自然而然就像到了SurfaceView这个类。所以我就用了。android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" &g…

oracle连续周数,详细讲解Oracle数据库的“周数计算”

详细讲解Oracle数据库的“周数计算”以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;——日期计算 算第n周的第一天及最后一天是几号 by keynes—— ww的算法为每年 月 日为第一周开始 date …

probe request帧结构_WLAN 无线网络 09 - 管理帧

0000&#xff0c;Association request&#xff1a;关联请求帧认证成功后&#xff0c;STA就会进入关联阶段&#xff0c; 这个交互的目的是为了加入这个BSS 并获取一个AID。通过Association Request携带的信息&#xff0c;使AP了解STA的相关能力信息&#xff0c;这样 AP就可以决定…

oracle 31640,导数据时ora-31640报错

单实例数据库10.2.0.4&#xff0c;目标数据库11.2.0.3 rac&#xff0c;目标准备将单实例上的数据导入到rac数据库。在导入过程中报错如下&#xff1a;Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "LBSBUS"."T_MSG_SEND_DETAIL" …

oracle rman备份spfile,RMAN备份恢复之SPFILE的恢复(一)

缺少初始化文件&#xff0c;数据库是无法启动的。如果通过RMAN备份了初始化参数&#xff0c;那么可以通过RMAN对初始化参数进行恢复。这篇文章简单介绍CATALOG方式下初始化参数的恢复问题。初始化参数的丢失和损坏&#xff0c;并不会造成太严重的问题&#xff0c;即使是最坏的情…

c# 获取路径的盘符_c#获取驱动器盘符

在编写某些Windows管理应用程序时&#xff0c;能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的&#xff0c;使用Delphi或者C的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息&#xff0c;现在我们…

php fckeditor demo,如何使用PHP添加fckeditor

[更新答案]你需要把你的fckeditor代码放在 标签而不是在顶部。此外,$_POST["FCKEditor"]需要放进去$oFCKeditor->Value变量。这样做:它在我的机器上工作正常,并在fckeditor文本区域内显示格式化的HTML:EditorTitle : include("fckeditor.php");$sBaseP…

php 命名空间通俗易懂_PHP进阶由浅入深掌握面向对象开发

视频教程出自黑马程序员PHP基础_由浅入深掌握面向对象开发【讲解方式】系统梳理和分解知识&#xff0c;各个点逐步讲解&#xff0c;由浅入深&#xff0c;通俗易懂&#xff0c;层层深入【课程亮点】1&#xff0c;已经完成PHP基础知识学习的朋友有帮助2&#xff0c;生动形象&…

qt读oracle时间戳,QT利用QDateTime获取当前时间戳的方法toTime_t

1.toTime_t()把2014年12月19日10&#xff1a;24&#xff1a;40这样的QDateTime的格式转变为1418955940这样的时间戳QDateTime time QDateTime::currentDateTime(); //获取当前时间int timeT time.toTime_t(); //将当前时间转为时间戳2.与toTime_t()功能相反的是fromTime_…

怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?

如何在linux命令终端中找到具有特定父目录的所有文件&#xff1f;我知道找到所有的文件,使用这样查找&#xff1a;find . -name filename.extension但是可以找到所有filename.extension文件与父目录的文件夹名吗&#xff1f;我尝试了以下操作,但这不行&#xff1a;find . -name…

如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式

函数语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{T}\sinh g\cosh h\tanh i\operatorname{sh}j\operatorname{argsh}k\operatorname{ch}h\operatorname{argch}l\operatorname{th}i\operatorname{argth}mk(x)\l…

ln -s命令 linux,Linux下 ln -s 软链接用法

NAMEln - make links between filesSYNOPSISln [OPTION]... TARGET [LINK_NAME]ln [OPTION]... TARGET... DIRECTORYln [OPTION]... --target-directoryDIRECTORY TARGET...软链接用法是&#xff1a; ln -s 实际存在的目标目录 链接名称(不存在的) 。[rootDMDIDATAGUARD /]# cd…

cryptapi双向认证_[加密解密]CryptoAPI简介

CryptoAPI概述Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架&#xff0c;也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口&#xff0c;用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂…

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

最近学习使用vuejs前后端分离&#xff0c;重构一个已有的后台管理系统&#xff0c;遇到了下面这个问题&#xff1a;实现跨域请求时&#xff0c;每次ajax请求都是新的session&#xff0c;导致无法获取登录信息&#xff0c;所有的请求都被判定为未登陆。1、 vuejs ajax跨域请求最…