搜索
简帛阁>技术文章>[linux & python] linux下基于python自动定时发送邮件附件

[linux & python] linux下基于python自动定时发送邮件附件

linux下基于python自动定时发送邮件附件

暂时接手一个离职前端实习生的工作,昨天第一次对接产品,跟我说每天晚上要给她发送一个当天的报表。
每天?excuse me?每天?开什么国际玩笑。每天干同一个工作,这要不给整成auto的,还怎么自称屌丝程序猴。今天果断研究了下自动发送邮件。
原理不懂,只实现功能

主要是两部分
python自动发送邮件, 基于SMTP协议,使用email和smtplib库
linux定时执行, cron

AUTO-Email python code

功能描述:
将一个以日期格式命名(yyyymmdd)的文件夹压缩zip包,通过邮件附件形式发送指定邮箱。

#!/bin/env python
# -*- coding: utf-8 -*-

import datetime
import smtplib
import os,sys
from email import Encoders  
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from optparse import OptionParser

HOME=sys.path[0]
#sender name and password
sendername="haha"                       #your email name
sendername_all="haha@hehe.com"          #your email
senderpass="wonazhidao"                 #email password
#list of all receiver (include cc-receiver)
receiverlist=["haha1@hehe.com","haha2@hehe.com"]        #收件人
receivertmplist=[]      
receivercctmplist=[]                                    #抄送人

#make a mail    
mailall=MIMEMultipart()

today=str(datetime.date.today()).replace('-','')        #今天日期

mailcontent="haha"                                      
mailall.attach(MIMEText(mailcontent,'plain','utf-8'))   #邮件正文内容,类型是plain, or html(复杂)
title=today+" Data report"
#today=os.path.join(HOME,today)
attfilePath=today+'.zip'

if os.path.exists(today):
    sys_cmd="zip -r %s %s"%(attfilePath,today)
    os.system(sys_cmd)
    if not os.path.isfile(attfilePath):
        print("no zip file")
else:
    print("no folder")

#添加zip邮件附件(通用其他文件格式)
if os.path.isfile(attfilePath) and os.path.exists(today):
    with open(attfilePath,'rb') as f:
        contype = 'application/octet-stream'
        maintype,subtype=contype.split('/',1)
        attfile=MIMEBase(maintype,subtype)
        attfile.set_payload(f.read())
        Encoders.encode_base64(attfile)         #Base64编码(为啥不知道) 
        attfile.add_header('Content-Disposition','attachment',filename = attfilePath)   #头信息,貌似并不是附件名称
        print("attach file prepared!")
        mailall.attach(attfile)
else:
    title="some wrong!!!"
    print(title)

#title,sender,receiver,cc-receiver,
#邮件基本信息,主题,发送人,收件人,抄送人
mailall['Subject']=title    #options.title
mailall['From']=sendername_all
mailall['To']=str(receivertmplist)
if len(receivercctmplist) !=0:
    mailall['CC']=str(receivercctmplist)


#get the text of mailall
fullmailtext=mailall.as_string()
print("prepare fullmailtext ok.")
#mailconnect = smtplib.SMTP(options.server)
mailconnect = smtplib.SMTP("smtp.126.com")      #email server,port default 25
try:
    mailconnect.login(sendername,senderpass)
except Exception as e:
    print("error when connect the smtpserver with the given username and password !")
    print(e)

print("connect ok!")

try:
    mailconnect.sendmail(sendername_all, receiverlist, fullmailtext)
except Exception as e:
    print("error while sending the email!")
finally:
    mailconnect.quit()

print('email to '+str(receiverlist)+' over.')

定时执行cron

cron是linux下的定时执行工具,可以在无需人工干预的情况下运行作业。

root或su下操作。
首先查看cron是否启动。

service cron status     //查看cron状态
service crond start     //启动服务
service crond stop      //关闭服务
service crond restart   //重启服务
service crond reload    //重新载入配置

然后修改crontab.

crontab –e : 修改 crontab 文件,如果文件不存在会自动创建 
crontab –l : 显示 crontab 文件

