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

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

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

Kadet

Цитата: mikekaganski от  6 декабря 2023, 20:14setOriginator?
Да. Повторно проверил что это за зверь.

Добавил к макросу Sokol92 сей setOriginator, в таком виде:
    eMyAddress="info@mymail.ru"
    eMessage.setOriginator(eMyAddress)
(Естественно адреса подставил реальные).
Ну, как и говорил. Отправить - отправилось. Но, как и говорилось раньше, с defaul-аккаунта. Ни электронку не подменило в поле "от-кого", ни даже не закрыло её, как это есть в том же "Outlook.Application" - свойство SentOnBehalfOfName, которое хоть и не меняет почту, через которую отправляется письмо, но хоть пишет: "Отправлено от имени NotMy@mymail.ru".
И с каким-то зависоном.

Мне же хочется реально отправить с другой почты, через другой smtp-сервер.

Может быть потому что снова всё прошло через Outlook, потому что он у меня по-умолчанию.
Но, другая кракозябра с вопросом "Разрешить" вылезла. Хотя Outlook-у я строго-настрого запретил это делать, где только можно, включая регистры. А она всё равно вылезла.

Я и через Windows_CDO тоже пробовал. Не алё.

Из всех вариантов получилось, что "Outlook.Application" самый простой и удобный вариант.
Если бы только эту мелочь со сменой аккаунта исправить и всё будет путём.

economist

Цитата: Kadet от  6 декабря 2023, 16:58Питон это, конечно, замечательно. Но он у меня на Win7_32 не ставится.

Речь шла о Питоне в составе LO. Он точно работает на 32-х разрядных платформах, в т.ч. и Portable с офсайта, и именно под Win7/32 я его тестировал. Библиотеки под него можно ставить почти любые, кроме сильно заковыристых типа torch из мира AI. Поэтому план Б есть.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Цитата: economist от  7 декабря 2023, 08:15Речь шла о Питоне в составе LO. Он точно работает на 32-х разрядных платформах,
Сильно глубоко не углублялся в вопрос, но когда пытался чего-то у меня не срослось.

sokol92

Цитата: Kadet от  6 декабря 2023, 21:07Ни электронку не подменило в поле "от-кого", ни даже не закрыло её, как это есть в том же "Outlook.Application"
В своем эксперименте (LO Win 10) я отправлял письмо сам себе, указывая в параметре метода setOriginator "иной" адрес.

В пришедшем письме поля Return-Path и From содержали в качестве значения "иной" адрес. При этом поле Received указывало на реальный путь отправки. Почтовый клиент Thunderbird показывает, что письмо пришло с "иного" адреса. С кодировками (русские буквы) в теме письма и в теле письма всё хорошо.
Мне это поведение кажется правильным.

Что касается "зависона", то между отправкой из LO и отображением письма в почтовом клиенте проходит секунд 15. Воспринял это как "правила игры".
Владимир.

mikekaganski

Цитата: Kadet от  6 декабря 2023, 21:07хочется реально отправить с другой почты, через другой smtp-сервер

Тут, конечно, вопрос. Насколько я знаю, Simple MAPI не позволяет задать такие параметры - документация говорит:

ЦитироватьThe MAPISendMailW (Unicode) and MAPISendMail (ANSI) functions both send a standard message, with or without any user interaction. The profile must be configured so that either function can open the default service providers without requiring user interaction.

Напрямую разговора о сконфигурированных ящиках нет, но это как бы подразумевается в упоминании "The profile ...". С другой стороны, почтовый клиент мог бы быть достаточно умным, чтобы выбрать сервер в зависимости от адреса отправителя (если есть совпадение) ... но я думаю, что такое "умное" поведение привело бы к куче проблем, о которых я даже не могу подумать.
С уважением,
Михаил Каганский

sokol92

Думаю, в обозримом будущем в добавление к сервисам SimpleCommandMail и SimpleSystemMail добавится SimplePythonMail.  :) Прецедент с MailMerge есть.
Владимир.

Kadet

