Встроенные изображения HTML Base64 не отображаются при отправке по почте - PullRequest
11 голосов
/ 12 января 2012

Я встраиваю изображения, которые были закодированы в формате 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)" Любая помощь будет оценена, пожалуйста!

1 Ответ

14 голосов
/ 07 мая 2012

Я наткнулся на эту же проблему, и решение было довольно запутанным.Можно вставить изображение в электронное письмо.Проблема в том, что по какой-то странной причине изображение в кодировке base64 не должно содержать новых строк (супер странно! Я знаю).Я предполагаю, что вы используете NSData + Base64 Мэтта Галлахера?И я!Эта категория создает многострочную строку 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;
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...