Page 1 of 2

Sending email with image in the body

Posted: Mon Feb 27, 2023 2:53 pm
by rdonnay
I'm trying to figure out how to use SmtpMail to build a body of text that embeds an image which will be viewed by Outlook.

I know that Outlook rejects Base64 images, so I will need to have a link to an image on my server.

However, I don't know how to build the body of text to make this happen.

HTML doesn't seem to work.

Re: Sending email with image in the body

Posted: Mon Feb 27, 2023 4:37 pm
by rdonnay
It looks like I may have found something in Xbase++ sample program: c:\users\roger\documents\xbase++\source\samples\asinet\htmlmail\mailmain.prg

Re: Sending email with image in the body

Posted: Tue Feb 28, 2023 3:56 am
by skiman
Hi Roger,

I don't know if this can help. I'm using Chilkat and there I have the following to embed images.

oEmail:AddRelatedFile2(cImage, cImageID)

cImage is the source of the image. This is a local path as c:\chris\image.jpg.
cImageId is a name/ID for the image as image001.
In the message i have a strtran(cMessage,cImage,cImageID)

With the addRelatedFile2 a mail client shows the image in the mail text imbedded.

Re: Sending email with image in the body

Posted: Tue Feb 28, 2023 5:54 am
by rdonnay
Thanks Chris, but it looks like Alaska's htmlmail sample has a lot to work with, however it is way to complex for such a simple problem.

I'm going to rewrite it to simplify it.

Re: Sending email with image in the body

Posted: Tue Feb 28, 2023 10:28 am
by rdonnay
Alaska's sample program is way too complicated for such a simple task.

I made a small modification to the SENDMAIL.PRG to change the content-type to "text/html"

http://bb.donnay-software.com/donnay/sendmail.prg

I put the below HTML into the body of the email and it worked perfectly:

Code: Select all

<html>
<body>
<h1>
Testing HTML embedded images
</h1>
<h3>Click on image below to register to drive for TaxiFleet NYC</h3>
<a href="https://drivebigapple.taxi/apply-to-drive/">
<img src="http://70.23.98.154:8082/taxifleetlogo.jpg">
</a>
</body>
</html>

Re: Sending email with image in the body

Posted: Tue Feb 28, 2023 10:47 am
by skiman
Hi Roger,

The difference is that when the image is an external URL the image won't be shown, unless the user clicks to load the image. With the Chilkat method, the image is embedded in the mail, and is always shown.
I looked at the Xbase++ documentation and I don't know if there is any method available to embed the images.

Otherwise, with an external image you can track how many times it is downloaded. This isn't possible with the embedded image.

So both systems have their pro's and con's.

We use the external image to send a pixel in our mails with invoices. If they open the mail and they allow the images, we can see who has opened the mail. The 'src' of the image is a rest-endpoint which returns the image, but has the data we need in the request as ....:8082/getimage?CusItD=123&invoiceid=987. This way we know that customer 123 has opened the mail for the invoice 987. Then we return the image.

Re: Sending email with image in the body

Posted: Tue Feb 28, 2023 12:53 pm
by rdonnay
the image is an external URL the image won't be shown, unless the user clicks to load the image
With the HTML body I used, the image is shown without a need to click.

Re: Sending email with image in the body

Posted: Wed Mar 01, 2023 12:05 am
by SlavkoDam
Roger,

In SmtpMail message, an embedded image in a HTML file is attached with MimeContent():attachedRelated(oMimeContent,cID) method. Here is an Alaska example how to do that.

Code: Select all

PROCEDURE main( cEmailAdr, cMailServer, cUsername, cPassword )
       LOCAL oMe, oMail, oServer, oBitmapCont
       LOCAL cID

       cID := MimeContent():new():uniqueString
       oMe := MAILAddress():new( cEmailAdr )

       oMail := MIMEMessage():encodeQuotedPrintable( getHtml(cEmailAdr, cID), "text/html" )
       oMail:setFrom( oMe )
       oMail:addRecipient( oMe )
       oMail:setSubject( "Asinet Html mail docu sample" )

       oBitmapCont := getBitmapCont()

       IF ! Empty( oBitmapCont )
          oMail:attachRelated( oBitmapCont, cID )
       ENDIF

       oServer := SMTPClient():new( cMailServer )
       IF ! oServer:connect( cUsername, cPassword )
          ? "Unable to connect to mail server"
          WAIT
          QUIT
       ENDIF

       oServer:send( oMail )
       oServer:disconnect()
       ? "Message sent!"
       ? "Check account", cEmailAdr, "for new mail"
       wait
   RETURN

   FUNCTION getBitmapCont()
      LOCAL cXppResource, oContent, nPos

      cXppResource := Lower( GetEnv( "XppResource" ) )
      IF 0 == ( nPos := At( "resource", cXppResource ) )
         ? "XppResource Environment variable not set:"
         ? "  Background image can not be loaded"
         RETURN NIL
      ENDIF
      cXppResource := SubStr( cXppResource, 1, nPos + 7 )
      cXppResource += "\bitmap\keybd1.bmp"

      oContent := MimeContent():createFromFile( cXppResource )
   RETURN oContent

   FUNCTION getHtml( cMail, cID )
      LOCAL cStr := ""
      
      cStr += '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'
      cStr += '<html>'
      cStr += '  <head></head>'
      cStr += '  <body background="cid:' + cID + '"'
      cStr += '    <h1>'
      cStr += '       Hallo from <br>'+cMail+'!'
      cStr += '    <h1>'
      cStr += '  </body>'
      cStr += '</html>'
   RETURN cStr

Re: Sending email with image in the body

Posted: Wed Mar 01, 2023 7:01 am
by rdonnay
Here is an Alaska example how to do that.
I have looked at the Alaska HTMLMAIL sample and I see no reason to do anything other than the simple example I posted which is working perfectly for me.

Re: Sending email with image in the body

Posted: Wed Mar 01, 2023 11:47 pm
by SlavkoDam
I'm trying to figure out how to use SmtpMail to build a body of text that embeds an image which will be viewed by Outlook.
This is your initial goal that you wanted to achieve. You code is simpler but the image is not embedded and its not the solution for what you wanted in the above. I gave you the solution for the above task (your code don't do that), but its up to you what are you really looking for. The image sent by your example will be seen by the recipient while its present on the specified address. When you remove it from your server the recipient will not see it any more, since the image is not embedded in the mail body. With my solution the image will be present in the mail body for good, but its up to your what you really want. If you didn't want the embedded image, you shouldn't ask the solution for that.

Anyway, its good for you to learn and know how to embed an image in the mail body with SmtpClient(). There are also useful methods MIMEContent():attachAltermative() and MIMEContent():attachMixed(). You should study them by yourself, there are Alaska examples how to use them.