sokol92. Я заморочился и всё протестировал.
Значит для чистоты эксперимента установил Thunderbird по-умолчанию. Отключил всякие уведомления и запросы ненужные. Всё получилось. В Thunderbird, для чистоты эксперимента, завёл несколько аккаунтов. Отправил по несколько писем на разные свои почты (благо у меня их было...) с разных аккаунтов, меняя их setOriginator-ом. Отправлял только с занесённых в Thunderbird акков, а получал на другие.

Итог.
В Thunderbird всё показывается, что все письма отправились как и задумывалось, как в поле "От" значится как и задумывалось. Однако напрягло то, что все отправленные письма упали в папку "Отправленные" дефаултного акка, а не разнеслись по разным, как должно было бы быть, если письма действительно отправляются с разных почт.
Дальше круче.
Получил все эти послания уже в Outlook-е. И в итоге оказалось, что вот:
pica@cyanopica.ru; от имени; SMTP: cyanopica@rambler.rupica@cyanopica.ru - это defoult.
cyanopica@rambler.ru - это попытка подмены.
В реальности всё отправлено с дефаултного акка.

Т.е., вывод. Сработало один к одному, как в Outlook-ском методе - SentOnBehalfOfName, которую я описывал выше. Письмо отправляется с той же почты, которая по-умолчанию, но получателю "видится" (и-то не всегда), что отправитель другой.
Кстати, все письма с подменами автоматически в спам сразу попали, в "нежелательные".
В Outlook  эта функция тоже прекрасно срабатывает, но она не решает ту проблему, которую я решаю. Задача как раз состоит в том, чтобы не просто "пустить пыль в глаза" получателю, а реально отправить с другой почты, с другого SMTP-сервера.

Кстати, открою большую тайну, именно для них, для SMTP-серверов, всё это я и пытаюсь сделать. Замордовали своими весьма жёсткими лимитами. Нормальную рассылку новостей клиентам сделать не дают. У яндекса - 150 сообщений в сутки, у mail.ru - 1 в минуту, и т.п. rambler чуть ли не половину отправленных сообщений в спам сразу бросает, вернее просто не отправляет.
Вот именно их и хочу обойти.

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Kadet

Новая идея появилась. Макрос отправки сделать на VBA и разместить его в библиотеке самого Outlook. Что легко сделать.
Передавать этому макросу необходимые аргументы, а он бы их устанавливал и отправлял письмо.
Но, теперь возникла проблема как из LO Bacic подключить библиотеку макросов VBA находящуюся внутри Outlook, передать туда аргументы (переменные) и выполнить этот макрос.

Сейчас копаю в этом направлении. Теоретически это возможно, но пока не нашёл вариантов - КАК. Ищу.

Kadet

Цитата: kompilainenn от  7 декабря 2023, 23:38Спамер детектед?
Почти. >:D
А ещё парсер, и пр. пр. пр.
Пустился во все тяжкие.

Однако, пока ещё никто не жаловался. В блок-листах не значусь. Письма читают. Сайт посещают. Звонят-интересуются. И даже отказников с отпиской - единицы.
Всё по-честному, по-культурному.

economist

"Во все тяжкие" - это если бы вы развернули VDS или реальный север дома со статическим IP, купили доменное имя и настроили свой SMTP и сами определяли лимиты на отправку.

Если письма читают - это хорошо, значит ЦА благосклонна (SEO скажут старомодна). Но КПД (конверсия) email рассылок 0,001%, а крупнейшие доткомы, опсосы и провайдеры стали обмениваться спам-листами, и можно очень быстро самовыпилиться, скомпрометировать домен (на котором и сайт) и вообще.

Имхо, лучше наплодить каналов в соцсетях и имбурде там. Ротация показов профильных каналов и сарафанное радио юзеров работают в соцсетях лучше чем email, особенно для продвижения небольшого и недорогого бизнес-ПО.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Да, КПД не ахти.

Цитата: economist от  8 декабря 2023, 08:31Имхо, лучше наплодить каналов в соцсетях и имбурде там. Ротация показов профильных каналов и сарафанное радио юзеров работают в соцсетях лучше чем email, особенно для продвижения небольшого и недорогого бизнес-ПО.
Этот вопрос сейчас находится на стадии осмысления и понимания.

