开发者

How send an email with html-contetent with IdSMTP (Delphi)?

开发者 https://www.devze.com 2022-12-10 19:26 出处:网络
How can I send an email by using Delphi\'s IdSMTP-component with html-contet开发者_运维问答ent?Having to recently use the Indy IdSmtp component, it was a shame that there was no good answer to this qu

How can I send an email by using Delphi's IdSMTP-component with html-contet开发者_运维问答ent?


Having to recently use the Indy IdSmtp component, it was a shame that there was no good answer to this question. I re-wrote our helper function to send e-mail using Indy (both HTML and plaintext)

Sample Usage

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

The tricky part is that Indy makes it difficult to send an HTML e-mail. They eventually provided an TIdMessageBuilderHtml class to handle most of the grunt work; but it's nowhere near as pleasent as the SmtpClient class. In the end you'll take a dependency on three units.

The Code

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;

Note: Any code released into public domain. No attribution required.


I'm pretty sure there's a sample Indy project showing you how to do that. Look for the 'MailClient' project among Indy demos. You can also check CodeGear newsgroup archives, e.g., here:

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

Also Remy Lebeau's short article here: http://www.indyproject.org/Sockets/Blogs/RLebeau/2005_08_17_A.en.aspx

All of this was easily findable by quick internet search, by the way. If you work in Delphi and you don't use the CodeNewsFast.com knowledgebase then you're wasting time and effort.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号