Lotus notes 使用LotusScript创建.ics日历邀请

Lotus notes 使用LotusScript创建.ics日历邀请,lotus-notes,lotusscript,Lotus Notes,Lotusscript,用例:使用.ics文件并最好使用LotusScript向事件发送邀请 代码在经典的DominoWeb应用程序(您知道,$$WebObsubleHiddenfield)中,业务逻辑在LotusScript中,我不太热衷于编写其他任何东西 我发现了RFC,它定义了一种格式,只需按照这些约定编写一个文本文件,然后附加它就可以了 我看到过一个类似的问题,Thorsten Link建议用相关字段填写一份“预约”表,但我觉得这有点“肮脏” 这里的最佳实践是什么 一种方法是让java servlet实现类似i

用例:使用.ics文件并最好使用LotusScript向事件发送邀请

代码在经典的DominoWeb应用程序(您知道,$$WebObsubleHiddenfield)中,业务逻辑在LotusScript中,我不太热衷于编写其他任何东西

我发现了RFC,它定义了一种格式,只需按照这些约定编写一个文本文件,然后附加它就可以了

我看到过一个类似的问题,Thorsten Link建议用相关字段填写一份“预约”表,但我觉得这有点“肮脏”


这里的最佳实践是什么

一种方法是让java servlet实现类似ical4j或其他ics库的东西,然后动态生成ics


我用来发送ics文件的另一种方法是将必要的字段写入n ics文件并将其附加到邮件中

我最终自己建立了ics文件;一旦我理解了RFC,我就相当直截了当了,我只是不相信任何automagic

尤利,我给了你正确的答案“滴答”

'/*************************************************************************************
' * CalendarEntry Class
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 21, 2019
' *************************************************************************************/

Class CalendarEntry
    Public startdatetime As String
    Public enddatetime As String 
    Public summary As String
    Public location As String
    Public url As String
    Public description As String

' validator: https://icalendar.org/
' spec: https://tools.ietf.org/html/rfc5545

'/*************************************************************************************
' * Function as_NotesStream
' * @return: A NotesStream of the whole file, can be inputted directly into a NotesMimeEntity
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 22, 2019
' *************************************************************************************/
Function as_NotesStream As NotesStream
    On Error GoTo ErrorHandler

    Dim session As New NotesSession
    Dim stream As NotesStream

    Set stream = session.Createstream() ' charset Unicode as default

    Call stream.WriteText("BEGIN:VCALENDAR", EOL_CRLF)
    Call stream.WriteText("PRODID:" & me.prodid(), EOL_CRLF)
    Call stream.WriteText("VERSION:2.0", EOL_CRLF)
    Call stream.WriteText("METHOD:REQUEST", EOL_CRLF)

    ' TIMEZONE Section - describes the timezone, the TZID is an internal reference
    Call stream.WriteText("BEGIN:VTIMEZONE" , EOL_CRLF)
    Call stream.WriteText("TZID:Europe/Berlin" , EOL_CRLF)
    Call stream.WriteText("X-LIC-LOCATION:Europe/Berlin" , EOL_CRLF)
    Call stream.WriteText("BEGIN:DAYLIGHT" , EOL_CRLF)
    Call stream.WriteText("TZOFFSETFROM:+0100" , EOL_CRLF)
    Call stream.WriteText("TZOFFSETTO:+0200" , EOL_CRLF)
    Call stream.WriteText("TZNAME:CEST" , EOL_CRLF)
    Call stream.WriteText("DTSTART:19700329T020000" , EOL_CRLF)
    Call stream.WriteText("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3" , EOL_CRLF)
    Call stream.WriteText("END:DAYLIGHT" , EOL_CRLF)
    Call stream.WriteText("BEGIN:STANDARD" , EOL_CRLF)
    Call stream.WriteText("TZOFFSETFROM:+0200" , EOL_CRLF)
    Call stream.WriteText("TZOFFSETTO:+0100" , EOL_CRLF)
    Call stream.WriteText("TZNAME:CET" , EOL_CRLF)
    Call stream.WriteText("DTSTART:19701025T030000" , EOL_CRLF)
    Call stream.WriteText("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10" , EOL_CRLF)
    Call stream.WriteText("END:STANDARD" , EOL_CRLF)
    Call stream.WriteText("END:VTIMEZONE" , EOL_CRLF)

    Call stream.WriteText("BEGIN:VEVENT", EOL_CRLF)
    Call stream.WriteText("SUMMARY:" & me.summary, EOL_CRLF)
    '   Call stream.WriteText("PRIORITY:0", EOL_CRLF)
    '   Call stream.WriteText("CATEGORIES:GIG", EOL_CRLF)
    Call stream.WriteText("CLASS:PUBLIC", EOL_CRLF)
    Call stream.WriteText("UID:" & me.uid(), EOL_CRLF)
    Call stream.WriteText("DTSTAMP:" & me.dtstamp(), EOL_CRLF)
    Call stream.WriteText("DTSTART;TZID=Europe/Berlin:" & me.startdatetime, EOL_CRLF)
    Call stream.WriteText("DTEND;TZID=Europe/Berlin:" & me.enddatetime, EOL_CRLF)
    Call stream.WriteText("URL:" & me.url, EOL_CRLF)
    Call stream.WriteText("DESCRIPTION:" & prepareTextCorrectly(me.description), EOL_CRLF)
    Call stream.WriteText("LOCATION:" & prepareTextCorrectly(me.location), EOL_CRLF)
    Call stream.WriteText("END:VEVENT", EOL_CRLF)
    Call stream.WriteText("END:VCALENDAR", EOL_CRLF)

    Set as_NotesStream = stream

    Exit Function
