Макрос отправки письма из Excel через Outlook

Если вам нужно рассылать письма из Excel,
воспользуйтесь готовым решением в виде надстройки FillDocuments

Ознакомьтесь с возможностями и способами рассылки писем из Excel,
а также с инструкцией по настройке рассылки через Аутлук

Пример макроса, отправляющего письма со вложениями из Excel через почтовый клиент Outlook:

Sub Отправить_Письмо_из_Outlook()
 
    'отправляем письмо без вложений
    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 1", "Тема письма 1")
    If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
 
 
    'отправляем письмо с 1 вложением
    attach$ = ThisWorkbook.FullName    ' прикрепляем текущий файл Excel
    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 2", "Тема письма 2", attach$)
    If res Then Debug.Print "Письмо 2 отправлено успешно" Else Debug.Print "Ошибка отправки"
 
 
    'отправляем письмо с несколькими вложениями
    Dim coll As New Collection    ' заносим в коллекцию список прикрепляемых файлов
    coll.Add "C:\Documents and Settings\Admin\Рабочий стол\Tyres.jpg"
    coll.Add "C:\Documents and Settings\Admin\Рабочий стол\calc.xls"
    coll.Add ThisWorkbook.FullName    ' прикрепляем текущий файл Excel

    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 3", "Тема письма 3", coll)
    If res Then Debug.Print "Письмо 3 отправлено успешно" Else Debug.Print "Ошибка отправки"
End Sub

Макрос использует функцию SendEmailUsingOutlook, которая:

  • принимает в качестве параметров адрес получателя письма, тему и текст письма, список вложений
  • запускает Outlook, формирует письмо, и отправляет его
  • возвращает TRUE, если отправка прошла успешно, или FALSE, если с отправкой почты вызникли проблемы

 

Код функции SendEmailUsingOutlook:

Function SendEmailUsingOutlook(ByVal Email$, ByVal MailText$, Optional ByVal Subject$ = "", _
                               Optional ByVal AttachFilename As Variant) As Boolean
    ' функция производит отправку письма с заданной темой и текстом на адрес Email
    ' с почтового ящика, настроенного в Outlook для отправки писем "по-умолчанию"
    ' Если задан параметр AttachFilename, к отправляемому письму прикрепляется файл (файлы)

    On Error Resume Next: Err.Clear
    Dim OA As Object: Set OA = CreateObject("Outlook.Application")
    If OA Is Nothing Then MsgBox "Не удалось запустить OUTLOOK для отправки почты", vbCritical: Exit Function
 
    With OA.CreateItem(0)   'создаем новое сообщение
        .To = Email$: .Subject = Subject$: .Body = MailText$
        If VarType(AttachFilename) = vbString Then .Attachments.Add AttachFilename
        If VarType(AttachFilename) = vbObject Then    ' AttachFilename as Collection
            For Each file In AttachFilename: .Attachments.Add file: Next
        End If
        For i = 1 To 100000: DoEvents: Next    ' без паузы не отправляются письма без вложений
        Err.Clear: .Send
        SendEmailUsingOutlook = Err = 0
    End With
    Set OutApp = Nothing
End Function

 

Пример макроса, с получением параметров письма из ячеек листа Excel: 

Sub Отправить_Письмо_из_Outlook()
    ' адрес получателя - в ячейке A1, текст письма - в ячейке A2
    res = SendEmailUsingOutlook(Cells(1, 1), Range("a2"), "Тема письма 1")
    If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
End Sub

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Добрый день, Игорь!

Вставил Ваш код без изменений, VBA ругается на строчку
res = SendEmailUsingOutlook("" & TextBox1.Text, "" & TextBox2.Text, "Тема письма 2", coll)
- ошибка 424 Объект не найден

Подскажите, в чем может быть проблема?
С уважением, Войтик Олег.

А что мне настроить в Аутлуке

Рахмон, с макросом всё норм.
Думаю, достаточно Аутлук настроить в новом Office

Добрый день

у меня раньше работал макрос и был установлен офис 2013
сейчас мне установили офис 2016
и у меня перестал работать макрос
подскажите в чем проблема.
макрос написал мой коллега по работе.
он уволился и я теперь не знаю что делать.
а макрос этот нужен.

