如何发送带有日历请求的电子邮件(内容类型:文本/日历)

发布于 2024-08-29 15:23:01 字数 127 浏览 5 评论 0原文

我尝试将icalendar代码嵌入到通过indy发送的内容类型为文本/日历的电子邮件中,但当我添加为附件时,它只是挂在电子邮件的编码上,它只是作为附件到达,并且不会提示其他日历请求即可。有没有人有如何通过 indy 执行日历请求的示例代码?

I have tried to embed the icalendar code in a email to be sent via indy with a content type text/calendar but it just hangs on the encoding of the email when I add as an attachment it just arrives as an attachment and does not prompt as other calendar request do. Has any one got example code of how to do calendar requests via indy?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

成熟稳重的好男人 2024-09-05 15:23:01

这是 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. 

Here is an alternative to RRUZ's example:

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. 
溺ぐ爱和你が 2024-09-05 15:23:01

@David,如果您将属性设置为 ContentType:='text/calendar',电子邮件客户端会将附件识别为日历请求,请参阅此链接以获取 iCalendar 格式规范

请参阅此示例代码(在 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.

@David, the email client will recognize as a calendar request the attachment if you set the property to ContentType:='text/calendar', see this link for the iCalendar format Specification

see this sample code (tested 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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文