I'm working on a similar issue where I need to forward entries from an ancient calendar product to my google calendar.
I have been able to successfully e-mail a hand-created (for now) .ics file from one e-mail account to my google e-mail account, and have it show up in my calendar.
On my first attempt, I just put in the bare minimum to make it a vCalendar entry. Start date, end date, date created, and the event description. That made it to my gmail account, but not directly into the calendar.
The second attempt included all from the first attempt plus PRODID, VERSION, CALSCALE, and ATTENDEE. PRODID was a totally made up entry. VERSION was set to 2.0. CALSCALE was set to GREGORIAN, and the ATTENDEE information was a direct lift out of an entry I sent myself just to look at from my google calendar. It's a fairly long entry, and may not be needed. But I havent tried without yet. I sent that file, and it made it all the way into my calendar automatically. It was still in my unopened e-mail, but it did make it on to my calendar.
I was also able to take a similar file and add a VALARM section to successfully add a popup alarm for my phone.
I have not been able to automatically remove or change a calendar entry by the same method yet. Both of which I need to be able to do.
Some additional testing I need to do involves putting the entries on something other than my base calendar. For example a calendar called "Work" that I've created and subscribed to. I suspect it has to do with the CN reference in ATTENDEE, but time will tell.
If I come up with any additional details, I will post them here.
EDIT: The CN reference does not place the entry in the calendar I want. Continuing to explore.
EDIT: Some additional information. ATTENDEE is required to get the entry into the calendar via e-mail. The entry will only, at this point anyway, go into the base/primary user calendar. At a minimum, ATTENDEE seems to require:
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED
:mailto:username@emailserver
Where username@emailserver is the actual email address of the recipient.
I've tried with both METHOD:PUBLISH and METHOD:REQUEST. Both act the same.