Send an email with attachment Client Agnostic
I currently have an application written that generates pdf vouchers and emails to their perspective recipients. However the function I use is client dependent (MS Outlook) and I would really like to make this email client agnostic as we have many customers and not all of them use Outlook.
I have looked at a few options but can't really find anything in searching that seems to solve my problem.
Does anyone know a good way to send email using the customers smtp connection regardless of the client and send an attachment with it without c开发者_运维知识库alling the client directly to do it?
Or you can use the Synapse library, for sending a mail using SMTP, ideally in its newest snapshot.
Here is the code which should send the mail with attached c:\voucher.pdf
file from sender@from.com
to recipient@to.com
to the smtp.server.com
with login login
and password password
. About the rest of the functions from the TMimeMess
class I would refer you directly to the reference.
I hope this will work because I've simplified and localized much more complicated code I'm using and I can't verify it nor compile. If not, let's downvote it :)
uses
SMTPSend, MIMEPart, MIMEMess;
procedure TForm.SendEmailClick(Sender: TObject);
var
MIMEText: TStrings;
MIMEPart: TMimePart;
MIMEMessage: TMimeMess;
begin
MIMEText := TStringList.Create;
MIMEText.Add('Hello,');
MIMEText.Add('here is the text of your e-mail message,');
MIMEText.Add('if you want the HTML format, use AddPartHTML');
MIMEText.Add('or e.g. AddPartHTMLFromFile if you have your');
MIMEText.Add('HTML message content in a file.');
MIMEMessage := TMimeMess.Create;
with MIMEMessage do
try
Header.Date := Now;
Header.From := 'sender@from.com';
Header.ToList.Clear;
Header.ToList.Add('recipient@to.com');
Header.CcList.Clear;
Header.Subject := 'E-mail subject';
Header.XMailer := 'My mail client name';
MIMEPart := AddPartMultipart('mixed', nil);
AddPartText(MIMEText, MIMEPart);
AddPartBinaryFromFile('c:\voucher.pdf', MIMEPart);
EncodeMessage;
if SendToRaw(Header.From, // e-mail sender
Header.ToList.CommaText, // comma delimited recipient list
'smtp.server.com', // SMTP server
Lines, // MIME message data
'login', // server authentication
'password') // server authentication
then
ShowMessage('E-mail has been successfuly sent :)')
else
ShowMessage('E-mail sending failed :(');
finally
Free;
MIMEText.Free;
end;
end;
Update:
According to nice comment from Downvoter step into the light (man, change your nick please, it's not cool anymore :), would be really bad if you will send the list of all recipients to everyone. With synapse you cannot add BCCs to the message header; there's no Header.BCCList
property in MIMEMessage
.
Instead you can directly modify the data before sending them.
// First, you will remove the line where you are adding a recipient to the list
Header.ToList.Add('recipient@to.com');
// the rest between you can keep as it is and after the message encoding
EncodeMessage;
// and before sending the mail you'll insert the line with BCCs
Lines.Insert(1, 'Bcc: jane@invisiblecustomer.com, lisa@invisiblecustomer.com');
if SendToRaw ...
You could use Indy as your SMTP client, independent of the system default e-mail client. Here's a basic demo of sending e-mails without attachments, and there are detailed articles here and here about sending HTML or plain-text e-mails and with or without attachments.
If you want to integrate with the existent email client (e.g. see the sent messages in the sent
, sent items
, etc. folder of the email client), you could use Simple MAPI. The headers are translated in the Mapi unit in Delphi (at least in D2007).
But be careful to check if the actual client supports Simple MAPI.
精彩评论