Delete images that can't be found
It isn't hard to make a list of missing images, removing them from bpy.data.images isn't always easy. The image knows how many times it is used but not where it is used, you will need to look through textures and nodes to find where it is used to clear the users before you will be allowed to delete the image.

I would suggest testing the existence of the image before packing rather than trying to cleanup the blend file. Use bpy.path.abspath() to get the true filepath for the image (this turns '//' into a real filepath) and then use os.path.exists() to check if there is a file you can pack.

import bpy, os

for i in bpy.data.images:
    if i.filepath:
        ipath = bpy.path.abspath(i.filepath)
        if os.path.exists(ipath):
            i.pack()


As you come across a missing image you could add it to a list and report the missing files when you are done. Maybe create the list in the text editor for the user to look through.