2010-04-18 11 views
5

He intentado incrustar el código icalendar en un correo electrónico para enviarlo a través de indy con un tipo de texto/calendario pero simplemente se cuelga en la codificación del correo electrónico cuando agrego como archivo adjunto, solo llega como un archivo adjunto y no aparece como lo hacen otras solicitudes de calendario. ¿Alguien tiene un código de ejemplo de cómo hacer solicitudes de calendario a través de indy?Cómo enviar un correo electrónico con una solicitud de calendario (tipo de contenido: texto/calendario)

Respuesta

4

Aquí es una alternativa al ejemplo de RRUZ:

program SendMailWithCalendarRequest; 
{$APPTYPE CONSOLE} 

uses 
    IdSMTP, 
    Classes, 
    DateUtils, 
    IdMessage, 
    SysUtils; 

procedure SendCalendarRequest; 
var 
    SMTP  : TIdSMTP; 
    MailMessage : TIdMessage; 
begin 
    SMTP:= TIdSMTP.Create(nil); 
    MailMessage := TIdMessage.Create(nil); 
    try 
    SMTP.Host := 'smtp.mailserver.com'; 
    SMTP.Port := 25; 
    SMTP.Username := 'the account'; 
    SMTP.Password := 'the password'; 
    SMTP.AuthType := satDefault; 
    MailMessage.From.Address := '[email protected]'; 
    MailMessage.Recipients.EMailAddresses := 'the Recipient'; 
    MailMessage.Subject := 'Send calendar'; 
    MailMessage.Body.Add('BEGIN:VCALENDAR'); 
    MailMessage.Body.Add('VERSION:1.0'); 
    MailMessage.Body.Add('BEGIN:VEVENT'); 
    MailMessage.Body.Add('ORGANIZER:MAILTO:'+SenderMail); 
    MailMessage.Body.Add('DTStart:'+FormatDateTime('YYYY-DD-DD',Now)); 
    MailMessage.Body.Add('DTEnd:'+FormatDateTime('YYYY-DD-DD', Tomorrow)); 
    MailMessage.Body.Add('Location;ENCODING=QUOTED-PRINTABLE: My home'); 
    MailMessage.Body.Add('UID:'+FormatDateTime('YYYY-DD-DD',Now)+FormatDateTime('YYYY-DD-DD', Tomorrow)); 
    MailMessage.Body.Add('SUMMARY:Appointment Reminder'); 
    MailMessage.Body.Add('DESCRIPTION:Test message'); 
    MailMessage.Body.Add('PRIORITY:5'); 
    MailMessage.Body.Add('END:VEVENT'); 
    MailMessage.Body.Add('END:VCALENDAR'); 
    MailMessage.ContentType := 'text/calendar'; 
    SMTP.Connect; 
    try 
     try 
     SMTP.Send(MailMessage) ; 
     Writeln('OK') 
     except on E:Exception do 
     Writeln(0, 'ERROR: ' + E.Message) ; 
     end; 
    finally 
     SMTP.Disconnect; 
    end; 
    finally 
    SMTP.Free; 
    MailMessage.Free; 
    end; 
end; 

begin 
    try 
    SendCalendarRequest; 
    readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
+0

Gracias, me encontré RRUZ tipo de programa trabajado en Gmail, pero la perspectiva al recuperar el correo electrónico j ust termina. Más específico. El servicio envía automáticamente el correo electrónico desde el servidor usando Indy. Cada correo electrónico tiene una parte de texto/normal, la parte de texto/html y, opcionalmente, archivos adjuntos. Esto funciona bien Al tratar de incorporar el ical al final, similar al ejemplo con texto/calendario de contenido; método = solicitar como parte final el programa se congela después del mensaje de codificación para las primeras partes pero un problema en la parte del calendario. La parte del mensaje como si fuera un texto/plano con las secciones del ical y el contenido como se menciona. –

+0

Entonces es probable que no llene correctamente el TIdMessage, por favor muestre su código actual. –

+0

