使用Indy发送附带附件的电子邮件

时间:2017-07-25 05:47:05

标签: email indy10

首先,代码。

procedure TMain.SendEmailIndy(
    const SMTPServer: string;
    const FromName, FromAddress: string;
    const ToAddresses: string; //comma "," separated list of e-mail addresses
    const CCAddresses: string; //comma "," separated list of e-mail addresses
    const BCCAddresses: string; //comma "," separated list of e-mail addresses
    const Subject: string;
    const EmailBody: string;
    const IsBodyHtml: Boolean);
    var
        smtp: TIdSMTP; // IdSmtp.pas
        msg: TidMessage; // IdMessage.pas
        builder: TIdCustomMessageBuilder; //IdMessageBuilder.pas
        s: string;
        emailAddress: string;
        FileToSend: TIdAttachmentfile;
begin
    msg := TidMessage.Create(nil);

    try
        if IsBodyHtml then begin
            builder := TIdMessageBuilderHtml.Create;
            TIdMessageBuilderHtml(builder).Html.Text := EmailBody
        end else begin
            builder := TIdMessageBuilderPlain.Create;
        end;

        if (Realization.AttachmentD.FileName <> '') then begin
            msg.IsEncoded := true;
            FileToSend := TIdAttachmentFile.Create(msg.MessageParts, Realization.AttachmentD.FileName);
            FileToSend.FileName := Realization.AttachmentD.FileName;
            //FileToSend.ContentDisposition := 'attachment';
            FileToSend.ContentType := 'multipart/mixed';
            ShowMessage('Sent: '+Realization.AttachmentD.FileName);
        end;

        msg.From.Name := FromName;
        msg.From.Address := FromAddress;
        msg.Subject := Subject;

        //If the message is plaintext then we must fill the body outside of the PlainText email builder.
        //(the PlainTextBuilder is unable to build plaintext e-mail)
        if not IsBodyHtml then begin
            msg.Body.Text := EmailBody;
        end;

        for s in ToAddresses.Split([',']) do
        begin
            emailAddress := Trim(s);
            if emailAddress <> '' then begin
                    with msg.recipients.Add do
                    begin
                    //Name := '<Name of recipient>';
                    Address := emailAddress;
                    end;
            end;
        end;

        for s in CCAddresses.Split([',']) do
        begin
            emailAddress := Trim(s);
                if emailAddress <> '' then
                    msg.CCList.Add.Address := emailAddress;
        end;

        for s in BCCAddresses.Split([',']) do
        begin
            emailAddress := Trim(s);
                if emailAddress <> '' then
                    msg.BccList.Add.Address := emailAddress;
        end;

    smtp := TIdSMTP.Create(nil);
    try
        msg.Encoding := meMIME;
        msg.ContentType := 'text/html';
        msg.CharSet := 'UTF-8';
        msg.ContentTransferEncoding:= 'quoted-printable';

        smtp.Host := SMTPServer; // IP Address of SMTP server
        Smtp.UseTLS := utNoTLSSupport;
        smtp.Port := 587; //The default already is port 25 (the SMTP port)
        smtp.Username := _GlobalData.EMail;
        smtp.Password := _GlobalData.Password;
        smtp.Connect;

        try
            smtp.Send(msg);
            ShowMessage('Wiadomość wysłana.');
            Realization.AttachmentD.FileName := '';
        finally
          smtp.Disconnect();
        end;
    finally
        smtp.Free;
    end;
finally
    msg.Free;
    end;
end;

我发送带有附件的电子邮件时遇到问题。

当我从上面的代码中删除以下行时,将发送的消息没有应该存在的html消息(电子邮件正文):

FileToSend.ContentType := 'multipart/mixed';

但是,当我在代码中留下这一行并尝试发送消息时,我收到此消息:

A policy-violation was found in an Email message you sent. 
This Email scanner intercepted it and stopped the entire message
reaching its destination. 

The policy-violation was reported to be: 

Disallowed breakage found in header name - not valid email


Please contact your IT support personnel with any queries regarding this 
policy.

因此我的问题是,如何正确发送带有附件的电子邮件。

1 个答案:

答案 0 :(得分:1)

您滥用TIdMessageBuilder...类(TIdMessageBuilderHtml完全能够创建纯文本电子邮件,但更重要的是,您没有调用TIdCustomMessageBuilder.FillMessage()将构建器数据传输到TIdMessage 1}})。

您没有正确填充TIdMessage(例如,当附件存在时,您没有正确设置TIdMessage.ContentTypeTIdAttachmentFile.ContentType属性。)

尝试更像这样的东西:

procedure TMain.SendEmailIndy(
    const SMTPServer: string;
    const FromName, FromAddress: string;
    const ToAddresses: string; //comma separated list of e-mail addresses
    const CCAddresses: string; //comma separated list of e-mail addresses
    const BCCAddresses: string; //comma separated list of e-mail addresses
    const Subject: string;
    const EmailBody: string;
    const IsBodyHtml: Boolean);
var
  smtp: TIdSMTP; // IdSmtp.pas
  msg: TidMessage; // IdMessage.pas
  builder: TIdMessageBuilderHtml; //IdMessageBuilder.pas
begin
  msg := TidMessage.Create(nil);
  try
    builder := TIdMessageBuilderHtml.Create;
    try
      if IsBodyHtml then
      begin
        builder.Html.Text := EmailBody;
        builder.HtmlCharSet := 'utf-8';
        builder.HtmlContentTransfer := 'quoted-printable';
      end else
      begin
        builder.PlainText.Text := EmailBody;
        builder.PlainTextCharSet := 'utf-8';
        builder.PlainTextContentTransfer := 'quoted-printable';
      end;

      if Realization.AttachmentD.FileName <> '' then
      begin
        builder.Attachments.Add(Realization.AttachmentD.FileName);
        ShowMessage('Sending: ' + Realization.AttachmentD.FileName);
      end;

      builder.FillMessage(msg);
    finally
      builder.Free;
    end;

    msg.From.Name := FromName;
    msg.From.Address := FromAddress;
    msg.Subject := Subject;

    msg.Recipients.EmailAddresses := ToAddresses;
    msg.CCList.EmailAddresses := CCAddresses;
    msg.BccList.EmailAddresses := BCCAddresses;

    smtp := TIdSMTP.Create(nil);
    try
      smtp.Host := SMTPServer; // IP Address of SMTP server
      Smtp.UseTLS := utNoTLSSupport;
      smtp.Port := 587; //The default already is port 25 (the SMTP port)
      smtp.Username := _GlobalData.EMail;
      smtp.Password := _GlobalData.Password;
      smtp.AuthType := satDefault;

      smtp.Connect;    
      try
        smtp.Send(msg);
      finally
        smtp.Disconnect;
      end;
    finally
      smtp.Free;
    end;
  finally
    msg.Free;
  end;

  ShowMessage('Wiadomość wysłana.');
  Realization.AttachmentD.FileName := '';
end;