Ошибка Unhandled user defined type - неопределённый пользовательский тип

Автор Kadet, 6 декабря 2023, 13:42

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Добрый день!
Столкнулся с проблемой, с которой никак не могу разобраться.

Делаю макрос для отправки автоматических писем по e-mail через MS Outlook.
Во избежание дополнительных вопросов сообщаю, что нужно именно через MS Outlook, потому как именно он, при определённых настройках, не задаёт лишних вопросов. Все остальные варианты постоянно требуют подтверждений, разрешений и пр.
Короче, так надо.

Всё нормально и всё получается за исключением маленькой проблемы, которую никак не удаётся решить.
Есть необходимость иногда менять аккаунт отправителя в письме. Т.е. - "От кого".

Код честно нашёл и скопировал в инете. Изначально он на VBA. Немного переработал под LO. В общем - он работает.

'*****************************************************************************
Public Sub EmailSend()
Dim oOLEService as Object, oOutlookApp as Object, oOutlookMail as Object, oAccount as Object
'*****************************************
oOLEService = createUnoService("com.sun.star.bridge.OleObjectFactory")
oOutlookApp = oOLEService.createInstance("Outlook.Application")
' oOutlookApp = CreateObject("Outlook.Application")
'*****************************************
    Set oOutlookMail = oOutlookApp.CreateItem(0)
Set oAccount = oOutlookApp.Session.Accounts.Item(2)

    With oOutlookMail
        .To = "info@test.ru"
        .Subject = "Test"
        .Body = "Hello, World!"
        .SentOnBehalfOfName = "info@mymail.ru"
Set .SendUsingAccount = oAccount
        .Display     'если необходимо просмотреть сообщение, а не отправлять без просмотра
        .Send
    End With

End Sub

Однако при попытке изменить аккаунт (.SendUsingAccount = oAccount) появляется ошибка: Unhandled user defined type.. (неопределённый пользовательский тип).

Причём, эта же ошибка выскакивает даже если я пробую вот такой финдиперс:
Set oAccount = oOutlookMail.SendUsingAccount
Set oOutlookMail.SendUsingAccount = oAccount
Т.е. получаю объект (ссылку на него) из SendUsingAccount в переменную oAccount и тут же пытаюсь вернуть его обратно.
Всё, что писано в инете по этому вопросы перекопал. Но там больше инфы по VBA и связано с MS Office.

Может кто подскажет решение такой проблемы?

В примере в файле EMail.ods нужно нажать кнопку и по логике тестовое письмо должно отправиться на несуществующий адрес.
Обязательно должен быть установлен MS Office и Outlook.

mikekaganski

Интересная проблема, которая, конечно, намекает на неправильное обращение ЛО с внешними объектами. Хотелось бы отдебажить. Но к сожалению,

Цитата: Kadet от  6 декабря 2023, 13:42Обязательно должен быть установлен MS Office и Outlook.

и у меня сейчас нет Outlook...
С уважением,
Михаил Каганский

Kadet

Прогнал этот же код в VBA-Exel.
Оказывается, тут тоже появляется эта же ошибка.
ЦитироватьRun-time error '91':  Object variable or With block not set
Не задана объектная переменная (ошибка 91)

Вот тут становится ещё интересней.

economist

Тундру можно отучить от вопросов, это же по сути один JavaScript: https://habr.com/ru/search/?q=thunderbird%20%D0%BA%D0%BE%D1%80%D0%BF%D0%BE%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9&target_type=posts&order=relevance

План Б: подкапотный Python, он еще и вложит файлы любого формата, правильно закодирует имена файлов-вложений, а не как делают все "почтовики" с ощибками и вопросиками, главное не забыть про:
from email.MIMEMultipart import MIMEMultipart
from email.mime.text import MIMEText
from email import encoders
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Владимир.

economist

Цитата: Kadet от  6 декабря 2023, 16:23Вот тут становится ещё интересней.

Примеры кода отправки email десятилетней давности сейчас часто не работают из-за появления кучи всяких новых стандартов шифрования типа TLS и доп. параметров при обращении к SMTP. Возможность отправки email даже в самом MSO отваливалась за десятилетие несколько раз. Я бы не тратил время на исправление ошибок а искал свежий рабочий пример кода.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

economist
Питон это, конечно, замечательно. Но он у меня на Win7_32 не ставится.
Исходим из того, что есть.

В VBA-Exel решил проблему. Убрал Set перед oMail.SendUsingAccount = oAccount
Sub SendUsingAccount()
 Dim oOutlookApp As Outlook.Application
 Dim oAccount As Outlook.Account
 Dim oMail As Outlook.MailItem
 
 Set oOutlookApp = CreateObject("Outlook.Application")
 Set oMail = oOutlookApp.CreateItem(0)

 Set oAccount = oOutlookApp.Session.Accounts.Item(2)
 If oAccount.AccountType = olPop3 Then
    oMail.Subject = "Sent using POP3 Account"
    oMail.Recipients.Add ("someone@example.com")
    oMail.Recipients.ResolveAll
    oMail.SendUsingAccount = oAccount
    oMail.Send
 End If
