Quick Script: Email all recent Perforce users

Here’s a script I whipped up in order to send an email to all recent Perforce users. I needed this because my company uses a shared license, so all user accounts are shared between our perforce servers. When a server needs to go down for maintenance, I like to email only those people who actually use it. This uses python, but it does not require the p4python api (though I imagine it would be quite simpler using it). I’m sure there are some imports that need to be cleaned up, but whatever, it’s just a quickie.

#!/usr/bin/python

import marshal
import subprocess, shlex
import re
import os
from datetime import datetime
import time
import smtplib
from email.mime.text import MIMEText

today = int(time.time())

window = 60*60*24*30 #30 days

mailhost = "mailhost"
me = "you@yoursite.com"

maxmails = 10

msg = MIMEText("Perforce server is going down! Lookout!")
msg['Subject'] = "Perforce downtime this weekend"
msg['From'] = me

def getRecentUsersList():
args = shlex.split("p4 -G users")
p = subprocess.Popen(args, stdout=subprocess.PIPE)
userList = []
while True:
try:
user = marshal.load(p.stdout)
if int(user['Access']) > (today-window):
userList.append(user)
except:
break
return userList

def getUniqueEmails(userList):
emails = {}
for user in userList:
emails[user['Email']] = 1
print "got " + str(len(emails.keys())) + " emails"
return emails.keys()

def sendEmail(emails):
print "sending email to "+str(emails)
s = smtplib.SMTP(mailhost)
s.sendmail(me, emails, msg.as_string())
s.quit()

def sendEmails(emails):
emailsubset = []
for email in emails:
emailsubset.append(email)
if len(emailsubset) >= maxmails:
sendEmail(emailsubset)
emailsubset = []
if len(emailsubset) > 0:
sendEmail(emailsubset)

def main():
userList = getRecentUsersList()
emails = getUniqueEmails(userList)
sendEmails(emails)

main()
Written on August 23, 2012