ErrorHandler:
        Call logError
        Exit Function
    End Function

'/*************************************************************************************
' * Function domain: the customer-specific domain
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 22, 2019
' *************************************************************************************/
Function domain As String
    On Error GoTo ErrorHandler

    domain = "example.com"

    Exit Function
ErrorHandler:
        Call logError
        Exit Function
    End Function

'/*************************************************************************************
' * Function prodid:an id of the producer
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 22, 2019
' *************************************************************************************/
Function prodid As String
    On Error GoTo ErrorHandler

    prodid = "-//YOUR MEGA PROD_ID//DE"

    Exit Function
ErrorHandler:
        Call logError
        Exit Function
    End Function


'/*************************************************************************************
' * Function uid:An unique id for the calendar event
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 22, 2019
' *************************************************************************************/
Function uid As String
    On Error GoTo ErrorHandler

    Dim uuid As Variant
    uuid = Evaluate("@Unique")
    uid = startdatetime & "-" & CStr(uuid(0)) & "@" & domain

    Exit Function
ErrorHandler:
        Call logError
        Exit Function
    End Function



'/*************************************************************************************
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 21, 2019
' *************************************************************************************/
Function dtstamp As String

    Dim dtTmp As NotesDateTime  
    Set dtTmp = New NotesDateTime(Now())    
    Const RFC554FORMATFORUTC = "yyyymmddThhmmssZ"       
    dtstamp = Format$(dtTmp.lsgmttime, RFC554FORMATFORUTC) 

End Function

'/*************************************************************************************
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 21, 2019
' *************************************************************************************/
Function ReplaceCRLFWithSlashN (value As String) As String

    Dim CRLF As String
    CRLF = Chr$(13) + Chr$(10)

    ReplaceCRLFWithSlashN = Replace(value, CRLF, "\n") 

End Function


'/*************************************************************************************
' * Function prepareTextCorrectly
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Sep 21, 2019
' *************************************************************************************/
Function prepareTextCorrectly(value As string) As String
    On Error GoTo ErrorHandler

    prepareTextCorrectly = ReplaceCRLFWithSlashN(value)

    Exit Function
ErrorHandler:
        Call logError
        Exit Function
    End Function



End Class

它的“Torsten”没有“h”…;-)除了“试错法”还没有找到其他方法:必须对ICS进行大量故障排除(主要来自票证系统或其他外部工具),并且可以告诉您:每个ICS文件看起来都不一样。。。在RFC的范围内。。。您实现的“功能”取决于您要付出的努力……很抱歉拼错了您的名字Torsten!创建带有日历条目中使用的特殊字段的Notes文档,当发送到外部电子邮件地址时,是否会自动将日历条目作为ICS文件发送?嗨,Ueli,我也在考虑这两种解决方案。我想我会选择第二种解决方案,我希望它对不熟悉Java的客户来说是可读的