powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Можно ли вывести пустое письмо с вложением через MAPI?
7 сообщений из 7, страница 1 из 1
Можно ли вывести пустое письмо с вложением через MAPI?
    #36273711
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант первый (через контролы):
Код: plaintext
1.
2.
3.
4.
5.
Form2.MAPISession1.SignOn
Form2.MAPIMessages1.SessionID = Form2.MAPISession1.SessionID
Form2.MAPIMessages1.Compose
.....
Form2.MAPIMessages1.Send True
Form2.MAPISession1.SignOff
Он делает то чего нужно, но использовать ocx-ы не хочу

Вариант второй:
через ShellExecute+mailto:
Самый простой, но к сожалению парсинг типа ?attachment= не гарантирован, на OE просто не работает

Вариант 3-й:
cdosys.dll
Не годится, юзер должен видеть сообщение перед отправкой

Вариант 4-й:
Через B MAPISendMail
Код: plaintext
1.
2.
Public Declare Function MAPISendMail Lib "MAPI32.DLL" Alias "BMAPISendMail" _
(ByVal Session&, ByVal UIParam&, Message As MAPIMessage, Recipient() As MapiRecip, _
File() As MapiFile, ByVal Flags&, ByVal Reserved&) As Long
Так вот эта "B" опять не гарантирует работу скажем с OE, ошибка 2147467259, рекомендуется патчить реестр, но это вариант "Г".

Вариант 5-й:
Пробовал без "Б", т.е.
Код: plaintext
1.
Public Declare Function MAPISendMail Lib "MAPI32.DLL" _
(ByVal Session&, ByVal UIParam&, Message As MAPIMessage, ByVal Flags&, ByVal Reserved&) As Long
Увы, Message As MAPIMessage в данном случае предполагает вложенные структуры, содержащие
Recipient() As MapiRecip
File() As MapiFile
Запихнуть туда данные о вложениях через
Public Type MAPIMessage
...
FileCount As Long
FileDesc() As MapiFile ???
...
средствами VB мне не удалось, максимум письмо без вложений и адреса назначения, .

Видимо для VB и изобрели "B"-модификации...(bypass)

Вариант 6-й:
По сути тоже что и 4 и 5-но на C++, в майкрософте видел такую "рекомендацию".
Но это лишний exe-шник, не хотелось бы.

Но честно уже задолбался, задача вроде простая...
Неужели нет красивого решения?

М.б. еще системную ф-цию Send to->mail попробовать?
А через CreateObject никак нельзя?
Сдается, придется command prompt на c++ делать... +Shell, vbhide
...
Рейтинг: 0 / 0
Можно ли вывести пустое письмо с вложением через MAPI?
    #36273791
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, решение то оказалось вполне тривиальное:
Код: plaintext
1.
2.
3.
Public Declare Function MAPISendDocuments Lib "MAPI32.DLL" _
(ByVal UIParam&, ByValDelimStr$, ByVal FilePaths$, ByVal FileNames$, ByVal Reserved&) As Long
'
ret = MAPISendDocuments(Me.hwnd,  0 &, FilePath, GetFileName(FilePath),  0 &)
Однако есть маленькие но...
1) по какой-то странной закономерности новое сообщение иногда не выводится, причем без сообщении об ошибке в ret.
Пытался поиграться, добавляя
MAPILogon/MAPILogoff -на этот эффект вроде не влияет
Поменял на тупой код долбежки в теч. секунды, вроде как помогает "гарантировать сообщение"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    ltime = Timer()
    Do
        ret = MAPISendDocuments(Me.hwnd,  0 &, FilePath, GetFileName(FilePath),  0 &)
        dummy = DoEvents()
        If (Timer - ltime >  1 ) Or (Timer < ltime) Then
            Exit Do
        End If
    Loop
