之前有用过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. Eclipse4JavaEE安装SpringBoot

    第一步:下载SpringBoot SpringBoot官网下载链接 第二步:在Eclipse里进行安装 打开Eclipse,菜单栏Help ->Install New Software,进入下图 ...

  2. Android ADB命令详解

    adb的全称为Android Debug Bridge.是android司机经常用到的工具 . 你能在本篇文章中学到什么? adb基本指令 Shell AM&PM adb模拟用户事件 logc ...

  3. Android之CircleImageView使用

    文章大纲 一.什么是CircleImageView二.代码实战三.项目源码下载 一.什么是CircleImageView   圆角 ImageView,在我们的 App 中这个想必是太常见了,也许我们 ...

  4. Android屏幕适配讲解与实战

    文章大纲 一.屏幕适配是什么二. 重要概念讲解三.屏幕适配实战四.项目源码下载   一.屏幕适配是什么   Android中屏幕适配就是通过对尺寸单位.图片.文字.布局这四种类型的资源进行合理的设计和 ...

  5. 使用 HttpRequester 更方便的发起 HTTP 请求

    使用 HttpRequester 更方便的发起 HTTP 请求 Intro 一直感觉 .net 里面(这里主要说的是 .net framework 下)发送 HTTP 请求的方式用着不是特别好用,而且 ...

  6. Windows Server 2016-批量设置用户下次登陆须更改密码

    Powershell设置某OU下所有用户下次登陆必须更改密码: Get-ADUser -Filter * -SearchBase "ou=syncall,dc=azureyun,dc=com ...

  7. navicat导入.sql文件

    用Navicat for Mysql导入.sql文件   虽然这算不上什么难事,但是对于新手来说(比如说我),Navicat for MySQL里的导出连接.运行SQL文件.导入向导.还原备份.这些功 ...

  8. 了解一下RabbitMQ

    RabbitMQ概述 RabbitMQ是遵从AMQP协议的 通信协议都设计到报文交互,换句话说RabbitMQ就是AMQP协议的Erlang的实现. AMQP说到底还是一个通信协议从low-level ...

  9. 学习Identity Server 4的预备知识 (误删, 重补)

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  10. 我眼中的 Nginx(二):HTTP/2 dynamic table size update

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...