Kadet

Ну, таки да. Всё сделал и всё получилось. Правда всё, как всегда в подобных случаях, через задний проход, но... таки работает.

Может будет кому полезно, а посему рассказываю.
Ну, саму идею я уже описал выше. Исследования показали, что несмотря на все возможности работы VBA-кода в макросах LO на присвоении "oMail.SendUsingAccount = oAccount" либра спотыкается. Всё остальное прекрасно работает, а тут... засада. При этом в любом доке MS Office всё это работает нормально и правильно.

Идея заключается в следующем запустить макрос отправки письма прямо из документа MS Office, а не из LO, а из LO просто тому VBA-макросу передать нужные аргументы.
В идеале, конечно, было бы замечательно запускать такой макрос, который бы хранился прямо в самом Outlook, но я пока не нашёл способа дотянуться до внутренностей Outlook. Ну, это, возможно, ещё впереди. А пока, использовал Excel.

В общем, сделал документ Excel - VBA.xlsm и вложил в него этот макрос.
Sub SendUsingAccount(ByVal idxAcc As Variant, ByVal sRecipient As Variant, ByVal sSubject As Variant, ByVal sText As Variant, ByVal oAttachments As Variant)
 Dim oOutlookApp As Outlook.Application
 Dim oAccount As Outlook.Account
 Dim oMail As Outlook.MailItem
 Dim oAttachment As String
 Dim n As Integer
 Dim i As Integer

 Set oOutlookApp = CreateObject("Outlook.Application")
 Set oMail = oOutlookApp.CreateItem(0)

 Set oAccount = oOutlookApp.Session.Accounts.Item(idxAcc)
 If oAccount.AccountType = 2 Then
        oMail.Recipients.Add (sRecipient)
        oMail.Subject = sSubject
        oMail.HTMLBody = sText
        n = UBound(oAttachments)
        For i = 0 To n
            oAttachment = oAttachments(i)
            oMail.Attachments.Add (oAttachment)
        Next i
        oMail.Recipients.ResolveAll
        oMail.SendUsingAccount = oAccount
        oMail.Send
    End If
End Sub

В Либре макрос получился следующим:
Sub EmailSend()
    Dim oOutlookApp As Outlook.Application
    Dim oExelApp As Excel.Application
    Dim XLS as Object
    Dim idxAcc as Integer
    Dim iCount as Integer
    Dim sRecipient as String
    Dim sSubject as String
    Dim sText as String
    Dim oAttachments(1) as String

    Set oOutlookApp = CreateObject("Outlook.Application")
    Set oExelApp = CreateObject("Excel.Application")
    Set XLS = oExelApp.Workbooks.Open("D:\DataBase\VBA.xlsm")
    sRecipient = "test@test.ru"
    sSubject = "Проверка рассылки"
    oAttachments(0) = "D:\DataBase\Test.pdf"
    oAttachments(1) = "D:\DataBase\Test1.pdf"
    sText = "<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>"
    iCount = oOutlookApp.Session.Accounts.Count
    For idxAcc=1 To iCount
        XLS.Application.Run "SendUsingAccount", idxAcc, sRecipient, sSubject, sText, oAttachments
    Next
    XLS.Close
End Sub

Конечно, нужно отредактировать вот эти пути, иначе будут ошибки:
    Set XLS = oExelApp.Workbooks.Open("D:\DataBase\VBA.xlsm")
    sRecipient = "test@test.ru"
    oAttachments(0) = "D:\DataBase\Test.pdf"
    oAttachments(1) = "D:\DataBase\Test1.pdf"

И лучше поместить LO-макрос в отдельный модуль и вначале этого модуля поставить включалску VBA
REM  *****  BASIC  *****
Option VBASupport 1
Option Compatible

А так же в VBA.xlsm нужно включить нужные библиотеки (как в Pic3.jpg). При открытом VBA.xlsm нажимаем Alt+F11, в открывшемся окне меню "Tools", а в нём подменю - "References..".

И это - работает. Вот такие вот пироги.