之前有用过Linux自带的mail工具来定时发送邮件,但是要装mailx还有配mail.rc,这还比较正常,关键是到了ubantu下这工具用起来真是操蛋,如果哪天其他的unix like操作系统也有需求,那就太麻烦了,所以我用自带的python2.6.6和自带的邮件相关的库写了个小工具,使用步骤如下:

一、申请一个163邮箱,作为发件箱。

不用qq邮箱是因为,qq邮箱的SMTP服务器需要独立的密码,比较麻烦一点。

二、创建如下脚本,改名为SendMail.py:

注意将以下脚本中的from_addr和password改为你自己的163邮箱和密码即可。

#!/usr/bin/python
# -*- coding: utf-8 -*- from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import os,sys
import smtplib
import getopt #使用帮助
def usage():
print('''Usage:
SendMail.py [Options]
eg. SendMail.py -s "邮件标题" -c "邮件正文" -d "xxx@xxx.com,yyy@yyy.com" --content-file mail_content.txt --attach attachment.log
Options:
-h/--help 显示此帮助
-s 邮件标题,例如: -s "这里是邮件标题"
-c 邮件正文,例如: -c "这里是邮件正文"
-d 邮件接收地址,例如: -d "xxx@xxx.com,yyy@yyy.com"
--content-file 包含邮件正文的文件,例如: --content-file mail_content.txt
--attach 附件,可以是绝对或相对路径,例如: --attach attachment.log 或者 --attach /var/log/attachment.log
Ps:目前此脚本只支持一个附件,暂无发送多个附件的需求
''') #参数解析
def argParse():
subject,content,destAddr,content_file,attachment=None,None,None,None,None
'''
如果参数很多,可以选择用argparse模块,argparse是更加完善、更加简单的参数解析工具,这里用getopt只是因为想试下getopt怎么用。
getopt(args, shortopts, longopts = [])
shortopts表示短项参数,longopts表示长项参数,前者使用'-'后者使用'--',需要后接具体参数的短项参数后需要加冒号':'标识,longopts则必须以=结尾,赋值时写不写等号无所谓因为默认是模糊匹配的。
getopt的返回值分两部分,第一部分是所有配置项和其值的list,类似[(opt1,val1),(opt2,val2),...],第二部分是未知的多余参数,我们只需要在第一部分的list取参数即可。
第二部分一般无需关注,因为我们会使用getopt.GetoptError直接过滤掉这些参数(即直接报option xxx not recognized)。
'''
try:
sopts, lopts = getopt.getopt(sys.argv[1:],"hs:c:d:",["help","content-file=","attach="])
except getopt.GetoptError as e:
print("GetoptError:")
print(e)
sys.exit(-1)
for opt,arg in sopts:
if opt == '-s':
subject=arg
elif opt == '-c':
content=arg
elif opt == '-d':
destAddr=arg
elif opt == '--attach':
attachment=arg
elif opt == '--content-file':
content_file=arg
elif opt == '--attach':
attachment=arg
else:
usage()
sys.exit(-1)
#subject,destAddr必须不能为空
if not subject or not destAddr:
usage()
print("Error: subject and destination must not be null!")
sys.exit(-1)
#处理正文文件,如果存在正文文件,那么忽略-c参数,以文件内容为邮件正文
if content_file and os.path.exists(content_file):
try:
with open(content_file) as f1:
content=f1.read()
except:
print("Can't open or read the content file!")
exit(-1)
else:
pass
return {'s':subject,'c':content,'d':destAddr,'a':attachment,} #发送邮件
def main():
opts=argParse()
subject,content,dest,attach=opts['s'],opts['c'],opts['d'],opts['a']
#通用第三方smtp服务器账号密码
smtp_server = 'smtp.163.com'
from_addr = '你的163发件箱'
password = '你的163发件箱密码'
to_addr = list(dest.split(",")) msg = MIMEMultipart()
msg['From'] = from_addr
msg['To'] = ','.join(to_addr)
msg['Subject'] = subject
msg.attach(MIMEText(content, 'plain', 'utf-8')) #处理附件
if attach and os.path.exists(attach):
try:
with open(attach) as f2:
mime=f2.read()
#目前懒的再写多个附件了,因此只支持一个附件
attach1=MIMEApplication(mime)
attach1.add_header('Content-Disposition','attachment',filename=attach)
msg.attach(attach1)
except:
print("Can't open or read the attach file!")
exit(-1)
else:
pass
 
