Ошибки API Gmail при отправке почты с использованием клиентских библиотек .NET

#c# #.net #google-api #gmail #google-api-dotnet-client

#c# #.net #google-api #gmail #google-api-dotnet-client

Вопрос:

Наше веб-приложение использует клиентские библиотеки Google .Net для отправки электронных писем нашим пользователям. У одного конкретного пользователя возникли проблемы с отправкой электронных писем; в основном с вложениями. Похоже, что мы получаем следующие 2 сообщения об ошибках:

Служба gmail выдала исключение: Google.Исключение GoogleApiException: Google.Apis.Запросы.Ошибка запроса строки сообщения с полезной нагрузкой ‘raw’ RFC822 или загрузка сообщения через /upload/* Требуется URL [400] Ошибки [ Сообщение[Строка сообщения с полезной нагрузкой ‘raw’ RFC822 или загрузка сообщения через /upload/* Требуется URL] Местоположение[ — ] Причина [Неверный запрос] Домен [глобальный] ]

И совсем недавно:

Служба gmail выдала исключение: Google.Исключение GoogleApiException: Google.Apis.Запросы.Размер полезной нагрузки запроса RequestError превышает ограничение: 1048576 байт. [400] Ошибки [ Сообщение[Размер полезной нагрузки запроса превышает ограничение: 1048576 байт.] Местоположение [ — ] Причина [неверный запрос] Домен [глобальный] ]

Само электронное письмо не содержит ничего слишком уникального; HTML body and a 1.4 MB PDF attachment . Интересно то, что если я авторизую свою личную учетную запись Gmail и пытаюсь отправить то же сообщение электронной почты с тем же вложением, для моей учетной записи все работает нормально. Похоже, что только этот пользователь получает эти ошибки.

Есть ли лучшая практика, которую я здесь упускаю? Или простое решение для этих ошибок? Я попытался немного поискать и ничего не нашел. Есть ли список ошибок, которые возвращает API Gmail, и как с ними справиться?

Ниже приведен код, который мы используем для отправки электронной почты:

 public override SendEmailResponse SendEmail(string from, string to, string subject, string body,
    string cc = null, string bcc = null, MultiEntityLookup attachments = null,
    Guid? experienceId = null, List<byte[]> inlineImages = null, bool sansSerif = false,
    List<EmailAttachment> emailAttachments = null, bool isPlainTextBody = false)
{
    // Accepted Media MIME types: message/rfc822
    MailBee.Mime.MailMessage email = new MailBee.Mime.MailMessage();

    email.From.Email = this.Credential.GetValueAsString("Username");
    email.From.DisplayName = this.Credential.GetLookup("UserId").Title;
    email.To = EmailUtility.ParseAndValidateEmailAddresses(to, response);

    if (email.To.Count == 0)
    {
        response.ErrorCode = EmailErrorCodes.NotSentInvalidTo;
        UpdateExperienceWithEmailStatus(experienceId, EmailErrorCodes.NotSentInvalidTo);
        return response;
    }

    if (!String.IsNullOrEmpty(cc))
    {
        email.Cc.Add(EmailUtility.ParseAndValidateEmailAddresses(cc, response));
    }

    if (!String.IsNullOrEmpty(bcc))
    {
        email.Bcc.Add(EmailUtility.ParseAndValidateEmailAddresses(bcc, response));
    }

    // Add a custom header
    if (experienceId.HasValue)
    {
        string shortExpId = EmailUtility.EncodeShortGuid(experienceId.Value);
        email.Headers.Add("X-CrelateExperienceId", shortExpId, true);
    }

    email.Subject = subject;

    if (isPlainTextBody)
    {
        email.BodyPlainText = body;
    }
    else
    {
        body = TextUtility.ConvertKendoHtmlForEmailBody(body, sansSerif);
        email.BodyHtmlText = body;
        email.MakePlainBodyFromHtmlBody();
    }

    // Add attachments
    if (emailAttachments != null amp;amp; emailAttachments.Count > 0)
    {
        // If we have a array of { byte[], filename }
        foreach (EmailAttachment attach in emailAttachments)
        {
            email.Attachments.Add(attach.content, attach.fileName, String.Empty, null, null, MailBee.Mime.NewAttachmentOptions.None, MailBee.Mime.MailTransferEncoding.None);
        }
    }
    else if (attachments != null amp;amp; attachments.Lookups.Count > 0)
    {
        // If we need to get the document from Azure
        char[] invalids = Path.GetInvalidFileNameChars();

        foreach (EntityLookup attachment in attachments.Lookups)
        {
            string fileName = attachment.Title;

            if (!String.IsNullOrEmpty(fileName))
            {
                string safeFileName = String.Join("_", fileName.Split(invalids, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.');

                CloudBlockBlob contentBlob = this.Data.OrganizationBlobContainer.GetBlockBlobReference(attachment.Id.ToString("D")   "/"   fileName);

                using (MemoryStream rawDoc = new MemoryStream())
                {
                    contentBlob.DownloadToStream(rawDoc);
                    rawDoc.Seek(0, SeekOrigin.Begin);

                    email.Attachments.Add(rawDoc, safeFileName, String.Empty, null, null, MailBee.Mime.NewAttachmentOptions.None, MailBee.Mime.MailTransferEncoding.None);
                }
            }
        }
    }

    // Attach inline images
    if (inlineImages != null amp;amp; inlineImages.Count > 0)
    {
        var c = 0;
        foreach (byte[] image in inlineImages)
        {
            email.Attachments.Add(image, "attch"   c   ".png", "attch"   c   ".png", null, null,
                MailBee.Mime.NewAttachmentOptions.Inline, MailBee.Mime.MailTransferEncoding.None);
            c  ;
        }
    }

    // Create a base64 encoded string
    string encoded = null;

    using (MemoryStream stream = new MemoryStream())
    {
        email.SaveMessage(stream);
        stream.Seek(0, SeekOrigin.Begin);

        byte[] emailBytes = stream.ToArray();

        encoded = Convert.ToBase64String(emailBytes).TrimEnd(PADDING).Replace(' ', '-').Replace('/', '_');
    }

    if (!String.IsNullOrEmpty(encoded))
    {
        GmailService service = new GmailService(new BaseClientService.Initializer
        {
            HttpClientInitializer = GetGoogleUserCredentialObject(),
            ApplicationName = "Our App"
        });

        try
        {
            Message googleMessage = new Message();
            googleMessage.Raw = encoded;

            string emailAddress = this.Credential.GetValueAsString("Username");

            // Send the email message
            Message created = service.Users.Messages.Send(googleMessage, emailAddress).Execute();
        }
        catch (Exception)
        {
            // Trace out the base64 encoded string so that we can duplicate the message
            Trace.TraceError("Failed to Send base64 encoded Google Email: "   encoded);

            // Save a status of error and then rethrow the original exception
            UpdateExperienceWithEmailStatus(experienceId, EmailErrorCodes.ErrorWhenSending);
            throw;
        }
    }
    else
    {
        // This is custom error code that means that the message was not sent because there was nothing to send
        response.ErrorCode = EmailErrorCodes.NotSentNoBody;
    }

    UpdateExperienceWithEmailStatus(experienceId, response.ErrorCode);

    return response;
}
  

Комментарии:

1. можете ли вы опубликовать какой-нибудь код?

2. Обновил мой пост кодом, используемым для отправки электронного письма