Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблем отправки почты с вложениями через Graph API в Delphi/Pascal: создание черновика и обработка ошибок.

Delphi , Интернет и Сети , E-mail

В вашем случае, проблема связана с созданием черновика письма с вложением через Microsoft Graph API. Основные ошибки:

  1. Неправильный формат JSON-запроса для создания черновика.
  2. Неверный способ указания вложения.
  3. Проблемы с аутентификацией и разрешениями.

Решение:

  1. Правильный формат запроса для создания черновика с вложением:
function TMainForm.CreateDraftWithAttachment(const AccessToken, FileName, FileId: string): string;
var
  HttpClient: THttpClient;
  RequestContent: TStringStream;
  Response: IHTTPResponse;
  JSONRequest: string;
  Headers: TNetHeaders;
begin
  HttpClient := THttpClient.Create;
  try
    JSONRequest := 
      '{' +
      '  "subject": "Document from DMS",' +
      '  "body": {' +
      '    "contentType": "text",' +
      '    "content": "Please review the attached file."' +
      '  },' +
      '  "attachments": [' +
      '    {' +
      '      "@odata.type": "#microsoft.graph.fileAttachment",' +
      '      "name": "' + FileName + '",' +
      '      "contentBytes": "' + GetFileContentAsBase64(FileName) + '"' +
      '    }' +
      '  ]' +
      '}';

    SetLength(Headers, 2);
    Headers[0].Name := 'Authorization';
    Headers[0].Value := 'Bearer ' + AccessToken;
    Headers[1].Name := 'Content-Type';
    Headers[1].Value := 'application/json';

    RequestContent := TStringStream.Create(JSONRequest, TEncoding.UTF8);
    try
      Response := HttpClient.Post('https://graph.microsoft.com/v1.0/me/messages', 
                                RequestContent, nil, Headers);

      if Response.StatusCode in [200, 201] then
        Result := ExtractDraftIdFromResponse(Response.ContentAsString)
      else
        raise Exception.Create('Error creating draft: ' + Response.ContentAsString);
    finally
      RequestContent.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;
  1. Альтернативное решение - использование ссылки на файл в OneDrive:
function TMainForm.CreateDraftWithOneDriveLink(const AccessToken, FileName, FileId: string): string;
var
  HttpClient: THttpClient;
  RequestContent: TStringStream;
  Response: IHTTPResponse;
  JSONRequest: string;
  Headers: TNetHeaders;
begin
  HttpClient := THttpClient.Create;
  try
    JSONRequest := 
      '{' +
      '  "subject": "Document from DMS",' +
      '  "body": {' +
      '    "contentType": "text",' +
      '    "content": "Please review the attached file."' +
      '  },' +
      '  "attachments": [' +
      '    {' +
      '      "@odata.type": "#microsoft.graph.referenceAttachment",' +
      '      "name": "' + FileName + '",' +
      '      "sourceUrl": "https://graph.microsoft.com/v1.0/me/drive/items/' + FileId + '",' +
      '      "providerType": "oneDriveBusiness",' +
      '      "permission": "read"' +
      '    }' +
      '  ]' +
      '}';

    SetLength(Headers, 2);
    Headers[0].Name := 'Authorization';
    Headers[0].Value := 'Bearer ' + AccessToken;
    Headers[1].Name := 'Content-Type';
    Headers[Value] := 'application/json';

    RequestContent := TStringStream.Create(JSONRequest, TEncoding.UTF8);
    try
      Response := HttpClient.Post('https://graph.microsoft.com/v1.0/me/messages', 
                                RequestContent, nil, Headers);

      if Response.StatusCode in [200, 201] then
        Result := ExtractDraftIdFromResponse(Response.ContentAsString)
      else
        raise Exception.Create('Error creating draft: ' + Response.ContentAsString);
    finally
      RequestContent.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;
  1. Функция для извлечения ID черновика из ответа:
function TMainForm.ExtractDraftIdFromResponse(const ResponseContent: string): string;
var
  JSONObj: TJSONObject;
begin
  JSONObj := TJSONObject.ParseJSONValue(ResponseContent) as TJSONObject;
  try
    if Assigned(JSONObj) then
      Result := JSONObj.GetValue('id').Value
    else
      Result := '';
  finally
    JSONObj.Free;
  end;
end;

Дополнительные рекомендации:

  1. Убедитесь, что ваше приложение имеет необходимые разрешения в Azure AD:
    Mail.ReadWrite
    Mail.Send
    Files.ReadWrite
  2. Для больших файлов (более 3MB) используйте метод с ссылкой на OneDrive.

  3. Для отладки используйте Graph Explorer (https://developer.microsoft.com/graph/graph-explorer) для проверки запросов.

  4. Убедитесь, что ваш AccessToken действителен и содержит необходимые scope.

  5. Для работы с большими файлами рассмотрите возможность использования сессий загрузки (upload sessions).

Это решение должно решить вашу проблему с созданием черновиков писем с вложениями через Graph API в Delphi.

Создано по материалам из источника по ссылке.

Проблема связана с созданием черновика письма с вложением через Microsoft Graph API, включая ошибки формата JSON, указания вложений и аутентификации, с предложенными решениями на Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: E-mail ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-14 18:11:11/0.0083680152893066/0