PDA

Ver la Versión Completa : Mandar un email desde delphi


jorgegetafe
21-10-2007, 16:50:34
Buenas, en mi aplicación necesito que cuando se pulse un botón se mande un email a una dirección de correo dada. ¿Como se haría?

Se podría mandar un adjunto sabiendo el archivo que se quiere mandar?

Muchas gracias por todo.

Lonidas
21-10-2007, 17:32:32
mira este hilo http://www.clubdelphi.com/foros/showthread.php?t=46274&highlight=email

jorgegetafe
22-10-2007, 19:01:45
Como no puedo seguir en la otra conversación porque está cerrada continuo aqui.

Con este código y tras añadir idemessage y idsmtp tengo varios problemas:



procedure TForm1.Button1Click(Sender: TObject);
var
mail : TIDMessage;
smtp : TIdSMTP;
begin
smtp := TIdSMTP.Create(self);
// ASIGNO EVENTOS
smtp.Name := 'Smtp';
// CONFIGURACION DEL SERVIDOR AL QUE SE ENVIA EL CORREO
with smtp do begin
AuthenticationType := atLogin;
Host := //Aqui colocas la direccion del servidor de correo saliente;
port := 25;
Username := //Aqui colocas la direccion de correo desde la que enviaras el correo;
Password := //Clave de dicha cuenta;
end;
mail := TIdMessage.Create(Self);
// CONFIGURACION DEL MENSAJE A ENVIAR
with mail do begin
From.Address := //aqu iva la direccion de correo desde la que vas a enviar
Recipients.EMailAddresses := //aqu iva la direccion de correo hacia la que vas a enviar
Subject := //Asunto del correo
body.Text := //Texto del correo
end;
//aDJUNTA EL ARCHIVO
if FileExists(//El archivo que vas a enviar) then
TIdAttachment.create(mail.MessageParts,//Ruta del archivo que vas a enviar);
try
// CONEXION CON EL SERVIDOR DE CORREO
smtp.Connect(10000);
try
// ENVIO DEL MENSAJE
smtp.Send(mail);
except
on E: Exception do
ShowMessage('Fallo al enviar: ' + E.Message);
end;
ShowMessage('Mensaje enviado satisfactoriamente');
finally
if SMTP.Connected then SMTP.Disconnect;
smtp.free;
mail.free;
end;






port := 25;
Aquí me da el siguiente error al compilar: Imcompatible types string and procedure, untyped pointer or untyped parameter.


luego en:
Host := //Aqui colocas la direccion del servidor de correo saliente;
El servidor de correo saliente es el hotmail (lo mando desde una cuenta hotmail) pero no se que direccion poner... www.hotmail.com no creo que sea verdad? No tengo ni idea, gracias.

eduarcol
22-10-2007, 19:27:36
Ese codigo funciona solo en servidores POP, si buscas una cuenta yo te ayudo a configurar el codigo

jorgegetafe
22-10-2007, 19:29:38
Ese codigo funciona solo en servidores POP, si buscas una cuenta yo te ayudo a configurar el codigo

Tengo una cuenta en gmail, creo que esa si que tiene POP gratuito no?

Si me pudieses ayudar con el código te lo agradecería enormemente.

eduarcol
22-10-2007, 19:42:40
como dice GMAIL:

Por favor, ten en cuenta que si tu cliente no admite la autenticación SMTP, no podrás enviar mensajes a través del cliente con tu dirección de Gmail.

pero podemos intentarlo, teniendo en cuenta estos parametros:

El servidor de correo entrante (POP3) requiere SSL: pop.gmail.com
Usar SSL: Sí
Puerto: 995

El servidor de correo saliente (SMTP) requiere TLS: smtp.gmail.com Usar autenticación
Usar autenticación Sí
Usar STARTTLS: Sí (en algunos clientes se denomina SSL)
Puerto: 465 o 587

Nombre de cuenta: tu nombre de usuario de Gmail (incluido @gmail.com).
Dirección de correo electrónico: tu dirección de correo electrónico completa de Gmail (nombredeusuario@gmail.com)
Contraseña: tu contraseña de Gmail

lo que me pone a dudar es el aunto de la SSL pero ahi vamos

procedure TForm1.Button1Click(Sender: TObject);
var
mail : TIDMessage;
smtp : TIdSMTP;
begin
smtp := TIdSMTP.Create(self);
// ASIGNO EVENTOS
smtp.Name := 'Smtp';
// CONFIGURACION DEL SERVIDOR AL QUE SE ENVIA EL CORREO
with smtp do begin
AuthenticationType := atLogin;
Host := 'smtp.gmail.com';
port := 465;
Username := //Aqui colocas la direccion de correo desde la que enviaras el correo;
Password := //Clave de dicha cuenta;
end;
mail := TIdMessage.Create(Self);
// CONFIGURACION DEL MENSAJE A ENVIAR
with mail do begin
From.Address := //aqu iva la direccion de correo desde la que vas a enviar
Recipients.EMailAddresses := //aqu iva la direccion de correo hacia la que vas a enviar
Subject := //Asunto del correo
body.Text := //Texto del correo
end;
//aDJUNTA EL ARCHIVO
if FileExists(//El archivo que vas a enviar) then
TIdAttachment.create(mail.MessageParts,//Ruta del archivo que vas a enviar);
try
// CONEXION CON EL SERVIDOR DE CORREO
smtp.Connect(10000);
try
// ENVIO DEL MENSAJE
smtp.Send(mail);
except
on E: Exception do
ShowMessage('Fallo al enviar: ' + E.Message);
end;
ShowMessage('Mensaje enviado satisfactoriamente');
finally
if SMTP.Connected then SMTP.Disconnect;
smtp.free;
mail.free;
end;
end;

lo unico que te queda es colocar la informacion que te corresponde, direcciones de correo y contraseñas

jorgegetafe
22-10-2007, 19:46:17
Muchísimas gracias, voy a probar, luego te cuento ;-)

jorgegetafe
22-10-2007, 19:55:28
He modificado el código tal y como me has puesto en los comentarios, me salen unos errores que ni por asomo se solucionar, te muestro la imagen que creo que asi me explico mejor:

http://img236.imageshack.us/img236/6713/dibujoan3.jpg

gracias.

eduarcol
22-10-2007, 20:01:21
Por pura curiosidad:

¿Estas trabajando con archivos adjuntos?

En caso de ser negativa la respuesta,

¿Quitastes la referencia a codigo adjuntos?

jorgegetafe
22-10-2007, 20:16:01
Gracias de nuevo, ya he arreglado el fallo, no cambie una cosa que era necesario.

Ejecuto el programa y ni me muestra mensajes, ni errores ni nada, se queda trabajando y nunca acaba... :-(

Te pongo exactamente el codigo con las direcciones de correo falsas:



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdMessage, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP;
type
TForm1 = class(TForm)
Button1: TButton;
IdSMTP1: TIdSMTP;
IdMessage1: TIdMessage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
mail : TIDMessage;
smtp : TIdSMTP;
begin
smtp := TIdSMTP.Create(self);
// ASIGNO EVENTOS
smtp.Name := 'Smtp';
// CONFIGURACION DEL SERVIDOR AL QUE SE ENVIA EL CORREO
with smtp do begin
AuthenticationType := atLogin;
Host := 'smtp.gmail.com';
port := 465;
Username := 'pepe@gmail.com';
Password := 'contraseña';
end;
mail := TIdMessage.Create(Self);
// CONFIGURACION DEL MENSAJE A ENVIAR
with mail do begin
From.Address := 'pepe@gmail.com';
Recipients.EMailAddresses := 'pepe@gmail.com';
Subject := 'Mensaje de prueba';
body.Text := 'Si estás leyendo esto es porque el mensaje ha llegado correctamente';
end;
//aDJUNTA EL ARCHIVO
if FileExists('C:\Documents and Settings\Jorge\Escritorio\Mandar correo/hola.txt') then // ruta del archivo a enviar
TIdAttachment.create(mail.MessageParts,'C:\Documents and Settings\Jorge\Escritorio\Mandar correo/hola.txt');
try
// CONEXION CON EL SERVIDOR DE CORREO
smtp.Connect(10000);
try
// ENVIO DEL MENSAJE
smtp.Send(mail);
except
on E: Exception do
ShowMessage('Fallo al enviar: ' + E.Message);
end;
ShowMessage('Mensaje enviado satisfactoriamente');
finally
if SMTP.Connected then SMTP.Disconnect;
smtp.free;
mail.free;
end;
end;
end.




Gracias una vez más.

dec
22-10-2007, 20:22:12
Hola,

Para trabajar con Gmail es preciso utilizar el protocolo "SSL" (Secure Socket Layer), necesitas algunas librerías para esto, y además usar componentes adicionales. Echa un vistazo al hilo Utilizar Gmail con SSL (http://www.clubdelphi.com/foros/showthread.php?t=40611&highlight=gmail) donde el compañero Román adjuntó un ejemplo práctico y funcional.

Otra cosa que llama la atención en tu código es:


// ASIGNO EVENTOS
smtp.Name := 'Smtp';


Puesto que lo que haces es, sencillamente, dar un nombre al objeto que instancias antes. No asignas ningún evento... y tal vez ni haga falta en este caso. :)

eduarcol
22-10-2007, 20:46:03
Ese error fue mio, de copiar y pegar, quite el codigo pero no los comentarios :D:D

dec
22-10-2007, 21:50:13
Hola,


Ese error fue mio, de copiar y pegar, quite el codigo pero no los comentarios :D :D


¡A la hoguera con él! :D :D

eduarcol
22-10-2007, 21:54:50
Hola,



¡A la hoguera con él! :D :D

pero con el jamon para que se cocine conmigo :D:D

dec
22-10-2007, 21:59:23
Hola,

Aquí aplica lo de que las penas con pan son menos penas... ¡y con jamón no te digo! :D :D

jocey
22-10-2007, 22:01:45
Hola aqui te pongo el codigo para que le heches una ojeada


procedure TForm1.Button16Click(Sender: TObject);
const
olMailItem = 0;
olByValue = 1;
var
OutlookApp, MailItem, MyAttachments: OLEVariant;
begin
try
OutlookApp := GetActiveOleObject('Outlook.Application');
except
OutlookApp := CreateOleObject('Outlook.Application');
end;
try
MailItem := OutlookApp.CreateItem(olMailItem);
MailItem.Recipients.Add('YourMailAddress@something.com');
MailItem.Subject := 'Your Subject';
MailItem.Body := 'Your Message';
myAttachments := MailItem.Attachments;
myAttachments.Add('C:\SomeFile.txt', olByValue, 1, 'Name of Attachment');
MailItem.Send;
finally
myAttachments := VarNull;
OutlookApp := VarNull;
end;
end;

Faust
06-12-2007, 17:30:05
Saludos camaradas:

Perdón que reviva este hilo.

Ya hace tiempo que utilizo este método para enviar correos de reportes que genero en Delphi, de esta manera el envío es automático, pues requiero que se envíen a ciertas personas cada cierto tiempo.

Mi duda es si mediante este método puedo pedir un acuse de recibo a los destinatarios, ya que me piden que los destinatarios confirmen que han recibido y leído el mensaje.

De una vez les agradezco la ayuda, mientras buscaré en google a ver que encuentro.