скажите что мне исправить чтобы он работал

Sub Send_Mail()
    Dim oOutlApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sTblBody As String, sAttachment As String
    Dim rDataR As Range
    Dim IsOultOpen As Boolean
    Dim qty%
 
 qty = Worksheets("Лист1").Cells(1, 2)
    Application.ScreenUpdating = False
    'Пробуем подключиться к Outlook
    On Error Resume Next
    Set oOutlApp = GetObject(, "Outlook.Application")
    If Err = 0 Then
        IsOultOpen = True
    Else
        Err.Clear
        Set oOutlApp = CreateObject("Outlook.Application")
    End If
    oOutlApp.Session.Logon
    Set objMail = oOutlApp.CreateItem(0)   'создаем новое сообщение
    'если не получилось создать приложение или экземпляр сообщения - выходим
    If Err.Number <> 0 Then Set oOutlApp = Nothing: Set objMail = Nothing: Exit Sub
 
    With ActiveWorkbook.Sheets("Письмо")
        sTo = .Range("B4").Value
        'sTo = "Rakhmondzhon.Usmanov@x5.ru"
        sCC = .Range("B5").Value
        sSubject = .Range("B6").Value
        sBody = .Range("A9").Value
        sAttachment = .Range("B7").Value
        'Переносы строк и шрифт
        sBody = Replace(sBody, Chr(10), "<br />")
        sBody = Replace(sBody, vbNewLine, "<br />")
        sBody = "<span style=""font-size: 14px; font-family: Arial"">" & sBody & "</span>"
        'Таблица
        'важно добавлять таблицу после оформления переносов строк и шрифта
        'в противном случае форматирование таблицы может "поплыть"
       Set rDataR = .Range(.Cells(12, 1), .Cells(qty + 12, 12))
        sTblBody = ConvertRngToHTM(rDataR)
        'подменяем метку {TABLE} в тексте письма реальной таблицей(сформированной выше)
        sBody = Replace(sBody, "{TABLE}", sTblBody)
    End With
 
 
    'создаем сообщение
    With objMail
        .To = sTo 'адрес получателя
        .CC = sCC 'адрес для копии
'        .BCC = "" 'адрес для скрытой копии
        .Subject = sSubject 'тема сообщения
        .BodyFormat = 2  'olFormatHTML - формат HTML
'        .Body = RangeToTextTable(Selection) 'вставляем таблицу без форматирования
'        .Body = sBody
        .HTMLBody = sBody
        If sAttachment <> "" Then
            .Attachments.Add sAttachment
        End If
        .display 'если необходимо просмотреть сообщение, а не отправлять без просмотра
        '.Send 'если необходимо отправить сообщение без просмотра
    End With
 
    If IsOultOpen = False Then oOutlApp.Quit
    Set oOutlApp = Nothing: Set objMail = Nothing
    DoEvents