server = smtplib.SMTP_SSL(smtp_server, 465) #如果使用的25端口的非加密通道,那么使用SMTP方法替换SMTP_SSL
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit() if __name__=='__main__':
main()

三、更改权限后就可以在安装了python的服务器上发送邮件啦(一般服务器都自带python2版本)。

例如:

[root@python leo]# chmod 755 SendMail.py
[root@python leo]# ./SendMail.py -s "邮件标题" -c "邮件正文" -d "xxx@qq.com" --content-file mail.txt

Python编写的Linux邮件发送工具的更多相关文章

  1. kali 下的邮件发送工具 swaks

    kali 下的邮件发送工具 swaks Swaks 是一个功能强大,灵活,可编写脚本,面向事务的 SMTP 测试工具,目前 Swaks 托管在私有 svn 存储库中. 官方项目 http://jetm ...

  2. 邮件发送工具类 SendMail.java

    package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...

  3. java 邮件发送工具类

    首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...

  4. QT开发之旅四邮件发送工具

    终于有了一个晚上安静的写写程序,最近一直忙着公司商务上的事情,一直想用QT实现一个调用最底层socket通信来实现的邮件发送程序,以前用C#写过,微软都封装好的,不知道底层是如何实现的,只知道调用方法 ...

  5. java 邮件发送工具类【来源网络自己已经实际应用】

    最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...

  6. Python 原生2种 邮件发送(发送验证码) 的方法

    import smtplib from email.mime.text import MIMEText # 第三方 SMTP 服务 mail_host = "smtp.sina.cn&quo ...

  7. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类

    准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://www.cnblogs.com/pojo/p/14276637.html ...

  8. python系统监控及邮件发送

    python系统监控及邮件发送   #psutil模块是一个跨平台库,能轻松实现获取系统运行的进程和系统利用率   import psutil                              ...

  9. 用python编写的定向arp欺骗工具

    刚学习了scapy模块的一些用法,非常强大,为了练手,利用此模块编写了一个arp欺骗工具,其核心是构造arp欺骗包.加了一个-a参数用于进行全网欺骗,先暂不实现.代码如下: #--*--coding= ...

随机推荐

  1. css样式的继承性、层叠性 、优先级

    一.css样式的继承性: 作用:给父元素设置一些属性,子元素也可以使用 应用场景: 一般用于设置网页上的一些共性信息,例如网页的文字颜色,字体,文字大小等内容.优化代码,降低工作量 注意点: 1.并不 ...

  2. WeihanLi.Redis自定义序列化及压缩方式

    WeihanLi.Redis自定义序列化及压缩方式 Intro WeihanLi.Redis 是基于 StackExchange.Redis 的扩展,提供了一些常用的业务组件和对泛型的更好支持,默认使 ...

  3. Iterm2/Mac自带终端工具快速进入你想进入的虚拟机教程

    一.首先我们在终端本地要写一个登录的脚本,eg: 当然首先要touch login.sh 啦,下面就是脚本文件,比较low,大神勿喷,会更炫酷写法的小伙伴可以自己参考这个思路写,不会的直接复制就好啦 ...

  4. 「技巧」如何将Sketch改为深色模式

    之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...

  5. ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

    微软发布了其最新版本的机器学习框架:ML.NET 0.11带来了新功能和突破性变化. 新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能,但也包括一些重大变化, 这也是发布RC版本之 ...

  6. SpringSecurity设置角色和权限的注意点

    概念 在UserDetailsService的loadUserByUsername方法里去构建当前登陆的用户时,你可以选择两种授权方法,即角色授权和权限授权,对应使用的代码是hasRole和hasAu ...

  7. Python命令行参数解析模块argparse

    当写一个Python脚本时经常会遇到不同参数不同功能的情况,如何做一个更好看的命令帮助信息以及对命令参数解析呢? 这就需要使用argparse模块 #!/usr/bin/env python # -* ...

  8. 大名鼎鼎的Requests库用了什么编码风格?

    原文:https://www.kennethreitz.org/essays/kenneth-reitzs-code-style 作者:Kenneth Reitz 原题:Kenneth Reitz’s ...

  9. Java 核心系列教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最 ...

  10. Virtual Box虚拟机Ubuntu18.X系统安装及Mysql基本开发配置

    Linux简介 什么是 Linux? Linux:世界上不仅只有一个 Windows 操作系统,还有 Linux.mac.Unix 等操作系统.桌面操作系统下 Windows 是霸主,而 Linux ...