Como enviar um email com uma solicitação de calendário (Tipo de conteúdo: texto/calendário)
Pergunta
Eu tentei incorporar o código do iCalendar em um email a ser enviado via Indy com um texto/calendário do tipo conteúdo, mas ele apenas fica na codificação do email quando adiciono como anexo, ele apenas chega como anexo e não solicita como solicita Outra solicitação de calendário. Alguém tem um código de exemplo de como fazer solicitações de calendário via Indy?
Solução
Aqui está uma alternativa ao exemplo 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 := 'mail@server.com';
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.
Outras dicas
@David, o cliente de email reconhecerá como um calendário solicitar o anexo se você definir a propriedade como ContentType:='text/calendar'
, veja este link para o Especificação de formato de iCalendar
Veja este código de amostra (Testado 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:='mail@server.com';
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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow