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.
精彩评论