python自动上报设备的ip到指定邮箱

1.发送邮件的账号需打开SMTP和其他有一些服务服务,以qq为例,需到设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中设置。

2.这里使用到的包,python环境里面基本都有,没有的话,就需要先使用pip进行安装。若在python2.7中运行,请去掉所有中文信息,包括注解中的中文,sendip.py文件的具体实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# version <= python 2.7
# __author__ = 'Page Wong'

import array
import struct
import socket
import fcntl
from datetime import datetime
import smtplib
from email.mime.text import MIMEText

def get_ip_address():
   #先获取所有网络接口
   SIOCGIFCONF = 0x8912
   SIOCGIFADDR = 0x8915
   BYTES = 4096
   sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   names = array.array('B', b'\0' * BYTES)
   bytelen = \
   struct.unpack('iL', fcntl.ioctl(sck.fileno(), SIOCGIFCONF, struct.pack('iL', BYTES, names.buffer_info()[0])))[0]
   namestr = names.tostring()
   ifaces = [namestr[i:i + 32].split('\0', 1)[0] for i in range(0, bytelen, 32)]

   #再获取每个接口的IP地址
   iplist = []
   for ifname in ifaces:
   ip = socket.inet_ntoa(fcntl.ioctl(sck.fileno(), SIOCGIFADDR, struct.pack('256s', ifname[:15]))[20:24])
   iplist.append(ifname + ':' + ip)
   return iplist


def ip_save_file(iptxt):
   #获取当前时间,因为每次启动IP都在变,记录上时间容易区分
   now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
   ##写入文件
   with open('ipaddress.txt', 'w') as f:
   f.write(now + '\r\n')
   for ip in get_ip_address():
   f.write(ip + '\r\n')


def ip_send_mail(iptxt):
   #收件人邮箱
   toaddrs = '15527007322@163.com'
   #发件人邮箱
   fromaddr = '2443904383@qq.com'
   #设置发件人账号
   username = '2443904383@qq.com'
   #设置发件人密码(qq的这个密码是邮箱设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 里面生成的授权码,别的邮箱可能也有类似的坑)
   password = '11111111aaaa'
   #设置SMTP服务器(qq的服务器和端口如下,虽然SMTP默认的端口是25,但是估计每家都会有自己的操作,具体需查资料再填)
   smtp_sever = 'smtp.qq.com:587'
   server = smtplib.SMTP(smtp_sever)

   #设置邮件正文,get_ip_address()返回的是list,要转换成str
   ip = '\r\n'.join(iptxt)

   #设置邮件标题和正文
   msg = MIMEText(ip, 'plain', 'utf-8')
   msg['Subject'] = 'IP For RaspberryPi'
   msg['From'] = fromaddr
   msg['To'] = toaddrs
   #启动SMTP发送邮件
   server.ehlo()
   server.starttls()
   server.login(username, password)
   server.sendmail(fromaddr, toaddrs, msg.as_string())
   server.quit()


def main():
   #获取IP
   iptxt = get_ip_address()
   #IP存入文件,如果直接发送邮件,这步可以省略。
   ip_save_file(iptxt)
   #IP地址发送到指定邮箱
   ip_send_mail(iptxt)

#if __name__ == '__main__':
#    main()

main()

3.使用 python sendip.py 执行脚本文件测试一下能不能发送邮件了。

4.配置开机启动。编辑文件 sudo nano /etc/rc.local 在文件内容 exit 0 的上面添加 python /home/pi/sendip.py > /home/pi/sendip.log 具体命令根据情况自己调整。具体情况如下图所示,图中信息除了我加的那句脚本,其他都是文件里面本来就有的信息。

5.重启机器,看是不是能成功发送ip到邮件。

参考文章:https://github.com/pagewong/Get-ip-address

发布者:songJian   点击数:793   发布时间:2019-09-06 08:46:19   更新时间:2019-09-10 16:49:23
正在加载评论...
相关文章