2010-04-18 7 views
5

J'ai essayé d'intégrer le code icalendar dans un e-mail à envoyer via indy avec un type de contenu texte/calendrier mais il se bloque sur l'encodage de l'e-mail lorsque j'ajoute en pièce jointe il arrive juste en pièce jointe et ne demande pas comme d'autres demandes de calendrier. Quelqu'un at-il un exemple de code sur la façon de faire des demandes de calendrier via indy?Comment envoyer un e-mail avec une requête de calendrier (type de contenu: texte/calendrier)

Répondre

4

Voici une alternative à l'exemple 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

Merci, j'ai couru genre de programme RRUZ de travaillé dans gmail, mais les perspectives lors de la récupération du courrier électronique j Le premier se termine. Plus spécifique. Le service auto envoie un email depuis le serveur en utilisant Indy chaque email a une partie texte/plain, la partie texte/html et éventuellement des pièces jointes. Cela fonctionne bien. En essayant d'incorporer le ical à la fin semblable à l'exemple avec le contenu text/calendar; method = demande en tant que partie finale le programme se fige après l'encodage du message pour les premières parties mais un problème sur la partie calendrier. Le message se comporte comme si un texte/plaine avec les chaînes de l'ical et le contenu comme mentionné. –

+0

Ensuite, vous ne remplissez probablement pas le message TIdMessage correctement, s'il vous plaît montrer votre code actuel. –

+0

mon code ci-dessous, la partie ajoutée est la dernière après les pièces jointes ect Procédure Emailer.BuildCalendar (Msg_In: TIdMessage); var s: TStrings; const TAB = # 9; begin try s: = TStringList.Crée; s.Add ('BEGIN: VCALENDAR'); ... autres lignes ajoutées ici ..... s.Add ('END: VCALENDAR'); // Créer les parties du calendrier avec TIdText.Create (Msg_In.MessageParts, s) faire begin ContentType: = 'text/calendar; method = "DEMANDE"; jeu de caractères = "UTF-8" '; Partie Parent: = 0; // IdText.CharSet end; enfin s.free; fin; fin; .... avec des remerciements –

4

@ David, le client de messagerie reconnaîtra comme une demande de calendrier de la pièce jointe si vous définissez la propriété sur ContentType:='text/calendar', voir ce lien pour le iCalendar format Specification

voir cet exemple de code (testé 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. 
Questions connexes