0

Here is my dilemma. I have a vb.net application for requesting time using an asset. The user submits a request (can contain required and optional users), then an approver has to approve it. When it is approved, I want to send a meeting request. I can't do it using outlook code since it won't let me change the organizer. If I try to send it using outlook.application > outlook.olitemtype.olappointmentitem or whatever it is, it will default the organizer to the person sending the meeting request, which in this case is the approver, which I don't want. So I think I am left with trying to send an ical. This is where I am having issues. I can't use smtpclient to create the email and send it using the proper content-type, etc. I have to send it using outlook. So I create an ics file and add it as an attachment. I am not sure the difference between METHOD:PUBLISH and METHOD:REQUEST. All the searches I've have done say I should use method:request, but when i open the ICS file, it doesn't give me the options to accept, etc. It doesn't add to my calendar. I want the ability to be able to update and cancel the meeting as well, which I think I know how to do with uid, sequence, etc. I've done searches and just can't get to where I need to be. It looks like the best option is to use smtpclient to create the mail message where you add the headers and ical stuff, but I can't do that, is there a way to it using outlook?

If someone can help point me in the right direction, I would greatly appreciate it.

Here is my current code:

            Dim msg As MailMessage = New MailMessage
        msg.From = New MailAddress(br.requesting_user_email)
        msg.To.Add(New MailAddress(br.requesting_user_email))
        msg.Subject = variables.UserInfo.last_name & ", " + variables.UserInfo.first_name & " has approved your request through the Bench Scheduler."

        Dim bodytxt As String = "User: " & variables.UserInfo.last_name & ", " + variables.UserInfo.first_name & vbLf & "5+2: " + variables.UserInfo.username & vbLf & vbLf
        bodytxt += "Has approved your bench request for " & br.program_name & " - " & br.project_name & "." & vbLf & vbLf
        bodytxt += "Start: " & br.start_time & vbLf & "End: " & br.end_time & vbLf
        bodytxt += "Bench: " & br.bench_name & vbLf & "Priority: " & br.priority & vbLf & "Purpose: " & br.objective & vbLf & vbLf
        bodytxt += "Request Notes: " & br.notes & vbLf & vbLf
        bodytxt += vbLf & vbLf & vbLf & "This email was automatically generated by Bench Scheduler. You may respond to this email."

        msg.Body = bodytxt

        Dim str As StringBuilder = New StringBuilder
        str.AppendLine("BEGIN:VCALENDAR")
        str.AppendLine("PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN")
        str.AppendLine("VERSION:2.0")
        If cancel Then
            str.AppendLine("METHOD:CANCEL")
        Else
            str.AppendLine("METHOD:REQUEST")
        End If
        str.AppendLine("BEGIN:VEVENT")
        str.AppendLine("X-MS-OLK-FORCEINSPECTOROPEN:TRUE")
        str.AppendLine("BEGIN:VTIMEZONE")
        str.AppendLine("TZID:Eastern Standard Time")
        str.AppendLine("BEGIN:STANDARD")
        str.AppendLine("DTSTART:16011104T020000")
        str.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
        str.AppendLine("TZOFFSETFROM:-0400")
        str.AppendLine("TZOFFSETTO:-0500")
        str.AppendLine("END:STANDARD")
        str.AppendLine("BEGIN:DAYLIGHT")
        str.AppendLine("DTSTART:16010311T020000")
        str.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
        str.AppendLine("TZOFFSETFROM:-0500")
        str.AppendLine("TZOFFSETTO:-0400")
        str.AppendLine("END:DAYLIGHT")
        str.AppendLine("END:VTIMEZONE")

        Dim dt As New DataTable
        Dim ta As New BSDataSetTableAdapters.getUserRequestTableAdapter
        dt = ta.GetData(br.request_id, "T")

        For Each row As DataRow In dt.Rows
            If row("type") = "Required" Then
                str.AppendLine(String.Format("ATTENDEE;CN='{0}';RSVP=TRUE:mailto:{1}", row("username"), row("email")))
            ElseIf row("type") = "Optional" Then
                str.AppendLine(String.Format("ATTENDEE;CN='{0}';ROLE=OPT-PARTICIPANT;RSVP=TRUE:mailto:{1}", row("username"), row("email")))
            End If
        Next

        str.AppendLine("CLASS:PUBLIC")
        str.AppendLine("CREATED:" & Format(Date.Now, "yyyyMMddTHHmmssZ"))
        str.AppendLine(String.Format("DESCRIPTION:{0}", br.objective))
        str.AppendLine("DTEND;TZID=" & """" & "Eastern Standard Time" & """" & ":" & Format(CDate(br.end_time), "yyyyMMddTHHmmss"))
        str.AppendLine("DTSTAMP:" & Format(Date.Now, "yyyyMMddTHHmmssZ"))
        str.AppendLine("DTSTART;TZID=" & """" & "Eastern Standard Time" & """" & ":" & Format(CDate(br.start_time), "yyyyMMddTHHmmss"))
        str.AppendLine(String.Format("LOCATION:{0}", br.bench_name))
        str.AppendLine(String.Format("ORGANIZER;CN='" & br.requesting_username & "':mailto:" & br.requesting_user_email))
        str.AppendLine("PRIORITY:5")
        str.AppendLine("SEQUENCE:0")
        str.AppendLine(String.Format("SUMMARY;LANGUAGE=en-us:{0}", "Approved Bench Request (ID-" & br.request_id & "): " & br.program_name & "-" & br.project_name & "-" & br.activity))
        str.AppendLine("TRANSP:OPAQUE")
        str.AppendLine(String.Format("UID:{0}", br.uid))
        str.AppendLine(String.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", br.objective))

        str.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:BUSY")
        str.AppendLine("X-MICROSOFT-CDO-IMPORTANCE:1")
        str.AppendLine("X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY")
        str.AppendLine("X-MICROSOFT-DISALLOW-COUNTER:FALSE")
        str.AppendLine("X-MS-OLK-AUTOFILLLOCATION:FALSE")
        str.AppendLine("X-MS-OLK-CONFTYPE:0")
        str.AppendLine("BEGIN:VALARM")
        str.AppendLine("TRIGGER:-PT30M")
        str.AppendLine("ACTION:DISPLAY")
        str.AppendLine("DESCRIPTION:Reminder")
        str.AppendLine("END:VALARM")
        str.AppendLine("END:VEVENT")
        str.AppendLine("END:VCALENDAR")

        Dim smtpclient As SmtpClient = New SmtpClient
        smtpclient.Host = "replaced for privacy"
        smtpclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials

        Dim contype As System.Net.Mime.ContentType = New System.Net.Mime.ContentType("text/calendar")
        contype.Parameters.Add("method", "REQUEST")
        contype.Parameters.Add("name", "Meeting.ics")
        Dim avcal As AlternateView = AlternateView.CreateAlternateViewFromString(str.ToString, contype)
        msg.AlternateViews.Add(avcal)
        smtpclient.Send(msg)
pgSystemTester
  • 8,979
  • 2
  • 23
  • 49
dk96m
  • 301
  • 3
  • 18
  • So I am doing this, it is sending the message, but it is coming into outlook with an attachment that says "not supported calendar message.ics" – dk96m Jul 24 '18 at 16:51
  • I am trying this as well: https://stackoverflow.com/questions/24259827/why-are-my-icalendar-invitations-not-processed-by-the-outlook-sniffer But when I look at the message it comes in as content-type: multipart/alternative. – dk96m Jul 24 '18 at 17:41
  • If I use publish instead of request, it will add it to my calendar. What is the difference between publish and request? – dk96m Jul 24 '18 at 17:46
  • also, it still says not supported calendar message.ics – dk96m Jul 24 '18 at 17:54
  • This is where I am at. I can send the meeting, open the file, have it on my calendar. When I try to update it, it just adds another instance of it, modified (say i change the time). If I don't modify it, i can cancel it and have it removed from calendar. If i do modify it, the cancel gets all screwy because of the two instances of it. – dk96m Jul 24 '18 at 20:09

0 Answers0