End Sub
 
 
Function ConvertRngToHTM(rng As Range)
    Dim fso As Object, ts As Object
    Dim sF As String, resHTM As String
    Dim wbTmp As Workbook
 
    sF = Environ("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    'переносим указанный диапазон в новую книгу
    rng.Copy
    Set wbTmp = Workbooks.Add(1)
    With wbTmp.Sheets(1)
        'вставляем только ширину столбцов, значения и форматы
        .Cells(1).PasteSpecial xlPasteColumnWidths
        .Cells(1).PasteSpecial xlPasteValues
        .Cells(1).PasteSpecial xlPasteFormats
        .Cells(1).Select
        Application.CutCopyMode = False
        'удаляем все объекты(фигуры, рисунки и пр.)
        '------------------------------------------
        'если рисунки и объекты нужны - удалить этот блок
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
        '------------------------------------------
    End With
    'сохраняем книгу как Веб-страницу(чтобы содержимое конвертировать в HTML-код)
    With wbTmp.PublishObjects.Add( _
         SourceType:=xlSourceRange, Filename:=sF, _
         Sheet:=wbTmp.Sheets(1).name, Source:=wbTmp.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With
    'открываем созданный файл как текстовый и считываем содержимое
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sF).OpenAsTextStream(1, -2)
    resHTM = ts.ReadAll
    ts.Close
    'выравниваем таблицу по левому краю(если надо оставить по центру - удалить эту строку)
    ConvertRngToHTM = Replace(resHTM, "align=center x:publishsource=", "align=left x:publishsource=")
    'закрываем временную книгу и удаляем
    wbTmp.Close False
    Kill sF
    'очищаем объектные переменные
    Set ts = Nothing: Set fso = Nothing
    Set wbTmp = Nothing
End Function

помогите с макросом Если в столбце "R" значение будет больше либо равно 5, тогда нужно отправить почту (письмо или ссылку) на адрес с Оутлук

Отправка email без помощи outlook. а через CDO

Если в ячейке А1 значение будет больше 2 тогда отправиться почта. Появится сообщение "Письмо отправлено".
Для того чтобы это работало нужно настроить макрос.
Вот что нужно сделать:
1. В excel нажать "Alt+F11". Откроется окно Visual Basic.
В главном меню окна выбрать Tools-References. В открывшемся окне найти "Microsoft CDO for Windows 2000 Library", напротив него поставить галочку и нажать кнопку "ОК". Сохранить файл.
Это нужно сделать только один раз.
2. В окне Visual Basic в левом верхнем углу увидите окно Project. В нем нужно двойным щелкчом щелкнуть по "Лист1 (Лист1)". Этим самым вы в правом окне откроете код макроса.

Этот код вам нужно заточить под себя.
Зеленым цветом даны комментарии, поэтому вам должно быть все понятно.
Прописываете там свой почтовый ящик, пароль, почтовый ящик получателя, тему сообщения, текст сообщения.
Все сохраняете.

Вот код:

Option Explicit
 
 
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim Rn As Range
    Set Rn = Intersect(Target, Range("A1"))
    If Not Rn Is Nothing Then
        If Rn.Value > 2 Then Send_Mail
    End If
 End Sub
 
Private 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 = "4444@yandex.ru"    ' Учетная запись на сервере
    sPass = "88888"    ' Пароль к почтовому аккаунту
 
    If Len(SMTPserver) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation: Exit Sub
    If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation: Exit Sub
    If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation: Exit Sub
 
    sTo = "22222@mail.ru"    'Кому
    sFrom = "4444@yandex.ru"    'От кого
    sSubject = "Автоотправка"    'Тема письма
    sBody = "Привет"    'Текст письма
    sAttachment = ""    'Вложение(полный путь к файлу)
    'Проверка наличия файла по указанному пути
    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
    Set oCDOMsg = Nothing: Set oCDOCnf = Nothing
End Sub

Добрый вечер! Спасибо за макрос. Подскажите, пожалуйста, как добавить в тело письма информацию об отправителе из поля Подпись Outlook? Извините за глупый вопрос.

Здравствуйте, Сергей
Оформляйте заказ на сайте http://excelvba.ru/order/send
прикрепляйте примеры файлов, и подробно описывайте, что откуда и куда должно вставляться в письмо, - тогда сделаю.

Доброго времени суток!
Есть необходимость отправлять отчёты в виде таблицы 2х10 ячеек в письме через outlook более десятка раз на день.
В теме письма макрос на отправку через excel из 1й ячейки, на диапазон найти не могу. Необходимо что бы отправлялось письмо на 3х адресатов, с табличкой внутри сообщения из файла. Вариант с прикреплённым файлом не подходит. Помогите с написанием кода плс!!!

Мой макрос работает только под Windows
Как на Маке сделать - не знаю, нет Мака для тестирования

Добрый день
Запускаю макрос, но выскакивает сообщение "Не удалось запустить OUTLOOK..."
Outlook запущен, работает нормально
У меня Mac, возможно нужен другой код?

Доброго времени суток! Подскажите пожалуйста, нужен макрос для отправки фиксированного диапазона ячеек A14:N25 через аутлук в теле письма в виде куска таблицы
Нашел макрос на отправку файла, вот только не могу понять в каком формате нужно прописать attachment?

Option Explicit

Sub Send_Mail()
Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String

Application.ScreenUpdating = False
On Error Resume Next
Set objOutlookApp = CreateObject("Outlook.Application")
objOutlookApp.Session.Logon
Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение
'если не получилось создать приложение или экземпляр сообщения - выходим
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub

sTo = "AddressTo@mail.ru" 'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
sSubject = "Автоотправка" 'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
sBody = "Привет от Excel-VBA" 'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value)
sAttachment = "C:/Temp/Книга1.xls" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)

