Отправка электронной почты с рабочей книгой из макроса VBA на Windows и Mac

Мой следующий код правильно работает на ПК, но не работает на Mac. Вместо того, чтобы делать две версии макроса с отдельными кнопками для пользователей Windows и Mac, я бы хотел, чтобы скрипт распознавал текущую ОС и запускал соответствующий набор команд для этой ОС.

Макрос создает электронное письмо с вложением книги. Вложение — это временная версия ActiveWorkbook, которая удаляется после отправки электронного письма.

Метод, который я сейчас использую для отправки электронной почты, — это Windows CDO. Есть ли какие-либо другие соображения, о которых я должен знать при его выполнении на MAC OSX с Office 2016?

Private Message As CDO.Message
Private Attachment, Expression, Matches, FilenameMatch, i

Sub enviar_mail()

    Dim wb1 As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim FileExtStr As String


    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set wb1 = ActiveWorkbook

    'Make a copy of the file/Open it/Mail it/Delete it
    'If you want to change the file name then change only TempFileName
    TempFilePath = Environ$("temp") & "\"
    TempFileName = "Copy of " & wb1.Name & " " & Format(Now, "dd-mmm-yy h-mm-ss")
    FileExtStr = "." & LCase(Right(wb1.Name, Len(wb1.Name) - InStrRev(wb1.Name, ".", , 1)))

    wb1.SaveCopyAs TempFilePath & TempFileName & FileExtStr

    On Error Resume Next

    Set Message = New CDO.Message
    Message.Subject = ActiveSheet.Range("G9").Value
    Message.From = ""
    Message.To = ""
    Message.CC = ""
    Message.HTMLBody = ActiveSheet.Range("A12").Value
    Message.AddAttachment TempFilePath & TempFileName & FileExtStr

    Dim Configuration
    Set Configuration = CreateObject("CDO.Configuration")
    Configuration.Load -1                        ' CDO Source Defaults
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "[email protected]"
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "*****"
    Configuration.fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True

    Configuration.fields.Update

    Set Message.Configuration = Configuration
    Message.Send

    On Error GoTo 0

    'Delete the file
    Kill TempFilePath & TempFileName & FileExtStr

    Set OutMail = Nothing
    Set OutApp = Nothing

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

End Sub

person Steve Deer    schedule 23.08.2018    source источник
comment
instead of creating another button and module to execute from a MAC I would like the script to be dynamic enough to recognize the type of OS and save the workbook temporarily Можете ли вы объяснить, почему?   -  person Marcucciboy2    schedule 23.08.2018
comment
В нашей компании есть пользователи, которые используют ПК, а некоторые используют компьютеры Mac. Я думал об использовании Application.OperatingSystem, а затем основываясь на том, что он возвращает, используя две отдельные процедуры, одну для ПК, другую для OSX, соответствующим образом вложенную в оператор If Else. Также, когда я говорю временно сохранить книгу, я имею в виду экземпляр кода, в котором он сохраняет файл во временном месте для вложения, а затем удаляет его.   -  person Steve Deer    schedule 23.08.2018
comment
У меня нет Mac, чтобы проверить это — в настоящее время это работает только на ПК, а не на Mac?   -  person Marcucciboy2    schedule 23.08.2018
comment
Да, ПК работает нормально, я считаю, что это может быть так же просто, как назначение пути к временному файлу, но с использованием CDO и функцией Windows не уверен, что мне нужно использовать другой инструмент / метод для отправки smtp с MAC.   -  person Steve Deer    schedule 23.08.2018


Ответы (1)


Поэтому для определения ОС вы можете использовать директивы условной компиляции примерно так:

#If Mac Then
    Debug.Print "I'm a Mac"
#Else
    Debug.Print "I'm not"
#End If

Отправка почты в современной MacOS затруднена из-за встроенной в ОС системы безопасности. CDO является строго технологией Windows и здесь не применяется. Большинство людей пишет отдельный файл AppleScript, который затем выполняется в Excel. См. эту страницу, чтобы узнать, как это сделать для Outlook и Mail.app.

Конечно, это требует дополнительных шагов, прежде всего, для загрузки сценария на компьютер пользователя, но AppleScript довольно прост для понимания. Например:

tell application "Mail"
    set NewMail to (make new outgoing message with properties {subject:"My Subject"})
    tell NewMail
        set sender to "[email protected]"
        set content to "My email message"
        make new to recipient with properties {address:"[email protected]"}
        send
    end tell
end tell
person miken32    schedule 23.08.2018