通过Outlook使用ical发送会议请求

时间:2018-07-24 13:05:54

标签: vb.net outlook icalendar

这是我的难题。我有一个vb.net应用程序,用于请求使用资产的时间。用户提交请求(可以包含必需和可选用户),然后审批者必须批准该请求。批准后,我要发送会议请求。我无法使用Outlook代码执行此操作,因为它不会让我更改组织者。如果我尝试使用outlook.application> outlook.olitemtype.olappointmentitem或其他任何东西发送它,它将默认组织者为发送会议请求的人,在这种情况下,我是不需要的批准人。因此,我认为我只想发送一份医嘱。这就是我遇到的问题。我无法使用smtpclient创建电子邮件并使用适当的内容类型发送电子邮件,而必须使用Outlook发送。因此,我创建了一个ics文件,并将其添加为附件。我不确定METHOD:PUBLISH和METHOD:REQUEST之间的区别。我已经完成的所有搜索都说我应该使用method:request,但是当我打开ICS文件时,它没有为我提供接受的选项,等等。它没有添加到我的日历中。我还希望能够更新和取消会议,我想我知道该如何处理uid,序列等。我已经进行了搜索,但无法到达需要的位置。看来最好的选择是使用smtpclient创建添加标题和ical内容的邮件,但是我不能这样做,有没有办法使用Outlook?

如果有人可以帮助我指出正确的方向,我将不胜感激。

这是我当前的代码:

            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)

0 个答案:

没有答案