'создаем сообщение
With objMail
.To = sTo 'адрес получателя
.Subject = sSubject 'тема сообщения
.Body = sBody 'текст сообщения
.Attachments.Add sAttachment
.Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
End With
exit_:
Set objOutlookApp = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True
End Sub

СПАСИБО!!!

Можем сделать под заказ.

Добрый день.
Отправка писем данным макросом работает прекрасно, но можно добавить параметр который отвечает за отправку письма не сразу, а в назначенную дату и время ?
Необходима рассылка уведомлений за 10 дней до контрольной даты.
Заранее спасибо за ответ.

Александр, я не консультирую по бесплатным макросам, тем более, если они написаны не мной.
Обратитесь на форумы по Excel, там помогут.

Здравствуйте,снова :)
Пошел по Вашему совету =>
1. сначала файл сохраняю в формате .pdf в определенной папке
2. Отправляю файл с прикреплением этого файла из определенной папки
Вот только проблемка, он файл сохраняет, но ничего не отправляется...

Макрос ниже:

Sub save_in_pdf_and_send_email()
Dim s$
s = "C:\Users\alexander.leontyev\Desktop\60_SQA\10. Supplier perfomance\SP"
MakeSureDirectoryPathExists s
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
s & "\Supplier Perfomance - " & Range("b3") & " - " & Range("b4") & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False

Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String

Application.ScreenUpdating = False
On Error Resume Next
Set objOutlookApp = GetObject(, "Outlook.Application")
Err.Clear 'Outlook закрыт, очищаем ошибку
If objOutlookApp Is Nothing Then
Set objOutlookApp = CreateObject("Outlook.Application")
End If
objOutlookApp.Session.Logon
Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение 'если не получилось создать приложение или экземпляр сообщения - выходим
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub

sTo = Range("ac3") & ";" & Range("ac4") & ";" & Range("ac5") & ";" & Range("ac6") 'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
sSubject = "Supplier Performance - " & Range("b3") & " - " & Range("b4") 'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
sBody = "We inform you that we are appreciated you by point evaluation => more detailed description is presented in the attached file"
sAttachment = "C:\Users\alexander.leontyev\Desktop\60_SQA\10. Supplier perfomance\SP" & "\Supplier Perfomance - " & Range("b3") & " - " & Range("b4") & ".pdf" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)

With objMail
.To = Range("ac3") & ";" & Range("ac4") & ";" & Range("ac5") & ";" & Range("ac6")
.CC = Range("ad4") & ";" & Range("ad5") & ";" & Range("ad6")
.BCC = ""
.Subject = "Supplier Performance - " & Range("b3") & " - " & Range("b4")
.Body = "We inform you that we are appreciated you by point evaluation => more detailed description is presented in the attached file"
End With

Set objOutlookApp = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True

End Sub

Спасибо большое, сейчас попробую :)

1. листа в формате PDF не существует.
если хотите его прикрепить, - сначала надо сохранить этот лист в формате PDF в файл
иначе - никак. впрочем, это происходит моментально и незаметно для пользователя, если макрос правильно написан
ваш код тут не подойдет, - он подходит только для отправки книги в обычном формате (Excel)
для PDF нужен совсем другой код (с использованием CDO или почтовой программы типа Outlook)

2. в четвёртой строке, в коде ошибка: .CC = Range("h25") & Range("h26") тут не в тему
метод SendMail объекта Workbook не поддерживает указание получателей копии в таком виде (надо указывать массив текстовых значений)
попробуйте заменить четвертую строку следующим:

.SendMail Recipients:=array(Range("h21") & Range("h22"), Range("h25") & Range("h26")), Subject:="SP"

1. Помогите пожалуйста скорректировать макрос, так чтобы он вкладывал в письмо лист в формате PDF (не сохраняя на рабочем столе, потом прописывать чтобы из папки вставлял и прочее)
2. Скорректировать макрос, чтобы вставлял помимо основных получателей, еще получателей для копии письма (основные адреса указаны у меня в ячейках H21, H22, а для копии в ячейках H25, H26)

