Как отправить письмо с помощью VBA так, чтобы оно сохранилось в отправленных на сервере (яндекс почта).
Читал, как отправлять через CDO, но не подходит, т.к. письмо молча уйдет к адресату и не сохранится. Догадываюсь, что можно отправлять через Outlook, и там письмо будет создано, но тут другая проблема - в почтовом ящике больше 15К писем, менеджеров 5, и не варик ставить на каждый оутлук и чтобы он качал все с сервера (даже заголовки занимают почему то неприлично много)
Может есть еще какие варианты?
Заранее спасибо.
Как отправить письмо с помощью VBA так, чтобы оно сохранилось в отправленных на сервере (яндекс почта).
Читал, как отправлять через CDO, но не подходит, т.к. письмо молча уйдет к адресату и не сохранится. Догадываюсь, что можно отправлять через Outlook, и там письмо будет создано, но тут другая проблема - в почтовом ящике больше 15К писем, менеджеров 5, и не варик ставить на каждый оутлук и чтобы он качал все с сервера (даже заголовки занимают почему то неприлично много)
не варик ставить на каждый оутлук и чтобы он качал все с сервера (даже заголовки занимают почему то неприлично много)
может надо оутлук правильно настроить? а сам я вот такой функцией отправляю письма [vba]
Код
Sub testSendMail() If SendMailOutlook(strSubject:="Заголовок", _ strBody:="Добрый день!", _ strSendTo:="Customer@mail.ru", _ strCopyTo:="Me_copy@mail.ru", _ strAttachFile:="", _ blnSend:=False) _ Then MsgBox "Полетело письмецо!" End Sub Private Function SendMailOutlook(ByVal strSubject As String, _ ByVal strBody As String, _ ByVal strSendTo As String, _ Optional ByVal strCopyTo As String = "", _ Optional ByVal strAttachFile As String = "", _ Optional ByVal blnSend As Boolean = False) As Boolean '' Author: boa '' Written: 12.10.2015 '' Edited: 03.12.2015 ' Description: Отправляет письма через MSOutlook ' blnSend ставим True если надо сразу отправлять письма
Dim OutApp As Object Dim OutMail As Object
On Error GoTo errHandle 'Создаем новое пустое сообщение Application.ScreenUpdating = False Set OutApp = CreateObject("Outlook.Application") '("Notes.NotesSession") OutApp.Session.Logon Set OutMail = OutApp.CreateItem(0)
'Заполняем письмо With OutMail .To = strSendTo .cc = strCopyTo ' .BCC = "test@ru" 'скрытая копия .Subject = strSubject ' .htmlbody = strHTMLBody .body = strBody If Len(strAttachFile) > 0 Then .Attachments.Add strAttachFile ' сюда полный адрес вложения If blnSend Then .Send Else .Save: .Display End With
SendMailOutlook = True
ExitFunction: Set OutMail = Nothing Set OutApp = Nothing Application.ScreenUpdating = True Exit Function
errHandle: MsgBox Err.Number & " " & Err.Description SendMailOutlook = False GoTo ExitFunction End Function
не варик ставить на каждый оутлук и чтобы он качал все с сервера (даже заголовки занимают почему то неприлично много)
может надо оутлук правильно настроить? а сам я вот такой функцией отправляю письма [vba]
Код
Sub testSendMail() If SendMailOutlook(strSubject:="Заголовок", _ strBody:="Добрый день!", _ strSendTo:="Customer@mail.ru", _ strCopyTo:="Me_copy@mail.ru", _ strAttachFile:="", _ blnSend:=False) _ Then MsgBox "Полетело письмецо!" End Sub Private Function SendMailOutlook(ByVal strSubject As String, _ ByVal strBody As String, _ ByVal strSendTo As String, _ Optional ByVal strCopyTo As String = "", _ Optional ByVal strAttachFile As String = "", _ Optional ByVal blnSend As Boolean = False) As Boolean '' Author: boa '' Written: 12.10.2015 '' Edited: 03.12.2015 ' Description: Отправляет письма через MSOutlook ' blnSend ставим True если надо сразу отправлять письма
Dim OutApp As Object Dim OutMail As Object
On Error GoTo errHandle 'Создаем новое пустое сообщение Application.ScreenUpdating = False Set OutApp = CreateObject("Outlook.Application") '("Notes.NotesSession") OutApp.Session.Logon Set OutMail = OutApp.CreateItem(0)
'Заполняем письмо With OutMail .To = strSendTo .cc = strCopyTo ' .BCC = "test@ru" 'скрытая копия .Subject = strSubject ' .htmlbody = strHTMLBody .body = strBody If Len(strAttachFile) > 0 Then .Attachments.Add strAttachFile ' сюда полный адрес вложения If blnSend Then .Send Else .Save: .Display End With
SendMailOutlook = True
ExitFunction: Set OutMail = Nothing Set OutApp = Nothing Application.ScreenUpdating = True Exit Function
errHandle: MsgBox Err.Number & " " & Err.Description SendMailOutlook = False GoTo ExitFunction End Function
А можете в двух словах сказать, как правильно, или ссылочку... Там вся переписка и с почтой работает 5-6 человек. Вся работа идет через веб. Как настроить так, чтобы через аутлук только отправлять письма, но не получать?
Спасибо.
Цитата
может надо оутлук правильно настроить?
А можете в двух словах сказать, как правильно, или ссылочку... Там вся переписка и с почтой работает 5-6 человек. Вся работа идет через веб. Как настроить так, чтобы через аутлук только отправлять письма, но не получать?PATRI0T
Set cdoMessage = CreateObject("CDO.Message") With cdoMessage .more more кода .send End With Savemessage cdoMessage, "C:\modified.eml" Sub Savemessage(message, Filename) Set Stream = CreateObject("ADODB.Stream") Stream.Open Stream.Type = message.GetStream().Type Stream.Charset = message.GetStream().Charset message.DataSource.SaveToObject Stream, "_Stream" Stream.SaveToFile Filename, 2 Stream.close Set Stream = Nothing End Sub
Set cdoMessage = CreateObject("CDO.Message") With cdoMessage .more more кода .send End With Savemessage cdoMessage, "C:\modified.eml" Sub Savemessage(message, Filename) Set Stream = CreateObject("ADODB.Stream") Stream.Open Stream.Type = message.GetStream().Type Stream.Charset = message.GetStream().Charset message.DataSource.SaveToObject Stream, "_Stream" Stream.SaveToFile Filename, 2 Stream.close Set Stream = Nothing End Sub
doober, спасибо, сейчас буду пробовать. Хотя, к моему стыду, я не совсем понял, как это должно работать... Вижу, что просто сохраняется файл письма на диск.. и вроде всё..
У меня еще один вопрос.. Код для отправки письма, который нашел в интернете, у меня почему то зависает при попытке отправить письмо (отметил стрелочкой, где виснет)
По таймауту вылетает с ошибкой [vba]
Код
Err -2147220973: "Нет доступа к Интернет"
[/vba]
? А как можно таймаут уменьшить? а то он надолго вешает весь ексель..
Sub Send_Mail() Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/" Dim oCDOCnf As Object, oCDOMsg As Object Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String On Error Resume Next 'sFrom – как правило совпадает с sUsername SMTPserver = "smtp.yandex.ru" ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru" sUsername = "***@yandex.ru" ' Учетная запись на сервере sPass = "***" ' Пароль к почтовому аккаунту
If Len(SMTPserver) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation, "www.Excel-VBA.ru": Exit Sub If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation, "www.Excel-VBA.ru": Exit Sub If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation, "www.Excel-VBA.ru": Exit Sub
sTo = "***@yandex.ru" 'Кому sFrom = "***@yandex.ru" 'От кого sSubject = "Автоотправка" 'Тема письма sBody = "Привет от Excel-VBA" 'Текст письма 'sAttachment = "C:/Temp/Книга1.xls" 'Вложение(полный путь к файлу) 'Проверка наличия файла по указанному пути If Dir(sAttachment, vbDirectory) = "" Then sAttachment = "" 'Назначаем конфигурацию CDO Set oCDOCnf = CreateObject("CDO.Configuration") With oCDOCnf.Fields .Item(CDO_Cnf & "sendusing") = 2 .Item(CDO_Cnf & "smtpauthenticate") = 1 .Item(CDO_Cnf & "smtpserver") = SMTPserver 'если необходимо указать SSL '.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465 '.Item(CDO_Cnf & "smtpusessl") = True .Item(CDO_Cnf & "sendusername") = sUsername .Item(CDO_Cnf & "sendpassword") = sPass .Update End With 'Создаем сообщение Set oCDOMsg = CreateObject("CDO.Message") With oCDOMsg Set .Configuration = oCDOCnf .BodyPart.Charset = "koi8-r" .From = sFrom .To = sTo .Subject = sSubject .TextBody = sBody If Len(sAttachment) > 0 Then .AddAttachment sAttachment .Send '<<<<<============================== Виснет тут ========================= End With
Select Case Err.Number Case -2147220973: sMsg = "Нет доступа к Интернет" Case -2147220975: sMsg = "Отказ сервера SMTP" Case 0: sMsg = "Письмо отправлено" Case Else: sMsg = "Ошибка номер: " & Err.Number & vbNewLine & "Описание ошибки: " & Err.Description End Select MsgBox sMsg, vbInformation, "www.Excel-VBA.ru" Set oCDOMsg = Nothing: Set oCDOCnf = Nothing End Sub
[/vba]
doober, спасибо, сейчас буду пробовать. Хотя, к моему стыду, я не совсем понял, как это должно работать... Вижу, что просто сохраняется файл письма на диск.. и вроде всё..
У меня еще один вопрос.. Код для отправки письма, который нашел в интернете, у меня почему то зависает при попытке отправить письмо (отметил стрелочкой, где виснет)
По таймауту вылетает с ошибкой [vba]
Код
Err -2147220973: "Нет доступа к Интернет"
[/vba]
? А как можно таймаут уменьшить? а то он надолго вешает весь ексель..
Sub Send_Mail() Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/" Dim oCDOCnf As Object, oCDOMsg As Object Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String On Error Resume Next 'sFrom – как правило совпадает с sUsername SMTPserver = "smtp.yandex.ru" ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru" sUsername = "***@yandex.ru" ' Учетная запись на сервере sPass = "***" ' Пароль к почтовому аккаунту
If Len(SMTPserver) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation, "www.Excel-VBA.ru": Exit Sub If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation, "www.Excel-VBA.ru": Exit Sub If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation, "www.Excel-VBA.ru": Exit Sub
sTo = "***@yandex.ru" 'Кому sFrom = "***@yandex.ru" 'От кого sSubject = "Автоотправка" 'Тема письма sBody = "Привет от Excel-VBA" 'Текст письма 'sAttachment = "C:/Temp/Книга1.xls" 'Вложение(полный путь к файлу) 'Проверка наличия файла по указанному пути If Dir(sAttachment, vbDirectory) = "" Then sAttachment = "" 'Назначаем конфигурацию CDO Set oCDOCnf = CreateObject("CDO.Configuration") With oCDOCnf.Fields .Item(CDO_Cnf & "sendusing") = 2 .Item(CDO_Cnf & "smtpauthenticate") = 1 .Item(CDO_Cnf & "smtpserver") = SMTPserver 'если необходимо указать SSL '.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465 '.Item(CDO_Cnf & "smtpusessl") = True .Item(CDO_Cnf & "sendusername") = sUsername .Item(CDO_Cnf & "sendpassword") = sPass .Update End With 'Создаем сообщение Set oCDOMsg = CreateObject("CDO.Message") With oCDOMsg Set .Configuration = oCDOCnf .BodyPart.Charset = "koi8-r" .From = sFrom .To = sTo .Subject = sSubject .TextBody = sBody If Len(sAttachment) > 0 Then .AddAttachment sAttachment .Send '<<<<<============================== Виснет тут ========================= End With
Select Case Err.Number Case -2147220973: sMsg = "Нет доступа к Интернет" Case -2147220975: sMsg = "Отказ сервера SMTP" Case 0: sMsg = "Письмо отправлено" Case Else: sMsg = "Ошибка номер: " & Err.Number & vbNewLine & "Описание ошибки: " & Err.Description End Select MsgBox sMsg, vbInformation, "www.Excel-VBA.ru" Set oCDOMsg = Nothing: Set oCDOCnf = Nothing End Sub
SMTPserver = "smtp.yandex.ru" ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru" sUsername = "***@yandex.ru" ' Учетная запись на сервере sPass = "***" ' Пароль к почтовому аккаунту
[/vba] Эти данные корректны?
[vba]
Код
SMTPserver = "smtp.yandex.ru" ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru" sUsername = "***@yandex.ru" ' Учетная запись на сервере sPass = "***" ' Пароль к почтовому аккаунту
Не может висеть 5 минут. Что то у Вас не так. Возможно аттач большой по размеру, интернет слабый. Возможно задержка в коде установлена между отправками писе. желательно бы все шаги промотеть, а не только процедуру отправки писем
Не может висеть 5 минут. Что то у Вас не так. Возможно аттач большой по размеру, интернет слабый. Возможно задержка в коде установлена между отправками писе. желательно бы все шаги промотеть, а не только процедуру отправки писемdoober
спасибо. интернет нормальный, вложение вообще не прикладывал.. (закомментил строку с аттачем) сейчас не висит, после указания портов. Но до этого зависал.. невозможно было ни отладку остановить, ни екселем пользоваться. Полный блок. Может быть нужно было сделать DoEvents, но не пробовал еще.
ну и мысль такая.. а вдруг интернет запнется - хочется чтоб он быстро ответил "нет интернета", а не висел 5 минут и только потом сказал. Поэтому мысль про таймаут..
спасибо. интернет нормальный, вложение вообще не прикладывал.. (закомментил строку с аттачем) сейчас не висит, после указания портов. Но до этого зависал.. невозможно было ни отладку остановить, ни екселем пользоваться. Полный блок. Может быть нужно было сделать DoEvents, но не пробовал еще.
ну и мысль такая.. а вдруг интернет запнется - хочется чтоб он быстро ответил "нет интернета", а не висел 5 минут и только потом сказал. Поэтому мысль про таймаут..PATRI0T