Sending email with Indy 9 with an embedded picture

蹲街弑〆低调 提交于 2019-12-11 02:35:57

问题


I am trying to add to a program of mine the capability of sending html email via SMTP with Indy 9. If the program only contains text (the text will be in Hebrew so I need to display it right to left, which means that I am using HTML statements), then the email is sent correctly. My problem lays with embedding pictures into the HTML stream.

The HTML stream will use a command like

<IMG SRC="cid:foo4atfoo1atbar.net" ALT="IETF logo">

Whilst the Indy 10 component TIdAttachmentFile has a ComponentID property whose value has to be set to the value that 'cid' references, I can't find where to set the ComponentID property in Indy 9.

At the moment, the code which deals with adding the picture (whose name is in laPicture.text) looks like this

  if laPicture.text <> '' then
  with TIdAttachment.Create (email.MessageParts, laPicture.text) do
   begin
    ContentDisposition:= 'inline';
    ContentType:= 'image/jpeg';
    DisplayName:= ExtractFileName (laPicture.text);
    filename:= ExtractFileName (laPicture.text);
   end;

Where do I define the ContentID?

And, although this is a stupid question, how do I know which version of Indy I have?


回答1:


TIdAttachment derives from TIdMessagePart, which has a public ContentID property. If your installed version of Indy 9 does not have that property, then you are using an outdated version, so use the ExtraHeaders property instead to add a Content-ID header manually.

Have a look at the following blog article on Indy's website for more information about working with HTML emails:

HTML Messages

Update: so, if the HTML says cid:foo4atfoo1atbar.net then you need to do this in your code to match it:

with TIdAttachment.Create (email.MessageParts, laPicture.text) do
begin
  ...
  ContentID := '<foo4atfoo1atbar.net>';
  // or this, if you do not have the ContentID property available:
  // ExtraHeaders.Values['Content-ID'] := '<foo4atfoo1atbar.net>';
end;

Note that in Indy 9, you have to provide the brackets manually. Indy 10 inserts them for you if they are omitted, eg:

ContentID := 'foo4atfoo1atbar.net';



回答2:


I found a solution - I didn't need Indy10 not the Content-ID field.

The code which I showed in my question was fine, the problem was probably in the HTML code which displayed the picture. I thought that the "cid" variable had to 'point' to the value of Content-ID; it transpires that it can be set to the name of the file (TIDAttachment.filename), as follows

<img src="cid:' + ExtractFileName (laPicture.text) + '"><br>

The above line gets inserted into the html stream at the appropriate place.



来源:https://stackoverflow.com/questions/14279211/sending-email-with-indy-9-with-an-embedded-picture

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!