#crontab书写格式:
minute(00-59) hour(00-24) day-of-month(01-31) month-of-year(01-12) day-of-week(0-6,0:Sunday) commands

在crontab中写入需要执行的命令和时间,前五个域是指定命令执行时间,最后一个域是执行命令。每个域之间使用空格或者制表符分隔。

除了数字还有几个特殊的符号:"*"、"/"和"-"、","
*代表所有的取值范围内的数字
"/"代表每的意思,"/5"表示每5个单位
"-"代表从某个数字到某个数字
","分开几个离散的数字

commands 注意
文件要写绝对路径
打印不会显示出来,在后台运行,做好重定向日志

0 6 * * * echo "Good morning."                  #6:00 every day
15 */2 * * * echo "Good morning."               #每两个小时的第15分钟
0 4 1 1 * echo "Good morning."                  #1月1日4:00
5,15,55 16,18 * * * echo "Good morning."        #每天16点、18点的5min、15min、55min执行

小坑记录

  1. smtp时先确保机器是能够ping通邮箱服务器的。公司的开发机器居然ping不通自己的email server!真尴尬,第一反应是端口被封了,试了半天没改善。
  2. cron,在命令执行时,如果涉及到shell或者py文件,注意要给到完整绝对路径,否则会出问题。
  3. 在执行py文件前,可以先将其编译pyo文件,保密并且载入执行的效率会高,删掉.py,执行.pyo即可。
    python -O -m py_compile /path/to/需要生成.pyo的脚本.py

Reference

首推每个的第一个
auto-email:
http://blog.csdn.net/lifeiaidajia/article/details/8525259
http://blog.csdn.net/kornberg_fresnel/article/details/51227761
http://blog.sina.com.cn/s/blog_78c913e30102x6i5.html
http://wjpingok.blog.51cto.com/5374697/1737182
cron:
http://www.cnblogs.com/kaituorensheng/p/4494321.html
http://blog.csdn.net/xionglangs/article/details/52913351

转载于:https://www.cnblogs.com/zhanxiage1994/p/7774934.html

linux基于python自动定时发送邮件附件暂时接手一个离职前端实习生的工作,昨天第一次对接产品,跟我说每天晚上要给她发送一个当天的报表。每天?excuseme?每天?开什么国际玩笑。每天干同一
python实现邮件发送(一)功能点:1、实现python发送邮件附件2、显示全部抄送人信息3、附件发送*coding:utf8*importsmtplibfromemailmimetextimpor
最近迁移了wordpress,系统升级为CentOS6,很奇怪的一个问题,在原来CentOS58用的很正常的定时备份数据库并通过邮件发送的脚本不能发送附件,其他都正常,邮件内容也是uuencode生
本文实例为大家分享了python使用sendmail发送邮件的具体代码,供大家参考,具体内容如下参考链接:HowdoIsendmailfromaPythonscript使用linux的sendmai
效果图fromwxpyimport*importrequestsfromdatetimeimportdatetimeimporttimefromapschedulerschedulersblockin
背景由于同学每周要通过邮箱收数学建模作业,100多人给她发附件,她要一个个地点着下载。太麻烦了,所以想用程序实现下载附件的功能。在网上查资料后,最终实现了稍为简单的下载附件功能,代码有些细节还不是很了
参考链接:HowdoIsendmailfromaPythonscript?使用linux的sendmail程序来发送邮件,利用popen函数(pythondocs关于popen函数)可以直接调用li
前言最近同事问了一个关于Python脚本自启动与定时任务的问题,发现很多的朋友对这块都不是特别的熟悉,所以本文主要给大家介绍的是关于LinuxPython脚本自启动与定时任务的相关内容,分享出来供大
uofangimg{maxwidth:100%!important;height:auto!important}介绍在linux65中已经自带了python26,并且yum程序使用的就是自带的pyt
可以使用Python的email模块来实现带有附件的邮件的发送。SMTP(SimpleMailTransferProtocol)邮件传送代理(MailTransferAgent,MTA)程序使用SM