Подтвердить что ты не робот

Встроенные изображения Base64 HTML, не отображаемые при отправке по почте

Я внедряю изображения, которые были закодированы в формате base64 в HTML следующим образом:

[html appendFormat:@"<html><body><p><b><img src=\"data:image/png;base64,%@\"></b></p></body><html>", base64ImageString];

Затем я создаю новое электронное письмо следующим образом:

MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
mailVC.mailComposeDelegate = self;
[mailVC setMessageBody:html isHTML:YES];
[self presentModalViewController:mailVC animated:YES];

Входящее изображение появляется в новом электронном письме до его отправки, но не отображается в любом почтовом клиенте, которому отправляется почта. Я думаю, что тот факт, что изображение правильно отображается в черновике, показывает, что процесс внедрения успешный, но я не понимаю, почему он не отображается при доставке. Глядя на необработанный HTML-код в поставленных почтовых шоу: src= "cid: (null)" Любая помощь будет оценена пожалуйста!

4b9b3361

Ответ 1

Я наткнулся на эту же проблему, и решение было довольно запутанным. Можно вставить изображение в электронное письмо. Проблема в том, что по какой-то странной причине кодированное изображение base64 не должно содержать новых строк (это супер странно! Я знаю). Я предполагаю, что вы используете NSData + Base64 от Matt Gallagher? И я! Эта категория создает многострочную строку base64. Код в категории

- (NSString *)base64EncodedString
{
    size_t outputLength;
    char *outputBuffer =
        NewBase64Encode([self bytes], [self length], true, &outputLength);

    NSString *result =
        [[NSString alloc]
            initWithBytes:outputBuffer
            length:outputLength
            encoding:NSASCIIStringEncoding];
    free(outputBuffer);
    return result;
}

Заменив третий параметр NewBase64Encode на false, вы получите строку строки base64, и это сработало для меня. Я закончил создание новой функции (просто чтобы не сломать ничего!) В категории.

- (NSString *)base64EncodedStringSingleLine
{
    size_t outputLength;
    char *outputBuffer =
    NewBase64Encode([self bytes], [self length], false, &outputLength);

    NSString *result =
    [[NSString alloc]
     initWithBytes:outputBuffer
     length:outputLength
     encoding:NSASCIIStringEncoding];
    free(outputBuffer);
    return result;
}

Использование этой функции для кодирования UIImage NSData отлично работает. Клиенты электронной почты, которые я тестировал до сих пор, показывают встроенное изображение. Надеюсь, это сработает для вас!

Изменить: Как указано в комментариях, это решение является лишь частичным. Изображение будет прикреплено как URI данных в письме. Однако не все почтовые клиенты будут отображать встроенное изображение.