Как отправить письмо с html-контентом с помощью IdSMTP (Delphi)? - PullRequest
5 голосов
/ 02 ноября 2009

Как я могу отправить электронное письмо с помощью IdSMTP-компонента Delphi с html-contetent?

Ответы [ 2 ]

7 голосов
/ 02 декабря 2014

Поскольку недавно использовался компонент Indy IdSmtp, было обидно, что нет хорошего ответа на этот вопрос. Я переписал нашу вспомогательную функцию для отправки электронной почты с использованием Indy (как HTML, так и открытого текста)

Пример использования

SendHtmlEmailIndy(
        'smtp.stackoverflow.com',                  //the SMTP server address
        'Spammy McSpamerson', 'spams@example.com', //From name, from e-mail address
        'joe@foo.net, jane@bar.net',               //To addresses - comma separated
        'john@doe.net',                            //CC addresses - comma separated
        '',                                        //BCC addresses - comma separated
        'Here is your sample spam e-mail',         //Subject
        '<!DOCTYPE html><html><body>Hello, world!</body></html>', //html body
        True,                                      //the body is HTML (as opposed to plaintext)
        nil); //attachments

Хитрость в том, что Indy затрудняет отправку электронной почты в формате HTML. В конце концов они предоставили класс TIdMessageBuilderHtml, чтобы справиться с большей частью тяжелой работы; но это далеко не так приятно, как класс SmtpClient. В конце вы получите зависимость от трех единиц.

Код

procedure 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; //verses Plain Text
        const Attachments: TStrings);
var
    smtp: TIdSMTP; // IdSmtp.pas
    msg: TidMessage; // IdMessage.pas
    builder: TIdCustomMessageBuilder; //IdMessageBuilder.pas
    s: string;
    emailAddress: string;
begin
{
    Sample usage:

    SendEmailIndy(
            'smtp.stackoverflow.com',                  //the SMTP server address
            'Spammy McSpamerson', 'spams@example.com', //From name, from e-mail address
            'joe@foo.net, jane@bar.net',               //To addresses - comma separated
            'john@doe.net',                            //CC addresses - comma separated
            '',                                        //BCC addresses - comma separated
            'Here is your sample spam e-mail',         //Subject
            '<!DOCTYPE html><html><body>Hello, world!</body></html>', //html body
            True,                                      //the body is HTML (as opposed to plaintext)
            nil); //attachments
}
    msg := TidMessage.Create(nil);
    try
        if IsBodyHtml then
        begin
            builder := TIdMessageBuilderHtml.Create;
            TIdMessageBuilderHtml(builder).Html.Text := EmailBody
        end
        else
        begin
            builder := TIdMessageBuilderPlain.Create;
        end;
        try
            if Attachments <> nil then
            begin
                for s in Attachments do
                    builder.Attachments.Add(s);
            end;

            builder.FillMessage(msg);
        finally
            builder.Free;
        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
            msg.Body.Text := EmailBody;

        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
            smtp.Host := SMTPServer; // IP Address of SMTP server
            smtp.Port := 25; //The default already is port 25 (the SMTP port)

            //Indy (and C# SmtpClient class) already defaults to the computer name
            //smtp.HeloName :=
            smtp.Connect;
            try
                smtp.Send(msg)
            finally
                smtp.Disconnect;
            end;
        finally
            smtp.Free;
        end;
    finally
        msg.Free;
    end;
end;

Примечание : любой код, опубликованный в открытом доступе. Указание авторства не требуется.

3 голосов
/ 02 ноября 2009

Я уверен, что есть пример проекта Indy, показывающий, как это сделать.Ищите проект «MailClient» среди демонстрационных версий Indy.Вы также можете проверить архивы группы новостей CodeGear, например, здесь:

http://codenewsfast.com/isapi/isapi.dll/article?id=4507106B&article=6979409

Также короткая статья Реми Лебо здесь: http://www.indyproject.org/Sockets/Blogs/RLebeau/2005_08_17_A.en.aspx

Все это было легко найтиКстати, быстрый поиск в Интернете.Если вы работаете в Delphi и не используете базу знаний CodeNewsFast.com, вы тратите время и силы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...