The M-Files Community will be updated on Tuesday, April 2, 2024 at 10:00 AM EST / 2:00 PM GMT and the update is expected to last for several hours. The site will be unavailable during this time.

This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Adding an attachment to a notification VBScript

Hi, I am trying to create a script that attaches an M-Files generated document to an email notification. Normal email scripts don't seem to work with our servers, so I was wondering if it is possible to download a document from M-Files and attach it to a notifications via a workflow state script with VBScript? I have attached the the piece of code that I would like to use to send the email notification (and attachment) below.

Thanks

Option Explicit

' User or user group recipients from the vault
Dim oUsers : Set oUsers = CreateObject("MFilesAPI.UserOrUserGroupIDs")

Dim oUser : Set oUser = CreateObject("MFilesAPI.UserOrUserGroupID")
oUser.UserOrGroupID = 1	' User ID 32
oUser.UserOrGroupType = MFUserOrUserGroupType.MFUserOrUserGroupTypeUserAccount

oUsers.Add -1, oUser

' External recipients
Dim oExternalUsers : Set oExternalUsers = CreateObject("MFilesAPI.Strings")
oExternalUsers.Add -1, "khoendib@documentwarehouse.com.na"

Vault.NotificationOperations.SendCustomNotification oUsers, False, oExternalUsers, True, "Test email", "Test email body"

Parents
  • Hi Kay_G

    The following script may help you along with your journey.  It uses a CDO Message object as NeoTron mentioned. I agree with both Radu and Neo that this may be best served as a custom Vault Application, however, it really depends on your scenario and timeframe for needing a solution.  

    Hope this helps...

    --------------------------------------------------------------------------------------------------------------------

    option Explicit

    ' Setup variables for e-mailing the documents as attachments - only omessage used currently
    Dim szFileName, oFiles, szExtension, szTitle, szNewFilePath, oMessage, oVaps, oLookups, oLookup
    ' Setup the e-mail object, some of these are not used due to security being turned off on smtp server.
    Set oMessage = CreateObject("CDO.Message")
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../sendusing") = 2
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../smtpserver") = "mfdemosrv01"
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../smtpserverport") = 25
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../smtpconnectiontimeout") = 10
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../smtpauthenticate") = 0
    oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../smtpusessl") = False
    'oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../sendusername") = "username"
    'oMessage.Configuration.Fields.Item("">schemas.microsoft.com/.../sendpassword") = "password"
    oMessage.Configuration.Fields.Update
    ' Start building and inserting the message fields

    ' Set the message subject line
    oMessage.Subject = "Monthly Report"
    ' Set the message from line
    oMessage.From = "workflowmailer@somedomain.com"

    'Since we want to use the email address property on the workflow item, Grab the Email Address property from alias M-Files.Property.EmailAddress using GetPropertyID and GetPropertyValue helper functions
    Dim iPDEmailAddress : iPDEmailAddress = GetPropertyID("M-Files.Property.EmailAddress")
    Dim txtEmailAddress : txtEmailAddress = GetPropertyValue(PropertyValues, iPDEmailAddress)

    ' Set the email address from the property to the To: field on the email
    oMessage.To = txtEmailAddress
    oMessage.TextBody = "Please find the attached test file. Thank you."

    ' Download the file from the object and save it to the server
    Dim objFiles : Set objFiles = Vault.ObjectFileOperations.GetFiles(objVer)
    Dim ofile
    For Each ofile In objFiles
    Dim sFilePath : sFilePath = "C:\test\" & ofile.GetNameForFileSystem()
    'Err.Raise mfscriptcancel, sFilePath
    Call Vault.ObjectFileOperations.DownloadFile (ofile.ID, ofile.Version, sFilePath)
    ' Attach downloaded document to email message
    oMessage.AddAttachment sFilePath
    Next
    ' Send the Message
    oMessage.Send

    Dim filesys : Set filesys = CreateObject("Scripting.FileSystemObject")
    ' Delete the temp file from the M-Files serverFor Each ofile In objFiles
    For Each ofile In objFiles
    Dim sFilePaths : sFilePaths = "C:\test\" & ofile.GetNameForFileSystem()
    filesys.DeleteFile sFilePaths
    Next

    ' M-files Helper Functions
    ' Gets the property definition ID by alias
    Function GetPropertyID(alias)
    Dim iID
    iID = Vault.PropertyDefOperations.GetPropertyDefIDByAlias(alias)
    If iID = -1 Then
    Err.Raise MFScriptCancel, "Property definition not found by the specified alias of: " & alias
    End If
    GetPropertyID = iID
    End Function
    ' Gets a property definition value
    Function GetPropertyValue(propVals, propID)
    GetPropertyValue = propVals.SearchForProperty(propID).TypedValue.DisplayValue
    End Function

    ' Gets object version and properties for a given lookup
    Function GetOvapsByLookup( lookup )
    Dim oObjID : Set oObjID = CreateObject( "MFilesAPI.ObjID" )
    Call oObjID.SetIDs( lookup.ObjectType, lookup.Item )
    Dim oObjVer: Set oObjVer = Vault.ObjectOperations.GetLatestObjVer( oObjID, False )
    Set GetOvapsByLookup = Vault.ObjectOperations.GetObjectVersionAndProperties(oObjVer)
    End Function

  • So we initially had a similar script to send emails that worked great, but the server we now use to send emails fails to communicate with the Gmail SMTP server for some reason; we just keep receiving SMTP error messages in M-files. My next alternative was to try a custom notification script, but cannot add attachments or add new lines in this type of script.

  • Sounds like your security settings in the CDO.Message do not comply with requirements on the SMTP server. CDO is - if I have understood things correctly - an outdated method. I do use it in a couple of places in the lack of better alternatives that come within my limited coding capabilities. In those cases I have configured a local SMTP server to receive the CDO message and forward it to the external SMTP server using secure protocols and settings accepted by that external SMTP server.

Reply
  • Sounds like your security settings in the CDO.Message do not comply with requirements on the SMTP server. CDO is - if I have understood things correctly - an outdated method. I do use it in a couple of places in the lack of better alternatives that come within my limited coding capabilities. In those cases I have configured a local SMTP server to receive the CDO message and forward it to the external SMTP server using secure protocols and settings accepted by that external SMTP server.

Children
No Data