End Sub

В LO не прокатило.

На просторах инета много писано, что нужно так же библиотеки VBA Micrisoft Outlook подключать. В Ex[el они подключены. Есть ли возможность подключить их в LO?

Kadet

Цитата: economist от  6 декабря 2023, 16:44Тундру можно отучить от вопросов, это же по сути один JavaScript: [url="https://habr.com/ru/search/?q=thunderbird" корпоративный&target_type="posts&order=relevance"]https://habr.com/ru/search/?q=thunderbird%20%D0%BA%D0%BE%D1%80%D0%BF%D0%BE%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9&target_type=posts&order=relevance[/url]
Мазилу не смог настроить, чтобы она мне каждое письмо не спрашивала - "Разрешить?"
Outlok не спрашивает.

sokol92

У меня следующий пример от @Zizi64 работает под Windows и не задает вопросов. Почтовый клиент по умолчанию Thunderbird.
Option Explicit

' Example from https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=90100&hilit=%2Bmail#p425473 by Zizi64
Sub TestMail
   Dim eMailAddress, eMessage, eSubject, eMailer, eMailClient, i As Long
   
    eSubject="SimpleSystemMail"
    eMailAddress="sokol@comec92.ru"
   
    eMailer = createUnoService("com.sun.star.system.SimpleSystemMail")
           
    eMailClient = eMailer.querySimpleMailClient()     
    eMessage = eMailClient.createSimpleMailMessage()
         
    eMessage.setRecipient(eMailAddress) ' eMailAddress): a passed string variable with the mail address
    eMessage.setSubject(eSubject) ' eSubject): a passed string variable with subject
   
    eMessage.setAttachement (Array(ConvertToUrl("C:\Temp\CE2XL.md")))
   
    eMessage.body="<html> <head></head> <body>" & _
        "<p>Thanks to <b>@Zizi64</b> for the interesting" & _
        "<a href=""https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=90100&hilit=%2Bmail#p425473""> link </a>." & _
        "</p> </body> </html>"

    eMailClient.sendSimpleMailMessage( eMessage, com.sun.star.system.SimpleMailClientFlags.NO_USER_INTERFACE)
End Sub
Владимир.

mikekaganski

С уважением,
Михаил Каганский

Kadet

Цитата: sokol92 от  6 декабря 2023, 17:33У меня следующий пример от @Zizi64 работает под Windows и не задает вопросов. Почтовый клиент по умолчанию Thunderbird.
Да, я пробовал этот вариант. Но даже если не брать в расчёт вопросы-разрешения, которые без сомнения можно настроить, в этом варианте я так и не нашёл возможности смены аккаунта отправителя (от-кого).
Т.е. - банально "From".
К тому же сам Питоньяк о сервисе SimpleSystemMail не в восторге и выражался по этому поводу сильно не лестно.

Kadet

Цитата: mikekaganski от  6 декабря 2023, 19:00добивался гладкой работы TB с LO, и реализовывал Unicode в Simple MAPI TB
;D
Даже такое бывает?
В багзиле темы не видел. Но у меня сообщения прекрасно отправляются на разных машинах и системах Win. С этим проблем нету.
Аккаунты не хочет менять. А хотелось бы.

Цитата: sokol92 от  6 декабря 2023, 16:47Тоже нет Outlook. Посмотрите дискуссию здесь.
Эту тему изучал весьма внимательно.  Не мало почерпнул, но ответа не нашёл.


Kadet

Потестировал макрос в VBA-Exel и вот что выяснил.
Действительно дело получается в библиотеке VBA.
Вот она:
Microsoft Outlook 14.0 Object Library
C:\Program Files\Microsoft Office\Office14\MSOUTL.OLB

Если её в Exel-VBA отключить, то перестают работать вот такие модели объявления типов:
Dim oOutlookApp As Outlook.Application
 Dim oAccount As Outlook.Account
 Dim oMail As Outlook.MailItem

А если заменить их на вот такие:
Dim oOutlookApp As Object
 Dim oAccount As Object
 Dim oMail As Object
То, хоть и не ругается в VBA-Exel, но аккаунт всё равно не меняется. Письма отправляются, но всегда с default-аккаунта, вне зависимости от параметров которые передаются в свойство - SendUsingAccount.

А посему, делаю вывод, что нужно каким-то макаром "привинтить" библиотеку C:\Program Files\Microsoft Office\Office14\MSOUTL.OLB к Libre.

mikekaganski

С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от  6 декабря 2023, 20:14setOriginator?
Я его попробовал и чего-то у меня не вышло.
Вроде бы и "да", но... "нет". Отправлялось всё равно с default. Может и не дожал эту тему как следует. Может чего-то недопонял правильно.