       continue if dt_expires.isBefore() # skip expired
     continue if 'type' of params and params.type != e.type
     continue if 'search' of params and e.val.indexOf(params.search) == -1
+    if 'expire_notify' of params # if pre-expiration notify, only do it once
+      continue if 'expire_notified' of e and e.expire_notified
+      e.expire_notified = true
     reason = ''
     reason = e.reason if 'reason' of e
     if reason.indexOf("\n") > 0

  who = msg.envelope.user.name
  who = msg.match[2] if msg.match[2]

  logmsg = "#{modulename}: #{user.name} requested: unsubscribe #{list_name} #{who}"
  robot.logger.info logmsg

  unless list_name of fwdata.notify

      addrs = args.i.split(',') if args.i.indexOf(',') > 0
    if addrs is false
      usermsg = "#{func_name}: invalid ip-address or cidr"
      logmsg = "#{modulename}_#{func_name}: #{who} request failed: #{usermsg}"
      robot.logger.info logmsg
      return msg.send usermsg
    for addr in addrs