1. Sub send_emails()
2. ThisWorkbook.Sheets("SP").Copy
3. With ActiveWorkbook
4. .SendMail Recipients:=Range("h21") & Range("h22").CC = Range("h25") & Range("h26"), Subject:="SP"
5. .Close SaveChanges:=False
6. End With
7. End Sub

P.S.
для составления данного макроса пользовался интернетом, вот только не нашел как вставить лист в формате .pdf и получателей для копии не работает)

Спасибо огромное

Замените "почта куда отправлять" на Range("D2")
где D2 - адрес ячейки с адресом почты

Здравствуйте, написала макрос для отправки через Outlook письма со вложенной екселевской табличкой. Помогите!!!

Sub SendWorkbook()
ActiveWorkbook.SendMail Recipients:="моя почта", Subject:="Лови файлик"
End Sub

Sub SendSheet()
ThisWorkbook.Sheets("рассылка").Copy
With ActiveWorkbook
.SendMail Recipients:="почта куда отправлять", Subject:="Лови файлик"
.Close SaveChanges:=False
End With
End Sub

Но можно ли, чтобы указывался не конкретный адрес куда отправлять, а из конкретной ячейки брать значение. Спасибо

просто .CC = Email$, .BCC = Email$ (скрытая)

Автору спасибо!

Игорь, спасибо за макрос
вопрос: а если адреса получателей расположены в диапазоне ячеек (A1:A20)

Все файлы откуда? со всего компа? :)

Макрос поиска всех файлов в папке по расширению есть здесь:
http://excelvba.ru/code/FilenamesCollection
находите все файлы нужные, и в цикле прикрепляете их к письму
примерно так код будет выглядеть (на забудьте под макросом добавить код функции GetAllFileNamesUsingFSO из статьи по ссылке)

'отправляем письмо с несколькими вложениями
    FolderPath = "c:\MyFolder\"
    Dim coll As NEW Collection    ' заносим в коллекцию список прикрепляемых файлов
    Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject

    GetAllFileNamesUsingFSO FolderPath, "*.pdf", FSO, coll, 1 ' поиск файлов ПДФ с добавлением найденный в коллекцию coll
    GetAllFileNamesUsingFSO FolderPath, "*.htm", FSO, coll, 1 ' поиск файлов HTM с добавлением найденный в коллекцию coll
    ' а чтобы без расширения файлы прикрепить - немного код надо будет доработать

    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма", "Тема письма", coll)

