开发者

Send an email with attachment Client Agnostic

开发者 https://www.devze.com 2023-03-22 04:56 出处:网络
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 m

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.

0

精彩评论

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

关注公众号