2

私のプログラムに、Indy 9を使用してSMTP経由でHTMLメールを送信する機能を追加しようとしています。プログラムにテキストのみが含まれている場合(テキストはヘブライ語になるため、右から左に表示する必要があります。つまり、 HTMLステートメントを使用して)、電子メールは正しく送信されます。私の問題は、HTMLストリームに画像を埋め込むことにあります。

HTMLストリームは次のようなコマンドを使用します

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

Indy 10コンポーネントTIdAttachmentFileにはComponentIDプロパティがあり、その値は'cid'が参照する値に設定する必要がありますが、Indy9でComponentIDプロパティを設定する場所が見つかりません。

現時点では、画像(名前はlaPicture.textにあります)の追加を処理するコードは次のようになります。

  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;

ContentIDはどこで定義しますか?

そして、これはばかげた質問ですが、どのバージョンのIndyを持っているかをどうやって知ることができますか?

4

3 に答える 3

5

TIdAttachmentTIdMessagePartは、パブリックContentIDプロパティを持つから派生します。インストールされているバージョンのIndy9にそのプロパティがない場合は、古いバージョンを使用しているため、代わりにプロパティを使用してヘッダーを手動でExtraHeaders追加してください。Content-ID

HTMLメールの操作の詳細については、IndyのWebサイトにある次のブログ記事を参照してください。

HTMLメッセージ

更新:したがって、HTMLに示されている場合cid:foo4atfoo1atbar.netは、コードでこれを実行して一致させる必要があります。

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;

Indy 9では、角かっこを手動で指定する必要があることに注意してください。Indy 10は、省略されている場合、それらを挿入します。例:

ContentID := 'foo4atfoo1atbar.net';
于 2013-01-11T16:37:28.877 に答える
0

解決策を見つけまし-Content-IDフィールドではなくIndy10は必要ありませんでした。

私の質問で示したコードは問題ありませんでした。問題はおそらく画像を表示するHTMLコードにありました。「cid」変数はContent-IDの値を「指す」必要があると思いました。次のように、ファイルの名前(TIDAttachment.filename)に設定できることがわかります。

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

上記の行は、適切な場所でhtmlストリームに挿入されます。

于 2013-01-11T19:05:17.057 に答える
0

これは私のために働きます:

function SendEmail(SMTP: TIdSMTP; CONST AdrTo, AdrFrom, Subject, Body, HtmlImage, DownloadableAttachment: string; SendAsHtml: Boolean= FALSE): Boolean;
VAR MailMessage: TIdMessage;
begin
 Result:= FALSE;
 Assert(SMTP <> NIL, 'SMTP in NIL!');

 MailMessage:= TIdMessage.Create(NIL);
 TRY
  MailMessage.ConvertPreamble:= TRUE;
  MailMessage.Encoding       := meDefault;
  MailMessage.Subject        := Subject;
  MailMessage.From.Address   := AdrFrom;
  MailMessage.Priority       := mpNormal;
  MailMessage.Recipients.EMailAddresses := AdrTo;

  {How to send multi-part/attachment emails with Indy:
  www.indyproject.org/2005/08/17/html-messages
  www.indyproject.org/2008/01/16/new-html-message-builder-class }
  WITH IdMessageBuilder.TIdMessageBuilderHtml.Create DO
  TRY
    if SendAsHtml
    then Html.Text := Body
    else PlainText.Text := Body;

    { This will be visible ONLY if the email contains HTML! }
    if SendAsHtml AND FileExists(HtmlImage)
    then HtmlFiles.Add(HtmlImage);

    if FileExists(DownloadableAttachment)
    then Attachments.Add(DownloadableAttachment);
    FillMessage(MailMessage);
  FINALLY
    Free;
  END;

  { Connect }
  TRY
    if NOT SMTP.Connected
    then SMTP.Connect;
  EXCEPT
    on E: Exception DO
     begin
      AppLog.AddError('Cannot connect to the email server.');
      AppLog.AddError(E.Message);
     end;
  END;

  { Send mail }
  if SMTP.Connected then
   TRY
     SMTP.Send(MailMessage);
     Result:= TRUE;
   EXCEPT
     on E:Exception DO
      begin
       AppLog.AddError('Connected to server but could not send email!');
       AppLog.AddError(E.Message);
      end;
   END;

  if SMTP.Connected
  then SMTP.Disconnect;

 FINALLY
  FreeAndNil(MailMessage);
 END;
end;

注:AppLogを個人用ロギングシステムまたはShowMessageに置き換えてください。

もちろん、libeay32.dll+ssleay32.dllが必要です。私はそれらへのリンクを投稿したでしょうが、もうそれらを見つけることができませんでした。

于 2021-03-27T09:18:22.877 に答える