Отправить письмо с приложением Client Agnostic - PullRequest
7 голосов
/ 20 июля 2011

В настоящее время у меня есть приложение, которое генерирует ваучеры в формате pdf и электронные письма их потенциальным получателям. Однако функция, которую я использую, зависит от клиента (MS Outlook), и я действительно хотел бы сделать этот почтовый клиент независимым, так как у нас много клиентов, и не все из них используют Outlook.

Я рассмотрел несколько вариантов, но не могу найти в поиске ничего, что, похоже, решило бы мою проблему.

Кто-нибудь знает хороший способ отправки электронной почты с использованием SMTP-подключения клиентов независимо от клиента и отправки вложения с ним, не вызывая клиента напрямую, чтобы сделать это?

Ответы [ 3 ]

5 голосов
/ 20 июля 2011

Или вы можете использовать библиотеку Synapse для отправки почты с использованием SMTP, в идеале в новейшем снимке .

Вот код, который должен отправить письмо с приложенным c:\voucher.pdf файлом от sender@from.com до recipient@to.com на smtp.server.com с логином login и паролем password. Что касается остальных функций из класса TMimeMess, я бы прямо отсылал вас к ссылке .

Я надеюсь, что это сработает, потому что я упростил и локализовал гораздо более сложный код, который я использую, и я не могу ни проверить его, ни скомпилировать. Если нет, давайте понизим это:)

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;


Обновление:

Согласно приятному комментарию от Downvoter шаг в свет (мужик, смените свой ник, пожалуйста, это уже не круто :), было бы очень плохо, если вы отправите список всех получателей всем. С синапсом вы не можете добавить BCC в заголовок сообщения; в MIMEMessage нет Header.BCCList свойства. Вместо этого вы можете напрямую изменить данные перед их отправкой.

// 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 ...
1 голос
/ 20 июля 2011

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

0 голосов
/ 21 июля 2011

Если вы хотите интегрироваться с существующим почтовым клиентом (например, смотрите отправленные сообщения в папке sent, sent items и т. Д. Почтового клиента), вы можете использовать Simple MAPI .Заголовки переводятся в модуль Mapi в Delphi (по крайней мере, в D2007).

Но будьте внимательны, чтобы проверить, поддерживает ли реальный клиент Simple MAPI.

...