mi código a continuación, la parte añadida es la última después de los archivos adjuntos ect Procedimiento Emailer.BuildCalendar (Msg_In: TIdMessage); var s: TStrings; const TAB = # 9; begin try s: = TStringList.Create; s.Add ('BEGIN: VCALENDAR'); ... otras líneas agregadas aquí ..... s.Add ('END: VCALENDAR'); // Cree las partes del Calendario con TIdText.Create (Msg_In.MessageParts, s) do begin ContentType: = 'text/calendar; método = "SOLICITUD"; charset = "UTF-8" '; ParentPart: = 0; // IdText.CharSet final; finalmente s.free; fin; final; .... con agradecimiento –

4

@ David, el cliente de correo electrónico reconocerá como una petición Calendario de la unión, si se establece la propiedad de ContentType:='text/calendar', véase este enlace para el iCalendar format Specification

ver este código de ejemplo (probado en Delphi 2010)

program SendMailWithCalendarRequest; 
{$APPTYPE CONSOLE} 


uses 
    IdSMTP, 
    Classes, 
    DateUtils, 
    IdAttachmentFile, 
    IdMessage, 
    SysUtils; 

procedure SendCalendarRequest; 
var 
    SMTP  : TIdSMTP; 
    MailMessage : TIdMessage; 
    Calendar : TStrings; 
    CalendarFile: String; 
    Attachment : TIdAttachmentFile; 
    SenderMail : String; 
begin 
    SenderMail:='[email protected]'; 
    CalendarFile:=ExtractFilePath(ParamStr(0))+'\appmnt.vcs'; 
    Calendar:=TStringList.Create; 
    try 
     Calendar.Add('BEGIN:VCALENDAR'); 
     Calendar.Add('VERSION:1.0'); 
     Calendar.Add('BEGIN:VEVENT'); 
     Calendar.Add('ORGANIZER:MAILTO:'+SenderMail); 
     Calendar.Add('DTStart:'+FormatDateTime('YYYY-DD-DD',Now)); 
     Calendar.Add('DTEnd:'+FormatDateTime('YYYY-DD-DD', Tomorrow)); 
     Calendar.Add('Location;ENCODING=QUOTED-PRINTABLE: My home'); 
     Calendar.Add('UID:'+FormatDateTime('YYYY-DD-DD',Now)+FormatDateTime('YYYY-DD-DD',Tomorrow)); 
     Calendar.Add('SUMMARY:Appointment Reminder'); 
     Calendar.Add('DESCRIPTION:Test message'); 
     Calendar.Add('PRIORITY:5'); 
     Calendar.Add('END:VEVENT'); 
     Calendar.Add('END:VCALENDAR'); 
     Calendar.SaveToFile(CalendarFile); 
    finally 
    Calendar.Free; 
    end; 

    SMTP:= TIdSMTP.Create(nil); 
    MailMessage := TIdMessage.Create(nil); 
    try 
    SMTP.Host := 'smtp.mailserver.com'; 
    SMTP.Port := 25; 
    SMTP.Username:='the account'; 
    SMTP.Password:='the password'; 
    SMTP.AuthType:=satDefault; 
    MailMessage.From.Address := SenderMail; 
    MailMessage.Recipients.EMailAddresses := 'the Recipient'; 
    MailMessage.Subject := 'Send calendar'; 
    MailMessage.Body.Text := ''; 
    Attachment:=TIdAttachmentFile.Create(MailMessage.MessageParts, CalendarFile) ; 
    Attachment.ContentType:='text/calendar';//set the content type to text/calendar 
    try 
     try 
     SMTP.Connect; 
     SMTP.Send(MailMessage) ; 
     Writeln('OK') 
     except on E:Exception do 
     Writeln(0, 'ERROR: ' + E.Message) ; 
     end; 
    finally 
     if SMTP.Connected then SMTP.Disconnect; 
    end; 
    finally 
    SMTP.Free; 
    MailMessage.Free; 
    end; 

end; 

begin 
    try 
    SendCalendarRequest; 
    readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
Cuestiones relacionadas