- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python脚本定时发送邮件由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了python定时发送邮件的具体代码,供大家参考,具体内容如下 。
全部代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
import
time
from
datetime
import
datetime
from
email.header
import
Header
from
email.mime.multipart
import
MIMEMultipart
from
email.mime.text
import
MIMEText
from
email.utils
import
parseaddr, formataddr
import
xlrd
from
apscheduler.schedulers.blocking
import
BlockingScheduler
from
xlrd
import
xldate_as_tuple
ISOTIMEFORMAT
=
'%Y%m%d'
import
smtplib
def
read_file(file_path):
file_list
=
[]
work_book
=
xlrd.open_workbook(file_path)
sheet_data
=
work_book.sheet_by_name(
'Sheet1'
)
print
(
'now is process :'
, sheet_data.name)
Nrows
=
sheet_data.nrows
for
i
in
range
(
1
, Nrows):
file_list.append(sheet_data.row_values(i))
return
file_list
def
_format_addr(s):
name, addr
=
parseaddr(s)
return
formataddr((Header(name,
'utf-8'
).encode(), addr))
def
sendEmail(from_addr, password, to_addr, smtp_server, file_list):
nowDate
=
str
(time.strftime(ISOTIMEFORMAT, time.localtime()))
html_content_start
=
\
'''
<html>
<body>
<p>hi,All:</p>
<table border="0"width="95%"height="50%"cellpadding="1"style="margin:15px"cellspacing="1"bordercolor="#D3D3D3"bgcolor="#9F9F9F">
<tr bgcolor="#D3D3D3" style="margin:10px">
<th style="padding:6;font-size:16">工作事项</th>
<th style="padding:6;font-size:16">负责人</th>
<th style="padding:6;font-size:16">进度</th>
<th style="padding:6;font-size:16">风险与问题</th>
</tr>
'''
for
i
in
range
(
len
(file_list)):
work
=
file_list[i]
workdata, person_name, progress, issue
=
str
(work[
0
]),
str
(work[
1
]),
str
(work[
2
]),
str
(work[
3
])
if
'.'
in
str
(work[
2
]):
# 填的数字
progress
=
"%.0f%%"
%
(work[
2
]
*
100
)
# 浮点转成百分比
updateTime
=
xldate_as_tuple(work[
4
],
0
)
value
=
datetime(
*
updateTime)
# 先转换为时间数组,然后转换为其他格式
timeStruct
=
time.strptime(
str
(value),
"%Y-%m-%d %H:%M:%S"
)
uptTime
=
str
(time.strftime(
"%Y%m%d"
, timeStruct))
if
uptTime !
=
nowDate:
raise
RuntimeError(
'有人没有更新最新记录:'
+
str
(work[
1
]))
html_content_suffer
=
\
'''
<tr bgcolor="#FFFFFF" >
<td style="padding:6;font-size:14">{workdata}</td>
<td style="padding:6;font-size:14">{person_name}</td>
<td style="padding:6;font-size:14">{progress}</td>
<td style="padding:6;font-size:14">{issue}</td>
</tr>
'''
.
format
(workdata
=
workdata.replace('\n
', '
<br>'), person_name
=
person_name, progress
=
progress, issue
=
issue)
html_content_start
+
=
html_content_suffer
html_content_end
=
\
'''
</table>
</body>
</html>
'''
html_content
=
html_content_start
+
html_content_end
try
:
msg
=
MIMEMultipart()
msg.attach(MIMEText(html_content,
'html'
,
'utf-8'
))
msg[
'From'
]
=
_format_addr(
'发送方 <%s>'
%
from_addr)
msg[
'To'
]
=
_format_addr(to_addr
+
'<%s>'
%
to_addr)
msg[
'Subject'
]
=
Header(
'主题'
+
nowDate,
'utf-8'
).encode()
server
=
smtplib.SMTP_SSL(smtp_server,
465
)
server.login(from_addr, password)
# 登录邮箱服务器
server.sendmail(from_addr, [to_addr], msg.as_string())
# 发送信息
server.quit()
print
(
"from_addr:"
+
str
(from_addr),
" to_addr:"
, to_addr,
"已发送成功!"
)
except
Exception as e:
print
(
"发送失败"
+
e)
def
job():
root_dir
=
'D:\\develop\\python\\file'
file_path
=
root_dir
+
"\\excel.xlsx"
from_addr
=
'aaa@163.com'
# 邮箱登录用户名
password
=
'mima'
# 登录密码
smtp_server
=
'smtp.com'
# 服务器地址,默认端口号25
to_addr
=
'aaa@163.com'
# 接收方邮箱
file_list
=
read_file(file_path)
sendEmail(from_addr, password, to_addr, smtp_server, file_list)
print
(
'发送完成'
)
if
__name__
=
=
'__main__'
:
# 该示例代码生成了一个BlockingScheduler调度器,使用了默认的任务存储MemoryJobStore,以及默认的执行器ThreadPoolExecutor,并且最大线程数为10。
# BlockingScheduler:在进程中运行单个任务,调度器是唯一运行的东西
scheduler
=
BlockingScheduler()
# 采用阻塞的方式
# 采用corn的方式,每天18点发送
scheduler.add_job(job,
'cron'
, hour
=
'18'
)
'''
year (int|str) – 4-digit year
month (int|str) – month (1-12)
day (int|str) – day of the (1-31)
week (int|str) – ISO week (1-53)
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – hour (0-23)
minute (int|str) – minute (0-59)
econd (int|str) – second (0-59)
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)
end_date (datetime|str) – latest possible date/time to trigger on (inclusive)
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)
* any Fire on every value
*/a any Fire every a values, starting from the minimum
a-b any Fire on any value within the a-b range (a must be smaller than b)
a-b/c any Fire every c values within the a-b range
xth y day Fire on the x -th occurrence of weekday y within the month
last x day Fire on the last occurrence of weekday x within the month
last day Fire on the last day within the month
x,y,z any Fire on any matching expression; can combine any number of any of the above expressions
'''
scheduler.start()
|
表格如下:
如果放在linux系统中执行,上述脚本不能执行成功,是因为对编码等有要求,全部更新代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#coding=utf-8
import
time
from
datetime
import
datetime
from
email.header
import
Header
from
email.mime.multipart
import
MIMEMultipart
from
email.mime.text
import
MIMEText
from
email.utils
import
parseaddr, formataddr
import
sys
import
xlrd
from
apscheduler.schedulers.blocking
import
BlockingScheduler
from
xlrd
import
xldate_as_tuple
ISOTIMEFORMAT
=
'%Y%m%d'
import
smtplib
import
logging
logging.basicConfig()
def
read_file(file_path):
file_list
=
[]
work_book
=
xlrd.open_workbook(file_path)
sheet_data
=
work_book.sheet_by_name(
'Sheet1'
)
print
(
'now is process :'
, sheet_data.name)
Nrows
=
sheet_data.nrows
for
i
in
range
(
1
, Nrows):
file_list.append(sheet_data.row_values(i))
return
file_list
def
_format_addr(s):
name, addr
=
parseaddr(s)
return
formataddr((Header(name,
'utf-8'
).encode(), addr))
def
sendEmail(from_addr, password, to_addr, smtp_server, file_list):
nowDate
=
str
(time.strftime(ISOTIMEFORMAT, time.localtime()))
html_content_start
=
\
'''
<html>
<body>
<p>hi,All:</p>
<table border="0"width="95%"height="50%"cellpadding="1"style="margin:15px"cellspacing="1"bordercolor="#D3D3D3"bgcolor="#9F9F9F">
<tr bgcolor="#D3D3D3" style="margin:10px">
<th style="padding:6;font-size:16">工作事项</th>
<th style="padding:6;font-size:16">负责人</th>
<th style="padding:6;font-size:16">进度</th>
<th style="padding:6;font-size:16">风险与问题</th>
</tr>
'''
for
i
in
range
(
len
(file_list)):
work
=
file_list[i]
workdata, person_name, progress, issue
=
str
(work[
0
]),
str
(work[
1
]),
str
(work[
2
]),
str
(work[
3
])
if
'.'
in
str
(work[
2
]):
# 填的数字
progress
=
"%.0f%%"
%
(work[
2
]
*
100
)
# 浮点转成百分比
updateTime
=
xldate_as_tuple(work[
4
],
0
)
value
=
datetime(
*
updateTime)
# 先转换为时间数组,然后转换为其他格式
timeStruct
=
time.strptime(
str
(value),
"%Y-%m-%d %H:%M:%S"
)
uptTime
=
str
(time.strftime(
"%Y%m%d"
, timeStruct))
if
uptTime !
=
nowDate:
raise
RuntimeError(
'有人没有更新最新记录:'
+
str
(work[
1
]))
html_content_suffer
=
\
'''
<tr bgcolor="#FFFFFF" >
<td style="padding:6;font-size:14">{workdata}</td>
<td style="padding:6;font-size:14">{person_name}</td>
<td style="padding:6;font-size:14">{progress}</td>
<td style="padding:6;font-size:14">{issue}</td>
</tr>
'''
.
format
(workdata
=
workdata.replace('\n
', '
<br>
'), person_name=person_name.replace('
\n
', '
<br>
'), progress=progress.replace('
\n
', '
<br>
'), issue=issue.replace('
\n
', '
<br>'))
html_content_start
+
=
html_content_suffer
html_content_end
=
\
'''
</table>
</body>
</html>
'''
html_content
=
html_content_start
+
html_content_end
try
:
msg
=
MIMEMultipart()
msg.attach(MIMEText(html_content,
'html'
,
'utf-8'
))
msg[
'From'
]
=
_format_addr(
'发送方 <%s>'
%
from_addr)
msg[
'To'
]
=
_format_addr(to_addr
+
'<%s>'
%
to_addr)
msg[
'Subject'
]
=
Header(
'主题'
+
nowDate,
'utf-8'
).encode()
server
=
smtplib.SMTP_SSL(smtp_server,
465
)
server.login(from_addr, password)
# 登录邮箱服务器
server.sendmail(from_addr, [to_addr], msg.as_string())
# 发送信息
server.quit()
print
(
"from_addr:"
+
str
(from_addr),
" to_addr:"
, to_addr,
"已发送成功!"
)
except
Exception as e:
print
(
"发送失败"
+
e)
def
job():
root_dir
=
'D:\\develop\\python\\file'
file_path
=
root_dir
+
"\\excel.xlsx"
from_addr
=
'aaa@163.com'
# 邮箱登录用户名
password
=
'mima'
# 登录密码
smtp_server
=
'smtp.com'
# 服务器地址,默认端口号25
to_addr
=
'aaa@163.com'
# 接收方邮箱
file_list
=
read_file(file_path)
sendEmail(from_addr, password, to_addr, smtp_server, file_list)
print
(
'发送完成'
)
if
__name__
=
=
'__main__'
:
# 该示例代码生成了一个BlockingScheduler调度器,使用了默认的任务存储MemoryJobStore,以及默认的执行器ThreadPoolExecutor,并且最大线程数为10。
# BlockingScheduler:在进程中运行单个任务,调度器是唯一运行的东西
scheduler
=
BlockingScheduler()
# 采用阻塞的方式
reload
(sys)
sys.setdefaultencoding(
"utf8"
)
# 采用corn的方式
scheduler.add_job(job,
'cron'
, hour
=
'21'
, minute
=
'0'
)
'''
year (int|str) – 4-digit year
month (int|str) – month (1-12)
day (int|str) – day of the (1-31)
week (int|str) – ISO week (1-53)
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – hour (0-23)
minute (int|str) – minute (0-59)
econd (int|str) – second (0-59)
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)
end_date (datetime|str) – latest possible date/time to trigger on (inclusive)
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)
* any Fire on every value
*/a any Fire every a values, starting from the minimum
a-b any Fire on any value within the a-b range (a must be smaller than b)
a-b/c any Fire every c values within the a-b range
xth y day Fire on the x -th occurrence of weekday y within the month
last x day Fire on the last occurrence of weekday x within the month
last day Fire on the last day within the month
x,y,z any Fire on any matching expression; can combine any number of any of the above expressions
'''
scheduler.start()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_35956041/article/details/102574867 。
最后此篇关于python脚本定时发送邮件的文章就讲到这里了,如果你想了解更多关于python脚本定时发送邮件的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 voip 推送通知制作 ios 应用程序。 我想从 Node js 发送 voip 推送通知,但不是很好。 我阅读了本教程 CallKit iOS Swift Tutorial for V
我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发回 404,但是当我调用 send() 时没有错误,但消息不会出现在网络上浏览器,除非我关闭连接? 有什么建议吗? 接受来自浏览器的
#include int main() { char c = getchar(); //EOF (ctrl + d ) while( ( c = getchar() ) != '?'
我正在尝试使用MailMessage对象通过PowerShell发送电子邮件。该脚本使用Import-CSV来使用文件,然后在电子邮件正文中使用ConvertTo-HTML。由于我要发送的电子邮件客户
我需要创建一个脚本,每 30 秒对网络流量进行一次采样并存储发送/接收的字节。该数据随后用于绘制图形。我编写了一个在 Windows 2012 上完美运行的程序,但我意识到某些 cmdlet 在以前的
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
当我使用网络浏览器测试我的程序时,我可以很好地写入套接字/FD,所以我决定循环它并在连接中途切断连接,我发现了一个问题。 send() 能够在套接字不可用时关闭整个程序。我认为问题在于该程序陷入了第
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
所以我试图向自己发送数据并接收数据然后打印它,现在我已经测试了一段时间,我注意到它没有发送任何东西,事实上,也许它是,但我没有正确接收它,我需要这方面的帮助。 这就是我用来发送数据的
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用 java 本质上将对象作为一个巨大的字符串发送,并用标记来分隔变量。 我的逻辑:我选择这个是因为它几乎消除了语言依赖性(忽略java的修改
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
我有一个包含三个单选按钮选项的表单。我需要将表单数据提交到另一个文件,但由于某种原因,发送的数据包含所选单选按钮的值“on”,而不是 value 属性的值。 我尝试通过 post() 函数手动操作和发
基本上我想实现这样的目标: Process 1 Thread 1 Receive X from process 2 Thread 2 Receive Y from proces
我目前正在 Google App Engine 上开发一个系统,对它还很陌生,我正在使用 Java 平台进行开发。我在 servlet 之间发送 session 对象时遇到问题。我已经在 appeng
当我尝试将“this”(触发的元素)作为参数发送给函数时,函数收到“Object[Document build.php]”作为参数,而不是触发的元素。请让我知道我的错误: function set(a
我正在寻找让我的应用响应联系人 > 发送的魔法咒语。我希望能够接收联系人的 URI 以便检索联系人。谁有 list 过滤器/代码 fragment 吗? 最佳答案 我没有睾丸,但您可以尝试基于 ACT
关于我心爱的套接字的另一个问题。我先解释一下我的情况。之后我会告诉你是什么困扰着我。 我有一个客户端和一个服务器。这两个应用程序都是用 C++ 编写的,实现了 winsock2。连接通过 TCP 和
我看到了这篇文章 http://www.eskimo.com/~scs/cclass/int/sx5.html 但这部分让我感到困惑:如果我们已经使用 send_array 或 send_array_
我对这行代码有疑问。我必须将一个数据包带到一个端口并重新发送到接口(interface)(例如:eth0)。我的程序成功地从端口获取数据包,但是当我重新发送(使用 send())到接口(interfa
我正在尝试编写一个 X11 输入驱动程序,它可以使用我的 Android 手机上的触摸屏来移动和单击鼠标。我可以正常移动鼠标,但我无法让应用程序正确识别点击。我当前的代码位于 https://gist
我是一名优秀的程序员,十分优秀!