2011-07-20 23 views
7

Actualmente tengo una aplicación escrita que genera cupones pdf y correos electrónicos a sus destinatarios de la perspectiva. Sin embargo, la función que uso depende del cliente (MS Outlook) y realmente me gustaría que este cliente de correo electrónico sea independiente ya que tenemos muchos clientes y no todos usan Outlook.Enviar un correo electrónico con archivo adjunto Cliente Agnostic

He visto algunas opciones pero no encuentro nada en la búsqueda que parece resolver mi problema.

¿Alguien sabe una buena manera de enviar correos electrónicos utilizando la conexión smtp de los clientes sin importar el cliente y enviar un archivo adjunto sin llamar directamente al cliente para hacerlo?

Respuesta

5

O puede usar la biblioteca Synapse, para enviar un correo usando SMTP, idealmente en su newest snapshot.

Este es el código que debe enviar el correo con archivo adjunto de c:\voucher.pdf[email protected] a [email protected] a la smtp.server.com con login y contraseña loginpassword. Sobre el resto de las funciones de la clase TMimeMess, lo referiría directamente al the reference.

Espero que esto funcione porque simplifiqué y localicé código mucho más complicado que estoy usando y no puedo verificarlo ni compilarlo. Si no es así, vamos a 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 := '[email protected]'; 
    Header.ToList.Clear; 
    Header.ToList.Add('[email protected]'); 
    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; 


Actualización:

Según buen comentario de Downvoter step into the light (hombre, cambiar su nick por favor, no es enfríe más :), sería muy malo si va a enviar la lista de todos los destinatarios a todos. Con synapse you cannot agregue BCC al encabezado del mensaje; no hay propiedad Header.BCCList en MIMEMessage. En su lugar, puede modificar directamente los datos antes de enviarlos.

// First, you will remove the line where you are adding a recipient to the list 
Header.ToList.Add('[email protected]'); 

// 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: [email protected], [email protected]'); 

if SendToRaw ... 
+0

Voy a dar una oportunidad a esta ruta. el cc no será un problema. La aplicación solo envía un comprobante a un destinatario. El programa genera de 10 a 15 cupones diferentes y los envía por correo electrónico a los clientes de nuestros clientes. Un destinatario en todo el proceso. La implementación actual con Outlook funciona como un amuleto, pero como se indicó, no todos usan Outlook. – JamesW

1

Puede usar Indy como su cliente SMTP, independientemente del cliente de correo electrónico predeterminado del sistema. Aquí hay un demo básico de envío de correos electrónicos sin archivos adjuntos, y hay artículos detallados here y here sobre el envío de mensajes de texto HTML o de texto plano y con o sin archivos adjuntos.

+0

Pero eso no se integraría con el cliente de correo electrónico del usuario (es decir, no sería capaz de realizar un seguimiento de los correos electrónicos enviados). ¡No es una simple decisión de diseño! –

+2

@Leonardo Por supuesto que no se integraría. Si ese es un requisito, puede probar MAPI, hay 'JclMapi' en [JCL] (http://sourceforge.net/projects/jcl/) pero, nuevamente, no todos los clientes de correo electrónico lo soportan adecuadamente. –

+4

@Leonardo: James pidió SMTP, que es un protocolo, no un programa. Indy tiene un componente 'TIdSMTP' que accede directamente al protocolo SMTP, no se necesita ningún otro cliente de correo electrónico ya que TIdSMTP * es * el cliente.Si quiere rastrear los correos electrónicos enviados, deberá hacerlo manualmente (por ejemplo, conectándose a su servidor de correo electrónico a través del protocolo IMAP4 - vea el componente 'TIdIMAP4' - y cargándolo en la carpeta deseada). –

0

Si desea integrar con el cliente de correo electrónico existente (ver, por ejemplo, los mensajes enviados en la sent, sent items, etc. carpeta del cliente de correo electrónico), se puede usar Simple MAPI. Los encabezados se traducen en la unidad Mapi en Delphi (al menos en D2007).

Pero tenga cuidado de comprobar si el cliente real es compatible con Simple MAPI.

+0

Información importante en la página MAPI simple vinculada: 'Se desaconseja el uso de Simple MAPI. Puede estar alterado o no disponible en versiones posteriores de Windows. – mjn

+0

@mijn: Correcto. No lo noté Hm ... Veo algunas nuevas tareas viniendo ... – Toto

Cuestiones relacionadas