When you have a specific use case like this, using functions in peripheral plugins often leads to frustration. That said - there are times when you are married to a particular plugin or approach, and you just need to build on top of it.
With this caveat, I think you should approach this at an angle , creating a new field type for contact form 7. So you have control over the display of the HTML field, validation data, among other things. It can also provide a starting point for storing a database and sending reminders later, as you mentioned in the comment to another answer.
Here's the approach in action:

The new field type is called emailplus , and you include it in the form of the following form:
<div class="cf7-duplicable-recipients"> <label>Main Recipient (required)</label> [emailplus emails] [submit "Sign Up"] </div>
In addition, I set the recipient in the "mail" panel in the form settings to [emails] .
If the emailsplus field is set as the recipient, the class overrides the default wpcf7 behavior and sends mail to each value in the email array, replacing all [emails] in the message body with -email basis.
The emailplus field emailplus encapsulated here in the class and commented liberally:
<?php class WPCF7_Duplicable_Email { public $emails = array(); public $tag_name; public function __construct() { add_action('wpcf7_init', array($this, 'add_emailplus_tag')); add_action('wpcf7_form_tag', array($this, 'assign_values_to_field')); add_filter('wpcf7_validate_emailplus', array($this, 'validate'), 2); add_action('wpcf7_before_send_mail', array($this, 'send_email')); add_action('wp_enqueue_scripts', array($this, 'emailplus_scripts')); } public function add_emailplus_tag() { wpcf7_add_shortcode( array('emailplus'), array($this, 'shortcode_handler'), true ); } public function shortcode_handler(array $tag) { $tag = new WPCF7_Shortcode($tag); if (true === empty($tag->name)) { return ''; } $validation_error = wpcf7_get_validation_error($tag->name); $class = wpcf7_form_controls_class($tag->type); if ($validation_error) { $class .= ' wpcf7-not-valid'; } $atts = array( 'class' => $tag->get_class_option($class), 'id' => $tag->get_id_option(), 'tabindex' => $tag->get_option('tabindex', 'int', true), 'aria-invalid' => $validation_error ? 'true' : 'false', 'type' => 'email', 'name' => $tag->name.'[]',
And a .js file that handles cloning. He should live in /path/to/your/theme/js/cf7-duplication.js' .
(function($) { $(document).ready(function() { var addEmailField = function(inputRow, container) { inputRow.find('input[type=email]').val(''); var removeButton = $('<a href="#">×</a>') .click(function(e) { e.preventDefault(); inputRow.remove(); }); inputRow.append(removeButton); inputRow.insertAfter(container.find('.emailplus-wrapper').last()); } $.each($('[data-wpcf7-duplicable-email]'), function(i, el) { var container = $(el); var inputRow = container.find('.emailplus-wrapper'); var addButton = $('<a href="#">Add another email</a>'); addButton.click(function(e) { e.preventDefault(); var newEmailField = inputRow.clone(); addEmailField(newEmailField, container); }); container.append(addButton); }); }); })(jQuery);
Last but not least, if you want the form to disappear when it is valid and the emails deleted, add it to the Advanced Settings panel.
on_sent_ok: "jQuery('.cf7-duplicable-recipients').fadeOut();"
This approach is best for CF7 AJAX views. If you want to extend it to handle POST vanilla requests, you can update the short code handler to display a few <input> fields where you need to keep the value attr for invalid views.