Outlook Mail mesaj formatı hk.

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,
Ekli dosyada Outlokta mail gönderirken;
Mail gövdesine yazılacak metinin sayfa hücresinden almak istediğimizde;
Hücrede yazdığı formatıyla (Renk, Bold, İtalic vb.) birebir mail gövdesine nasıl yazdırabiliriz?

özetle metin hücrede nasıl görünüyorsa mail gövdesinde de o şekilde görünsün
Teşekkürler,

iyi geceler.

Kod:
Sub SendEmail()
Dim Outlook As Outlook.Application
Set Outlook = New Outlook.Application
Dim mail As Outlook.MailItem
Set mail = Outlook.CreateItem(olMailItem)

With mail
    .To = "abc123@gmail.com"
    .CC = "abc456@gmail.com"
    .Subject = "Test Mesajı"
    .BodyFormat = olFormatHTML
    
    .Body = Sayfa2.Range("A1").Value
    .Display
 ''   .Send

End With

'' MsgBox "Mail gönderildi", vbInformation, "Bilgi"

End Sub
 

Ekli dosyalar

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Korhan Hocam öncelikle teşekkürler,
ilk linkte yer alan fonksiyonu uygulamaya çalıştığımda;

.HTMLBody = RangetoHTML(rng)


herhangi bir değişiklik olmadı, aynı şekilde düz metin olarak geliyor,
ekli dosyada kontrol edebilir misiniz,

iyi Çalışmalar.

Kod:
Function RangetoHTML(rng As Range)

    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
 

Ekli dosyalar

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Deneyiniz.

C++:
Sub SendEmail()
    Dim Outlook As Outlook.Application
    Dim Mail As Outlook.MailItem
    Dim Signature As Variant, Rng As Range
    
    Set Outlook = New Outlook.Application
    Set Mail = Outlook.CreateItem(olMailItem)
    Set Rng = Sayfa2.Range("A1")
    
    Rng.Copy
    
    With Mail
        .Display
         Signature = .HTMLBody
        .To = "abc123@gmail.com"
        .CC = "abc456@gmail.com"
        .Subject = "Test Mesajı"
        .BodyFormat = olFormatHTML
         DoEvents
         DoEvents
         Application.SendKeys "^v", True
    End With
    
    MsgBox "Mail gönderildi", vbInformation, "Bilgi"
End Sub
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Deneyiniz.

C++:
Sub SendEmail()
    Dim Outlook As Outlook.Application
    Dim Mail As Outlook.MailItem
    Dim Signature As Variant, Rng As Range
   
    Set Outlook = New Outlook.Application
    Set Mail = Outlook.CreateItem(olMailItem)
    Set Rng = Sayfa2.Range("A1")
   
    Rng.Copy
   
    With Mail
        .Display
         Signature = .HTMLBody
        .To = "abc123@gmail.com"
        .CC = "abc456@gmail.com"
        .Subject = "Test Mesajı"
        .BodyFormat = olFormatHTML
         DoEvents
         DoEvents
         Application.SendKeys "^v", True
        .HTMLBody = .HTMLBody & Signature
    End With
   
    MsgBox "Mail gönderildi", vbInformation, "Bilgi"
End Sub
Sağolun, varolun Korhan Hocam
iyi ki varsınız, çok teşekkürler!
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Sağolun, varolun Korhan Hocam
iyi ki varsınız, çok teşekkürler!
Deneyiniz.

C++:
Sub SendEmail()
    Dim Outlook As Outlook.Application
    Dim Mail As Outlook.MailItem
    Dim Signature As Variant, Rng As Range
   
    Set Outlook = New Outlook.Application
    Set Mail = Outlook.CreateItem(olMailItem)
    Set Rng = Sayfa2.Range("A1")
   
    Rng.Copy
   
    With Mail
        .Display
         Signature = .HTMLBody
        .To = "abc123@gmail.com"
        .CC = "abc456@gmail.com"
        .Subject = "Test Mesajı"
        .BodyFormat = olFormatHTML
         DoEvents
         DoEvents
         Application.SendKeys "^v", True
        .HTMLBody = .HTMLBody & Signature
    End With
   
    MsgBox "Mail gönderildi", vbInformation, "Bilgi"
End Sub
Korhan Hocam yeni bir şey farkettim,
eğer mailde önceden imza tanımlı ise, mail gövdesine imzayı iki defa yazdırmış oluyor.

.HTMLBody = .HTMLBody & Signature

satırında "Signature" ifadesini kaldırdım ama o zaman da, hücredeki metini almadı

Buna nasıl bir çözüm üretebiliriz?

teşekkürler,
iyi çalışmalar.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bende de imza tanımlı ve denediğimde çift iinza durumunu yaşamadım.

Aşağıdaki satırı pasif yaparak deneyiniz.