Подскажите пожалуйста а как сделать что бы В письмо будет вкладываться все файлы с расширениями .pdf, .htm, а также файлы у которых нет расширения ( определял по отсутствию точки в их названии.

Олег, сформируйте шаблон письма в формате HTML, и вставьте в HTML-код тег img, ссылающийся на вашу картинку в интернете
(картинку можно разместить на любом сайте, - лишь бы ссылка на картинку была прямая и постоянная)
Внедрить картинку в тело письма - тоже можно, но код очень сложный (я сам этого не делал ни разу, и не планирую)

Насколько я понял из поиска по интернету в Outlook 2007-2010 данная функция не поддерживается. Отправьте письмо через веб-доступ к почтовому ящику или через другой почтовый клиент.

Сегодня предновогоднее время. Подскажите пожалуйста, каким образом в письме Microsoft Outlook отправить .gif открытку, чтобы при открытии письма клиенты не нажимали ни какие ссылки, а видели уже открывшуюся анимированную открытку?

Доброе время суток! Прошу помочь справить функцию (позволяет отправлять без использования сторонних почтовых программ (типа Outlook, который в свою очередь требует подтверждать отправку письма) по E-Mail активный / открытый в Excell Лист без запроса на подтверждение отправки.
Проблема вот в чем: не могу заставить сохранять форматирование текста согласно шаблона (листа в экселе).
Прошу исправить.
Заранее благодарен.

Sub ЕмейлЭтотЛистВТеле(ByVal Строка As Integer)
'для работы необходимо подключить библиотеку "Microsoft CDO for Windows200 Library" в редакторе макросов Tool –> References

Dim iMsg As Object
Dim iConf As Object
Dim strbody As String
Dim Flds As Variant
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
iConf.Load -1
Set Flds = iConf.Fields

Dim rng As Range
Set rng = Nothing
Set rng = ActiveSheet.UsedRange

With Flds
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "mail@mail.ru"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.mail.ru"
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
.Update

End With
With iMsg
Set .Configuration = iConf
.BodyPart.Charset = "koi8-r"
.To = Sheets("Лист1").Cells(Строка, 14) 'MailTo
'.CC = ""
'.BCC = ""
.From = "Почтальон"
.Subject = "тема письма"
.HTMLBody = RangetoHTML(rng) '.TextBody = strbody
' If Len(MailAttachment) > 0 Then .AddAttachment MailAttachment
.Send

End With
End Sub

Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2013
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook

TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With

'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With

'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")

'Close TempWB
TempWB.Close savechanges:=False

'Delete the htm file we used in this function
Kill TempFile

Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function

Добрый день. Подскажите как в тело письма вносить диаграммы и текст с листа excel?

Да, это можно реализовать.
Оформляйте заказ на сайте, прикрепляйте примеры файлов, — сделаем.

Добрый день!
Помогите пожалуйста составить макрос или через УФ. Суть такова:
Есть к примеру в ячейке "В2" Город получатель(города разные)...необходимо что бы при активации(как при гиперссылке) данного города отправлялось письмо с номером индекса, который находится в ячейке "А1", либо при вводе текста в ячейке "С1".."Запрос"...автоматически уходило письмо в город получатель("B2") с номером индекса("A1").
Это можно как-то реализовать?
Заранее спасибо!

Добрый день. Задача такая: есть файл на общем ресурсе, в который периодически вносятся изменения (график работы), нужно чтобы после внесения изменений в файл все сотрудники получали уведомление об изменениях (без вложений, с текстом изменения в теле письма, например "ячейка А1 изменена с 1 на 3"). При этом нужно чтобы письмо формировалось и уходило автоматом. Благодарю вас за вашу работу и за ваш сайт.

Большое спасибо за помощь!
В результате у меня получился макрос гораздо сложнее. С помощью рекордера я записал программу, чтобы макрос брал из исходной книги часть ячеек, копировал их в новую книгу и форматировал должным образом. А дальше я руками дописал код, чтобы файл сохранялся в нужную мне папку (если её нет - чтобы она создавалась) под нужным мне именем, а не как Book 2. А в письмо подставляется нужный адресат, нужный заголовок и подцепляется только что созданный файл.

Большую часть всего этого я сделал благодаря материалам, опубликованным на вашем сайте.
Поэтому ещё раз спасибо!

1) берете макрос, который формирует письмо по ячейкам
2) ищете в инете макрос. которых сохраняет диапазон ячеек в файл
3) вставляете второй макрос в середину первого

макрос сохранения диапазона ячеек в файл можете записать сами, макрорекордером.
всего-то 5 строк:

worksheets(2).range("a2:d10").copy  ' копируем ячейки со второго листа
with workbooks.add
  .worksheets(1).cells(1).pastespecial ' вставляем в новую книгу скопированные ячейки
  .saveas "c:\attach.xls" ' сохраняем
  .close false ' закрываем файл
end with

потом только в ваш макрос (первый) надо добавить с код формирования письма одну строку типа

.attachments.add "c:\attach.xls"

Уважаемый администратор сайта, спасибо за ответ.
Как мне кажется, мой вопрос проще и требует не надстройки, а макроса.

У меня есть экселевский файл, в котором на листе 1 в одной ячейке указан e-mail, а у другой - заголовок.
Дальше у меня есть лист 2 с какой-то информацией. И требуется нажатием одной кнопки формировать письмо, которое будет копировать часть ячеек с листа 2 в новую книгу, создавать e-mail, подставляя туда адрес и заголовок с листа 1, и в качестве вложения прикреплять новую книгу. Человеку нужно будет только дописать в письме необходимый сопроводительный текст (он каждый раз разный) и нажать кнопку "Отправить".

По поводу того, чтобы вручную сохранить диапазон и прикреплять его, - это нежелательный вариант. Заказчик хотел бы всё делать одной кнопкой.

