#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. Обновил мой пост кодом, используемым для отправки электронного письма