Можно было бы половить дескриптор окна сообщения, но оно того не стоит, и текст заголовка м.б. разный для разных Mapi-клиентов.
Вообще странно, или что-то не понимаю...
2) OE слишком часто стал почту сжимать(в процессе тестов), я насчитал через 32 отмененных сообщения. Это нормально? Обычно он это раз в неделю делает.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Можно ли вывести пустое письмо с вложением через MAPI?
    #38631450
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну, решение то оказалось вполне тривиальное:
Код: vbnet
1.
2.
3.
4.
Public Declare Function MAPISendDocuments Lib "MAPI32.DLL" _
(ByVal UIParam&, ByValDelimStr$, ByVal FilePaths$, ByVal FileNames$, ByVal Reserved&) As Long
'
ret = MAPISendDocuments(Me.hwnd, 0&, FilePath, GetFileName(FilePath), 0&)


Однако есть маленькие но...
1) по какой-то странной закономерности новое сообщение иногда не выводится, причем без сообщении об ошибке в ret.
...
2) OE слишком часто стал почту сжимать(в процессе тестов), я насчитал через 32 отмененных сообщения. Это нормально? Обычно он это раз в неделю делает

Небрежность кода всему виной.
Во первых, не заметил ByValDelimStr$ -слитно, перекатал потому что откуда-то, в итоге он у меня передается ByRef
Во вторых, еще и засовываю туда 0& вместо "", опять же результат перекатки чужого безграмотного кода.
Как итог, в ф-цию передается случайная ересь, результат - произвольные срабатывания/не срабатывания.

Только сейчас исправил, все стало работать четко:
Код: vbnet
1.
2.
3.
4.
5.
Public Declare Function MAPISendDocuments Lib "MAPI32.DLL" _
 (ByVal ulUIParam As Long, ByVal lpszDelimChar As String, _
 ByVal lpszFilePaths As String, ByVal lpszFileNames As String, ByVal ulReserved As Long) As Long

  MAPISendDocuments Me.hwnd, "", FilePath, GetFileName(FilePath), 0&
...
Рейтинг: 0 / 0
Можно ли вывести пустое письмо с вложением через MAPI?
    #38631547
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, порадоваться за Вас обязательно нужно, труд и упорство всё перетрут
А можно выложить полное решение по сабжу: вывести пустое письмо с вложением через MAPI
спасибо
...
Рейтинг: 0 / 0
Можно ли вывести пустое письмо с вложением через MAPI?
    #38631614
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа,

а чем оно тебе не полное?

Вложить один файл:
Код: vbnet
1.
MAPISendDocuments Me.hwnd, "", "C:\MyPict\picture1.jpg", "picture1.jpg", 0&


Вложить 2 файла:
Код: vbnet
1.
MAPISendDocuments Me.hwnd, ";", "C:\MyPict\picture1.jpg;C:\MyPict\picture2.jpg", "picture1.jpg;picture2.jpg", 0&



Второй параметр - это разделитель, используемый в третьем и четвертом параметре
3-й параметр - разделенные пути к файлам
4-й параметр - то, что пишется в "теме" письма.

У меня изначально был бардак во втором параметре.
...
Рейтинг: 0 / 0
Можно ли вывести пустое письмо с вложением через MAPI?
    #38631620
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, спасибо, понял, а не пустое письмо таким образом не делается?
...
Рейтинг: 0 / 0
Можно ли вывести пустое письмо с вложением через MAPI?
    #38631638
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа,

что значит не пустое?
Оно с вложениями и с описаниями вложений в теме.
Идея именно в том, чтоб из программы отправить какой-то файл (результат работы программы), т.е. вывести окно любимого пользователю почтового клиента с уже вложенными файлами, а адресатов пользователь добавит сам.

Если нужно добавить адресатов или текст письма, то через Simple Mapi это делается, но API достаточно глючно работают с VB6, ну или надо разбираться, чего мне лично не нужно.
В VB6 есть готовые контролы "Microsoft MAPI Controls 6.0", когда-то ими успешно пользовался.
Также надо учесть что возможности MAPI весьма ограничены и Microsoft не очень-то их рекомендует.

Для простейших случаев mailto: через ShellExecute, но вложения "официально" и "универсально" там не поддерживаются.

Если нужна автоматика отправки и не ставить целью привязываться к почтовому MAPI-клиенту, то лучше всего подходит CDO.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Можно ли вывести пустое письмо с вложением через MAPI?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]