Signature = .HTMLBody
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Bende de imza tanımlı ve denediğimde çift iinza durumunu yaşamadım.

Aşağıdaki satırı pasif yaparak deneyiniz.

Signature = .HTMLBody
Korhan Hocam
Signature = .HTMLBody
bu satırı pasif yapınca bu seferde imza hiç çıkmıyor,

işlemin sonunda imza ekleyi bir şekilde yaptırabilir miyiz?

teşekkürler,
iyi akşamlar.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
İlk paylaştığım haliyle bende sorunsuz çalışıyor. Sizdeki durumu bilemiyorum..
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Kodu revize ettim. Tekrar denermisiniz.
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Kodu revize ettim. Tekrar denermisiniz.
teşekkürler Korhan Hocam,

1) gördüğüm kadarıyla revize kodda aşağıdaki satır kakmış
Kod:
.HTMLBody = .HTMLBody & Signature
2) Bu arada bazı durumlarda Body gelmiyordu, DoEvents' satırdan önce aşağıdaki bekleme kodunu ekledim,
Kod:
Application.Wait(Now + TimeValue("0:00:01"))
3) Birde metin mail gövdesine yapıştırılınca; kopyalanan excel hücresinde seçim iptal olsun diye, yalnız bu seferde gövdeye metin hiç gelmedi.
Kod:
  Application.CutCopyMode = False
iyi Çalışmalar.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Benim kullandığım imza biraz büyük olduğu için tekrar etme durumunu fark edememiştim. Onu dediğiniz satırı silerek düzelttim.

Normalde Body kısmında biçimlendirme kullanmak istiyorsanız bunun için kopyala-yapıştır yöntemi çok uygun değildir. Body kısmı için metin biçimlendirme teknikleri vardır. bunlar daha iyi sonuçlar veriyor. Bu sebeple sizi arşiv konularını incelemenizi önermiştim.

3. maddede bahsettiğiniz sorunu bende yaşadım. Ama mantıklı bir çözüm bulamadım.

Dilerseniz alternatif olarak aşağıdaki kodu deneyebilirsiniz.

C++:
Option Explicit

Sub SendEmail()
    Dim XL_Outlook As Outlook.Application
    Dim XL_Email As Outlook.MailItem
    Dim XL_Inspector As Outlook.Inspector
    Dim Word_Document As Word.Document
    Dim Mesaj As String

    Mesaj = "Sayın Yönetici," & vbNewLine

    Set XL_Outlook = New Outlook.Application
    Set XL_Email = XL_Outlook.CreateItem(olMailItem)

    With XL_Email
        .BodyFormat = olFormatHTML
        .Display
        .To = "deneme@deneme.com"
        .Subject = "Günlük Satış Analizi"

        Set XL_Inspector = .GetInspector
        Set Word_Document = XL_Inspector.WordEditor

        Word_Document.Range.InsertBefore Mesaj
        Word_Document.Range.InsertAfter vbCrLf
        Sayfa2.Range("A1").Copy
        Word_Document.Range(Len(Mesaj), Len(Mesaj)).Paste
    End With

    Set XL_Inspector = Nothing
    Set Word_Document = Nothing
    Set XL_Outlook = Nothing
    Set XL_Email = Nothing
End Sub
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Benim kullandığım imza biraz büyük olduğu için tekrar etme durumunu fark edememiştim. Onu dediğiniz satırı silerek düzelttim.

Normalde Body kısmında biçimlendirme kullanmak istiyorsanız bunun için kopyala-yapıştır yöntemi çok uygun değildir. Body kısmı için metin biçimlendirme teknikleri vardır. bunlar daha iyi sonuçlar veriyor. Bu sebeple sizi arşiv konularını incelemenizi önermiştim.

3. maddede bahsettiğiniz sorunu bende yaşadım. Ama mantıklı bir çözüm bulamadım.

Dilerseniz alternatif olarak aşağıdaki kodu deneyebilirsiniz.

C++:
Option Explicit

Sub SendEmail()
    Dim XL_Outlook As Outlook.Application
    Dim XL_Email As Outlook.MailItem
    Dim XL_Inspector As Outlook.Inspector
    Dim Word_Document As Word.Document
    Dim Mesaj As String

    Mesaj = "Sayın Yönetici," & vbNewLine

    Set XL_Outlook = New Outlook.Application
    Set XL_Email = XL_Outlook.CreateItem(olMailItem)

    With XL_Email
        .BodyFormat = olFormatHTML
        .Display
        .To = "deneme@deneme.com"
        .Subject = "Günlük Satış Analizi"

        Set XL_Inspector = .GetInspector
        Set Word_Document = XL_Inspector.WordEditor

        Word_Document.Range.InsertBefore Mesaj
        Word_Document.Range.InsertAfter vbCrLf
        Sayfa2.Range("A1").Copy
        Word_Document.Range(Len(Mesaj), Len(Mesaj)).Paste
    End With

    Set XL_Inspector = Nothing
    Set Word_Document = Nothing
    Set XL_Outlook = Nothing
    Set XL_Email = Nothing
