Writing a custom Rules Action for VBO- do I need to use Entity?
[I'm assuming you have a custom table to store these email addresses and are not related to any other entity]
With the latest version of VBO, yes, you have to define an Entity. 
See this issue in the VBO queue for more information. 

FYI, the below steps worked for me. 

function module_entity_info() {
  return array(
    'MY_NEW_ENTITY_TYPE' =&gt; array(
      'label' =&gt; t('MY_NEW_ENTITY_TYPE'),
      'base table' =&gt; 'MY_NEW_TABLE',
      'entity keys' =&gt; array(
        'id' =&gt; 'your_tables_primary_key',
      ),
    ),
  );
}


Note that in entity keys array, set the table's column as the key, and VBO will pick it up and will pass as an object to the action. See below:

function module_action_info() {
  return array(
    'module_remove_something' =&gt; array(
      'type' =&gt; 'MY_NEW_ENTITY_TYPE',
      'label' =&gt; 'Remove URL',
      'configurable' =&gt; FALSE,
      'behavior' =&gt; array('deletes_property'),
    ),
  );
}


In your views integration file, you will probably need to define the tables as an entity too. 

function mymodule_views_data() {
  $data['mymodule_emails'] = array(
    'table' =&gt; array(
      'base' =&gt; array(
        'field' =&gt; 'eeid',
        'title' =&gt; 'Extracted E-mails',
        'help' =&gt; 'Email addresses collected by parsing the remote URL',
      ),
      'group' =&gt; 'E-mail',
      'defaults' =&gt; array(
        'field' =&gt; 'email',
      ),
      'entity type' =&gt; 'MY_NEW_ENTITY_TYPE', // attention here!
    ),
   // Rest of the table definition...