Я нашёл макрос, который подставляет необходимые параметры письма из ячеек книги. И нашёл макрос, который копирует лист и отправляет его по заранее заданному адресу. Но проблема в том, что я не знаю, как их объединить. Я в экселе копаюсь давно и довольно глубоко, но моя область - формулы, а макросы мне практически никогда не требовались.

Здравствуйте, Леонид.
Чтобы формировать письмо по шаблону, подставляя в адресата, текст и тему содержимое ячеек, - воспользуйтесь готовым решением:
http://excelvba.ru/programmes/FillDocuments
Там много возможностей в плане рассылки

Насчет прикрепления диапазона ячеек, - так вы сохраните этот диапазон в файл (книга Excel, или в формате картинки)
И потом прикрепляйте этот файл к письмам.

Здравствуйте,
Можно ли дописать макрос так, чтобы параметры письма (адресат, тема) подставлялись из ячеек листа 1, но при этом к письму прикреплялся лист 2?
А в идеале, чтобы прикреплялся не целиком лист 2, а определенный диапазон. Допустим, A1:D10.

ОГРОМНОЕ спасибо!!! Встроил функцию в Бланк-заказ компании. Прямо чувствую себя программистом ))

Что удобнее, - вопрос точно не ко мне. Реализовать можно любой вариант.
Копироваться, — конечно автоматически (иначе зачем макрос писать...)
Если нужно готовое решение, - оформляйте заказ на сайте, сделаем.

А копироваться строка в файл будет автоматически?

Насколько это удобно? Или легче скопировать строку и выслать по мэил?

Да всё можно, - только макрос надо серьёзно переделывать
(если вместо прикрепления файла, надо в тело письма вставлять строку с данными)

Если же надо прикрепить к письму ФАЙЛ с одной строкой - то проще

Добрый день!
А можно отправлять только новую строку с листа?

Отписка делается средствами сайта
В письме, отписка, - это обычная гиперссылка вида site.ru/unsubscribe.php?code=XXXXXXXXXXXXXX
при переходе по которой скрипт unsubscribe.php на сайте site.ru добавляет в базу данных отметку, что больше не надо слать письма на этот email

В вашем же случае, при рассылке через аутлук, что бы там в письме пользователь не щелкнул, - на вашем компе в вашем файле Excel никакой отметки не появится
(не, конечно, всё можно сделать, если есть свой сайт, - но это сложно)

Насчет узнать, доставлено письмо, прочитано или нет, отмечено ли как спам, - нереально.
(сами подумайте, откуда эти данные у вас могут появиться... если все происходит на компе получателя письма, и обратной связи никакой нет, кроме как если пользователь вам напишет ответное письмо)

Большое спасибо, даже не мечтал, что вы так быстро ответите.
Хотел сказать большое спасибо вашему сайту, много чему учусь и много взял на вооружение.

В моем понимание, что такое отписка.
В конце письма, есть кнопочка ОТПИСКА
человек нажимает на нее, и я получаю его email. И больше ему не напишу (альтернатива когда человек выбирает СПАМ).
На многие emai сервисах, это есть автоматически.

И еще вопрос есть ли реализации, в получении следующих данных (емейлов) о рассылке через макрос, который использует outlook: 1) Доставлено 2) Прочитано 3) Помечено как спам 4) Отписалось

Здравствуйте, Максим.
Чтобы письмо формировалось в формате HTML, надо вместо

.Body = MailText$

написать
.HTMLBody = MailText$: .BodyFormat = 2        ' olFormatHTML = 2

по второму вопросу, - я не знаю, что такое «отписка» в вашем понимании

Добрый день, понравилась реализация через Outlook
сделал три колонки email, Текст письма, Тема письма.
Первый вопрос: шаблон письма в HTML, и получаю по почте текст письма в таком же HTML, как сделать, чтобы текст письма, преобразовался.
И второй вопрос, как сделать отписку!

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____        __   __   __                 __  __ 
|___ / ___ \ \ / / / /_ _ __ ___ | \/ |
|_ \ / __| \ V / | '_ \ | '_ ` _ \ | |\/| |
___) | \__ \ | | | (_) | | | | | | | | | | |
|____/ |___/ |_| \___/ |_| |_| |_| |_| |_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.