Отправка отчетов Access по почте
Как можно отправить отчет, сгенерированный Access в качестве вложения к эл. письму.
Т.е. последовательность действий:
1. Генерируется отчет в Access
2. Сохраняется например в файле RTF (при этом пропадают границы у таблиц) или PDF (с границами все в порядке) на диск
3. Файл шифруется (есть BAT файл который запускает программу шифрования с необходимыми ключами)
4. Зашифрованный файл высылается адресату как вложение к электронному письму.
Интересно все, что связяно с реализацией действий 2-4 :)))
Спасибо.
2. Сохраняется например в файле RTF (при этом пропадают границы у таблиц) или PDF (с границами все в порядке) на диск
Сохранить отчет еще можно в формат - Снимок (*.snp) - спец. формат для хранения и печати отчетов, очень точная копия.
3. Файл шифруется (есть BAT файл который запускает программу шифрования с необходимыми ключами)
BAT файл с ключами все запускает, но .... имя файла, который ты токо что из Access экспортировал, в него уже не засунешь. Т.е. только если ты программно создашь новый bat (заполнишь его как полагается), и запустишь.... Но тогда проще вообще не создавать никого bat'ника, а сразу использовать функцию API типа Shell, например:
Private Const INFINITE = &HFFFF
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, _
ByVal fInherit As Integer, ByVal hObject As Long) As Long
' Запускаем внешнюю программу и ждем ее завершения
WaitForProcessToEnd "C:\test.exe /p ля-ля и т.д."
' А вот вспомогательная процедурка
Public Sub WaitForProcessToEnd(cmdLine As String)
Dim retVal As Long, pID As Long, pHandle As Long
pID = Shell(cmdLine)
pHandle = OpenProcess(&H100000, True, pID)
retVal = WaitForSingleObject(pHandle, INFINITE)
End Sub
4. Зашифрованный файл высылается адресату как вложение к электронному письму.
Спасибо.
Устанавливаешь связь с Outlook через CreateObject("Outlook.Application"), создаешь письмо, цепляешь файл и отправляешь, если надо, могу привести код...
Устанавливаешь связь с Outlook через CreateObject("Outlook.Application"), создаешь письмо, цепляешь файл и отправляешь, если надо, могу привести код...
YES!!! Спасибо огромное за помощь!
Если не сложно, приведи код, который создает и отправляет через Outlook (Outlook Express) мыло :)
YES!!! Спасибо огромное за помощь!
Если не сложно, приведи код, который создает и отправляет через Outlook (Outlook Express) мыло :)
А лучше скажи, каким образом можно узнать какие методы и свойства поддерживает приложение?
По-моему, в редакторе VBA по F2 вызывается objectbrowser...
YES!!! Спасибо огромное за помощь!
Если не сложно, приведи код, который создает и отправляет через Outlook (Outlook Express) мыло :)
Dim myItem As MailItem
Dim myAttachments As Attachments
Dim Path As String, str as String
' создаем связь с Outlook, запуская свою копию Outlook, она не будет видена на экране, пока не установишь ей свойства: myOlApp.Visible = True
Set myOlApp = CreateObject("Outlook.Application")
' Создаем письмо
Set myItem = myOlApp.CreateItem(0)
' Формирование письма
myItem.To = "aaa@mail.ru"
myItem.Subject = "Hi, это тема письма"
str = "Это текст письма"
str = str + Chr(13) & "Это вторая строка текста письма"
myItem.Body = str
' объект - присоединенный файл
Set myAttachments = myItem.Attachments
' путь к присоединяемому файлу
Path = "C:\test.dat"
' присоединяем файл
myAttachments.Add Path, olByValue, 1, "test.dat - это название файла для отображения в письме"
' посылаем письмо
myItem.Send
Для того чтобы все это работало необходимо в Tools/References подключить библиотеку - Microsoft Outlook 10.0/9.0/8.0 Object Library
На счет Outlook Express. C ним не работал, не знаю. У меня всегда стоял Microsoft Outlook. Надо смотреть, есть ли среди библиотек (в Tools/References) какая-нибудь Microsoft Outlook Express.... и поддерживает ли она вышуказанные объекты и методы ... у самого не стоит, посмотреть не могу
Но есть подозрение, что библиотеку - Microsoft Outlook 10.0/9.0/8.0 Object Library может пихать Office и без установки MOutlook, так, на всякий случай... вообщем надо смотреть что стоит на компе, у которого только Express.
А лучше скажи, каким образом можно узнать какие методы и свойства поддерживает приложение?
По-моему, в редакторе VBA по F2 вызывается objectbrowser...
Ну да, F2. Еще когда объектные переменные пишешь, у них свойства и методы вываливаются... :)
С Outlook, Excel, Access вообще просто, подключил библиотеку, на какой-нибудь их объект курсор навел, F1 нажал, до главного объекта - Application добрался и всю древовидную иерархию объектов увидел и обрадовался...
А вот библиотеки Microsoft Outlook 10.0/9.0/8.0 Object Library я не нашел.
Хотя у меня установлен Outlook из пакета Office97Rus (я им не пользуюсь, т.к. не получается установить службу Internet Mail и после установки приложения MINET.ECF она в списке так и не появляется - видимо не удачно кракнутый дистрибутив :). Также стоит Outlook Express из поставки WindowsXPEng - вот им я и пользуюсь постоянно.
После добавления библиотеки Outlook Express Mime Editor, код выполнился нормально (до этого ругался на MailItem и Attachments). Письмо создалось, но в Outlook из Office97 и соотв. никуда она отправлено не было :(
Пробовал вместо Outlook.Application писать OutlookExpress.Application - ругается на код.
Как быть?
Но даже если через Outlook Express не получится, то можно тогда и по другому отправлять, через MAPI
Пример функции:
' Отправка письма с вложенным(или без него) файлом через MAPI.
' Для работы необходимо установить компонент - MSMAPI32.OCX
' xAttachments - это массив содержащий пути к файлам для присоединения в письму
Dim objSession As Object, objMessage As Object
Dim objOneRecip As Object
Dim i As Integer
On Error GoTo error_sendMsg
' Создаем сессию
Set objSession = CreateObject("MSMAPI.MAPISession")
' Получаем доступ к серверу, логинимся по умолчанию
objSession.SignOn
' Создаем письмо
Set objMessage = CreateObject("MSMAPI.MAPIMessages")
' Связываем письмо с сессией (иначе работать не будет)
objMessage.SessionID = objSession.SessionID
' Начинаем составлять сообщение
' очищаем буфер редактирования
objMessage.Compose
' устанавливаем индекс работы с сообщением.
' "-1" - сообщение в буфере редакт., т.е. исходящее
objMessage.MsgIndex = -1
' заполняем поля сообщения
objMessage.RecipAddress = xAddress
' Чтобы диалоговое окно с неоднозначными именами не отображалось
objMessage.AddressResolveUI = False
objMessage.MsgSubject = xSubject
objMessage.MsgNoteText = xText
' Присоединяем файлы (если они есть)
If IsArray(xAttachments) Then
For i = 0 To UBound(xAttachments)
objMessage.AttachmentIndex = objMessage.AttachmentCount
objMessage.AttachmentPathName = xAttachments(i)
Next
End If
' посылаем сообщение не показывая его
objMessage.Send False
' отсоединяемся от сервера
objSession.SignOff
SendEmail = True
Exit_Fun:
Exit Function
error_sendMsg:
SendEmail = False
Resume Exit_Fun
End Function
Подробнее про MAPI можно почитать здесь: http://www.firststeps.ru/vb/msmapi/msmapi1.html
2. установил - regsvr32 msmapi32.ocx - сообщение succeded
3. Скопировал текст функции в модуль Access, создал ее вызов
4. В пошаговом режиме запустил - вываливается с ошибкой невозможно создать ActiveX объект в Set objSession = CreateObject("MSMAPI.MAPISession")
5. На всякий случай проверил Сервис-Элементы ActiveX в списке присутствуют Microsoft MAPI Session Control, version 6.0 и Microsoft MAPI Message Control, version 6.0. Сделал еще раз подключение - Подключить - %windir%\system\msmapi32.ocx
6. повторилось действие 4 с ошибкой
7. проверил, что Outlook Express является клиентом по умолчанию - здесь по-моему ошибка - OE клиентом по умолчанию не является и установить его таковым не получается (после обновления окна он пишет, что не является клиентом, а в свойствах инета он не выпадает в списке)
[QUOTE]Originally posted by SergeySV
Вот, привожу функцию для отправки письма с вложенными файлами через MAPI. Для того чтобы он работал необходимо в системе зарегестрировать файл MSMAPI32.OCX (если у тебя его еще нет). Файл на всякий случай прикладываю. (Если возникнут трудности с добавление в проект этого ActiveX, пиши, подскажем).
Причем у меня с выбором в IE почтовой программы все нормально, так что дело в ocx, может испортился после переноса....
Вычислил, что это файл C:\Program Files\Microsoft Office\Office\MSOUTL8.OLB (un-инсталлировал Outlook, когда работал Access - этот файл оказался занят).
Теперь вот Access работает без Outlook, но как переносить программу на другие компы, где нет MSOUTL8.OLB? В общем, надо где-то эту привязку прибить...
Прикольно, у меня на работе почему такая же ошибка о неправильной регистрации выпадает... должен работать... ща посмотрим, почему он капризничает...
Причем у меня с выбором в IE почтовой программы все нормально, так что дело в ocx, может испортился после переноса....
Кстати, после всех экспериментов над базой она стала зависима к наличию в системе Outlook (из Office97). Если его удалить, то при запуске ругается, что не найдена библиотека библиотека для выполнения функции format над строками :)
Вычислил, что это файл C:\Program Files\Microsoft Office\Office\MSOUTL8.OLB (un-инсталлировал Outlook, когда работал Access - этот файл оказался занят).
Теперь вот Access работает без Outlook, но как переносить программу на другие компы, где нет MSOUTL8.OLB? В общем, надо где-то эту привязку прибить...
С этой траблой я сам разобрался - в сервис-ссылки - надо было поотключать лишние библиотеки.
С этой траблой я сам разобрался - в сервис-ссылки - надо было поотключать лишние библиотеки.
Прикольно, а что отключал (я тока двигал вверх вниз, типа.. приоритеты, иногда помогает когда конфликты)?
Прикольно, а что отключал (я тока двигал вверх вниз, типа.. приоритеты, иногда помогает когда конфликты)?
Надо было снять сслыку на Microsoft Outlook 8.0 Object Library
Так как по поводу подключения msmapi.ocx?
Надо было снять сслыку на Microsoft Outlook 8.0 Object Library
Так как по поводу подключения msmapi.ocx?
Я думал ты это про msmapi.ocx... :)
Глюк изредка встречается на просторах инета, правда до правильного ответа я пока не добрался... то что предлагали не работает... есть идеи что якобы этот ActiveX требует определ. лизенции - соответ. ключа в реестре... есть описание у Microsoft этого глюка, правда для программирования под FoxPro, там они вообще в качестве решения предлагали не писать через CreateObject, а через Set a=New MSMAPI.MAPISession, но в нашем случае это не проходит... :(
Кстати, у тебя VB6 стоит на компе?
Кстати, у тебя VB6 стоит на компе?
Нет. VB я себе не ставил.
Нет. VB я себе не ставил.
Хм.....у меня раньше стоял на этой машине VB6, пока не пришлось систему переставлять.... интересно как с ним он будет работать...
В инете пишут разное, кто-то говорит что этот Activex обязательно надо пихать на форму, а через CreateObject он не будет работать (но на форму он тоже не хочет пихаться), другие пишут, что Office должен поддерживать msmapi32.ocx на ура....
А как программно сохранить отчет на диск? Жаль, что в Access нет макрорекордера :)
Ладно, к этому траблу я еще вернусь попозже. В конце концов, можно какой-нибудь BLAT использовать для отправки почты.
А как программно сохранить отчет на диск? Жаль, что в Access нет макрорекордера :)
Сам больше импортировал, чем экспортировал, ща посмотрим: или через VBA или программное меню DoCmd.MenuItems....
acFormatSNP, "rpp333.snp", False
Если в систему поставить VB6, то компонентом msmapi32.ocx можно запросто пользоваться в Office. Так что можно ставить, а потом удалять VB6..... :)
Что точно он прописывает в реестре для работы (или еще что) я пока не определил, условия были не идеальные, но попытаюсь докопаться, как же установить этот компонент без VB6, самому интересно ... :)
Дело было действительно в лицензионных ключах. Некоторые ActiveX компоненты для работы требуют, чтобы в реестре, в разделах:
1. HKEY_CLASSES_ROOT\Licenses\
2. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\
были созданы соответствующие ключи.
Они автомат. создаются когда программу инсталир. с соответ. компонентами, а вот если ты сам отдельно ставишь, тогда ручками надо дописывать(вот только что дописывать неизвестно).
Однако добрые люди уже постарились и создали reg файл с лиценз. ключами наиболее распространенных строптивых компонентов. Вот, прикладываю.
Просто запусти его и он добавит в реестр необходимые ключи.