Я попытался встроить код icalendar в электронное письмо, которое будет отправлено через indy, с типом контента text/calendar, но он просто зависает в кодировке электронного письма, когда я добавляю его в качестве вложения, он просто поступает как вложение и не запрашивает как др. календарь просьба сделать. У кого-нибудь есть пример кода, как делать запросы календаря через indy?
Как отправить электронное письмо с запросом календаря (тип содержимого: текст/календарь)
Ответы (2)
Вот альтернатива примеру 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.
person
Remy Lebeau
schedule
19.04.2010
Спасибо, я запустил программу RRUZ, вроде работала в gmail, но Outlook при получении письма просто обрывается. Более конкретно. Служба автоматически отправляет электронную почту с сервера, используя Indy. Каждое электронное письмо имеет текстовую/простую часть, текстовую/html-часть и, возможно, вложения. Это прекрасно работает. При попытке включить ical в конце, как в примере с текстом контента/календарем; method=request в качестве финальной части программа зависает после кодирования сообщения для первых частей, но проблема в части календаря. Часть сообщения, как если бы это был текст/простой текст с tstrings ical и содержимым, как указано.
- person David Lindsey; 19.04.2010
Тогда вы, вероятно, неправильно заполняете TIdMessage, пожалуйста, покажите свой фактический код.
- person Remy Lebeau; 20.04.2010
мой код ниже, добавленная часть является последней после вложений и т. Д. Процедура Emailer.BuildCalendar (Msg_In: TIdMessage); переменная с: TStrings; константа TAB = #9; начать попытку s:= TStringList.Create; s.Add('НАЧАЛО:VCALENDAR'); ... здесь добавлены другие строки ..... s.Add('END:VCALENDAR'); // Создаем части календаря с помощью TIdText.Create(Msg_In.MessageParts, s) do begin ContentType := 'text/calendar; метод=ЗАПРОС; кодировка=UTF-8'; Родительская часть := 0 ; // IdText.CharSet end; наконец s.free; конец; конец; .... с благодарностью
- person David Lindsey; 20.04.2010
Вы не показали весь код TIdMessage. Однако вы устанавливаете ParentPart:=0, что помещает вложение на неправильный уровень сообщения. ParentPart используется для вложения, и вложение не должно быть вложенным. Оставьте ParentPart равным -1.
- person Remy Lebeau; 20.04.2010
Вот оно. Изменил ParentPart и теперь работает нормально. Как неловко. Большое спасибо за вашу помощь. С уважением Дэвид
- person David Lindsey; 21.04.2010
@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.
person
RRUZ
schedule
18.04.2010