End Sub
Korhan Hocam çok teşekkürler,
bu yöntem daha profesyonel oldu sanki
Sağ olun, var olun..
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Benim kullandığım imza biraz büyük olduğu için tekrar etme durumunu fark edememiştim. Onu dediğiniz satırı silerek düzelttim.

Normalde Body kısmında biçimlendirme kullanmak istiyorsanız bunun için kopyala-yapıştır yöntemi çok uygun değildir. Body kısmı için metin biçimlendirme teknikleri vardır. bunlar daha iyi sonuçlar veriyor. Bu sebeple sizi arşiv konularını incelemenizi önermiştim.

3. maddede bahsettiğiniz sorunu bende yaşadım. Ama mantıklı bir çözüm bulamadım.

Dilerseniz alternatif olarak aşağıdaki kodu deneyebilirsiniz.

C++:
Option Explicit

Sub SendEmail()
    Dim XL_Outlook As Outlook.Application
    Dim XL_Email As Outlook.MailItem
    Dim XL_Inspector As Outlook.Inspector
    Dim Word_Document As Word.Document
    Dim Mesaj As String

    Mesaj = "Sayın Yönetici," & vbNewLine

    Set XL_Outlook = New Outlook.Application
    Set XL_Email = XL_Outlook.CreateItem(olMailItem)

    With XL_Email
        .BodyFormat = olFormatHTML
        .Display
        .To = "deneme@deneme.com"
        .Subject = "Günlük Satış Analizi"

        Set XL_Inspector = .GetInspector
        Set Word_Document = XL_Inspector.WordEditor

        Word_Document.Range.InsertBefore Mesaj
        Word_Document.Range.InsertAfter vbCrLf
        Sayfa2.Range("A1").Copy
        Word_Document.Range(Len(Mesaj), Len(Mesaj)).Paste
    End With

    Set XL_Inspector = Nothing
    Set Word_Document = Nothing
    Set XL_Outlook = Nothing
    Set XL_Email = Nothing
End Sub
Korhan Hocam merhaba,

Bu kod ile mail gövdesine gelen mesaj metni tablo olarak getirmekte;
Bunun word metni olarak satırlar halinde gelmesini sağlanamaz mı?
Özetle satırlar birbirinden bağımsız olarak düzenlenez mi?

Teşekkürler,
iyi Akşamlar.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bu durumda body kısmında metni kendiniz biçimlendirerek oluşturmalısınız.

 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,039
Excel Vers. ve Dili
Office 2013 İngilizce
Bu durumda body kısmında metni kendiniz biçimlendirerek oluşturmalısınız.

Korhan Hocam teşekkürler, vermiş olduğunuz linkleri inceledim,
Müsaadelerinizle bir şey soracağım;
Excel hücresinde biçimli olarak yazılmış yazı metninin;

xStrBody = "MERHABA" & "<br>" & Chr(10) & _
"<a href=" & "a href=" & "https://www.excel.web.tr/"">TIKLAYINIZ</a> " & "<br>" & Chr(10) & _
"TEŞEKKÜRLER"

bu şeklide HTML formatına çevirecek bir kullanıcı tanımlı fonksiyon biliyor musunuz,

Hücreden metinleri okuyacak her bir kelimenin formatını algılayarak ona göre HTMLyazım şekline dönüştürecek,

teşekkürler,

iyi Çalışmalar.

Kod:
Sub mail()
'updated by Extendoffice 20190815
Dim xOtl As Object
Dim xOtlMail As Object
Dim xStrBody As String
    xStrBody = "MERHABA" & "<br>" & Chr(10) & _
               "<a href=" & "a href=" & "https://www.excel.web.tr/"">TIKLAYINIZ</a> " & "<br>" & Chr(10) & _
               "TEŞEKKÜRLER"
    On Error Resume Next
    Set xOtl = CreateObject("Outlook.Application")
    Set xOtlMail = xOtl.CreateItem(olMailItem)
    With xOtlMail
        .To = "muratgunay48@gmail.com"
        .CC = "muratgunay48@gmail.com" & " ; " & "muratgunay48@gmail.com"
        '.BCC = " Email Address "
        .Subject = Format(Now, "dd.mm.yyyy hh.mm.ss")
        .HTMLBody = .HTMLBody & xStrBody
        .Display
    End With
    Set xOtl = Nothing
    Set xOtlMail = Nothing
End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,160
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Yıllardır forumda makrolarla haşır-neşirsiniz. Bence bu tarz bir fonksiyonu siz de biraz uğraşarak tasarlayabilirsiniz. ;)
 
Üst