Как добавить UIImage в лист MailComposer MFMailComposeViewController
Я хочу вставить UIImage
внутри листа компоновки MFMailComposerViewController
.
Обратите внимание: я не хочу их прикреплять, но я хочу поместить их в таблицу, используя HTML-код, который будет частью тела электронной почты.
Ответы
Ответ 1
Вернемся снова с новым ответом. Я все еще оставляю свой предыдущий код, потому что я все еще не уверен, что нет способа его использовать. Я буду держать это сам. Следующий код работает. Мустафа предлагает base64 кодировать изображения и говорит, что они работают только с Apple Apple, но это на самом деле не так. Кодирование Base64 работает с большинством почтовых клиентов (IE ранее не поддерживал его, но теперь он поддерживается для изображений размером до определенного размера, хотя я точно не знаю, что это за размер). Проблема заключается в том, что почтовые клиенты, такие как Gmail, лишали бы ваши данные изображения, но там было просто обходное решение... просто положить теги <b> and </b>
вокруг вашего тега <img ...>
- это все, что вам нужно сделать, чтобы оно не удалялось, Чтобы получить изображение в вашем письме, вам нужно получить кодер base64 в свой проект. Есть несколько из них (в основном C хотя), но самый простой ObjC, который я нашел, назывался NSData + Base64 by Matt Gallagher (я взял "+" из имени после его копирования, потому что он дал мне проблемы). Скопируйте файлы .h и .m в свой проект и убедитесь, что #import.h файл, где вы планируете его использовать. Тогда код, подобный этому, получит изображение в ваш почтовый ящик...
- (void)createEmail {
//Create a string with HTML formatting for the email body
NSMutableString *emailBody = [[[NSMutableString alloc] initWithString:@"<html><body>"] retain];
//Add some text to it however you want
[emailBody appendString:@"<p>Some email body text can go here</p>"];
//Pick an image to insert
//This example would come from the main bundle, but your source can be elsewhere
UIImage *emailImage = [UIImage imageNamed:@"myImageName.png"];
//Convert the image into data
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(emailImage)];
//Create a base64 string representation of the data using NSData+Base64
NSString *base64String = [imageData base64EncodedString];
//Add the encoded string to the emailBody string
//Don't forget the "<b>" tags are required, the "<p>" tags are optional
[emailBody appendString:[NSString stringWithFormat:@"<p><b><img src='data:image/png;base64,%@'></b></p>",base64String]];
//You could repeat here with more text or images, otherwise
//close the HTML formatting
[emailBody appendString:@"</body></html>"];
NSLog(@"%@",emailBody);
//Create the mail composer window
MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];
emailDialog.mailComposeDelegate = self;
[emailDialog setSubject:@"My Inline Image Document"];
[emailDialog setMessageBody:emailBody isHTML:YES];
[self presentModalViewController:emailDialog animated:YES];
[emailDialog release];
[emailBody release];
}
Я протестировал это на iPhone и отправил прекрасные изображения встроенных писем себе на Yahoo, мой личный сайт и мой MobileMe. У меня нет учетной записи Gmail, но Yahoo работает отлично, и каждый найденный источник говорит, что жирным тегам все, что вам нужно, чтобы заставить его работать. Надеюсь, это поможет всем!
Ответ 2
Есть два способа сделать это, в зависимости от того, где хранятся изображения:
Если изображения отсутствуют на сервере, просто включите теги HTML <img>
с исходным URL, установленным на удаленное изображение. Пользователь, просматривающий почтовое сообщение, отображает изображение во время композиции, и получатель видит его, когда они открывают сообщение (если только они не отключили загрузку по умолчанию).
Если изображения находятся на телефоне, вы можете включить их в качестве "встроенных" изображений. Для этого есть два шага. Сначала вам нужно прикрепить все изображения, которые вы хотите использовать в качестве многочастных вложений MIME, и им нужно будет присвоить "ID контента" (aka cid
), имя файла и Content-Disposition
, установленное на inline
. Внутри вашего тела сообщения HTML вы можете ссылаться на них так:
<img src="cid:{messageid}/image.png" alt="My image" />
Плохая новость заключается в том, что стандартный механизм компоновщика iPhone не позволяет добавлять эти дополнительные данные в приложения. Во-вторых, отметьте сообщение как имеющее "альтернативный" тип содержимого MIME. Опять же, почтовый композитор не позволяет вам это делать.
Как это сделать, либо самостоятельно составить сообщение, либо отправить его на почтовый сервер напрямую через SMTP, либо прокси-сервер сделать это для вас через SMTP-реле. Если вы решите пойти таким путем, вы можете проверить skpsmtpmessage в коде Google или услуге, например AuthSMTP.
Однако, как только пользователь получает это сообщение, они видят автономное сообщение HTML со всеми встроенными изображениями прямо там. Но для этого нужно много хлопот. Первый способ (размещение изображений на сервере) намного проще.
Ответ 3
Для iOS 3.0 и более поздних версий см. это: Прикрепление изображения к письму?
Пример:
UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
Ответ 4
Возможно, это сработает для вас:
Как вставить UIImage в тело сообщения почтового композитора
Вот что он говорит:
В принципе, вы конвертируете свое изображение в base64 (приложенный ниже base64 должен быть сокращен из-за ограничения длины сообщения, так что это не допустимое изображение) и вставлять в тег изображения. Я помню, что я перестаю работать над этим, потому что встроенные изображения можно просматривать только с iPhone на другой iPhone, я помню, как тестировал его с помощью Gmail, наша работа Outlook-клиент без везения отображает изображение, когда я просматриваю исходные данные здесь. Поэтому я не думаю, что это проблема спам-фильтра, но клиенты электронной почты просто умнее. В то время как я изучал это, я фактически обнаружил, что это то, как многие спамеры могут взорвать электронные письма с информацией только об изображении, поэтому он передает фильтр спама. Проклятые спамеры, я собирался использовать его по доброй причине, но так как это было почти бесполезно, когда я узнал, что большинство почтовых клиентов не отображает изображение. Для чего это стоит, вот код.
NSString *eMailBody = @"<html>Just convert your image file to base64 to embed into the email<img src="data:image/gif;base64,R0lGODlhFAFuAPcAAPf39//7/+fn59bT1u/r787Lzq0UAN7b3hhFrRhJtRA0hBA8lMYYALWytffz94wQAMa+vb26vRhNxufj5+/v78bDxvfz772+vcbHxghRCM7PzggkYyFZ1tYkCNbX1hhRzpyenO+6AN7f3gBlANauAGOW7zFl1kp95wg8pbW2tZyanHOi797f5zlx3msMAAB9CP/PAL22va2mraWipedJMSlRtf91Y72WAFqK76WmpRBFta2qrcaeAK2urfdpUuc8If39/e9ZQmPTY94wGFrLWrUkEISq9/n5+ZR5ABCWGLWOAIRpAGNRAClJlK2GAL0sGGssITG2OaWCAK3H9848KaW+762qpcbX/73jvWN5pGvTc/eGc//vCFppfIwgEJRBMYSGlPeWhJSSjHN5jMaSjKWmrb3P787V1ilBa4R9c9nXy+rq6ntNQu/y95Su3svO1kphlISa1t7b1vf7/3uGraWGexdAmoySlDm6QrWyraWqrRiiIWtpa0LDStrl/1JtrcbHzpxlWntlUklVcztZk3vbhISStfffWufr786upVmB1ta2taW21tLS0ve6rd7j5zlhtfemnJSetefn78LCw7W2vdnZ2bVFMf/3//f3/8Z1a9bb59bb3eHh4a2WjM7HxoR1OSGqKbW6xvT09JyGQrXD3v/r5+fk3s7rzufb3q2ytffXKbWiY6inp1p1WrWmjP/LxnOOzsC/v+/n56qSMffXzr2eEP/3hPHx8f//987T57m4ubVZShk5f97LjO/HKQ03ks7DpdZlWv/vMd7LxqWuvefr/86uKd66QgwyhcnJyf/ztbKxsrWqpe/37//z7///75zTpf/397Szsvfn1ozLjO/jlN7v3qWko62OEO/r5//73tbX3vf37wotd1qqYxlNvYyujN7X1qKgoHuWe5KUmkKOQhZKvildMRh5IZqZmcXEwZ2amaajoNfU0QMaTAsiV5STlSo+bZibpSti2puZl5u28pGs5pqbn9Hd8/fr94WFi7i1sBguYfP09v///ywAAAAAFAFuAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iDYinEtJAWLUSIfJv6DVFShnOMXTEzpYrXKlPMXDGW6apZhli0CHmqtk+oJC9ejDDH6azBTGaMKDLBQUKCvzoC/5XAwcSJElV0UbB71lk0PFH6CGmqxS3cuZgyAwhw1tiUEiY+CEZBunTpwR9SfyisiNGmzYyNYqlWLZrtak6JRLmcoQKBCQQswEZ6ZcUJDn0RoFiwoAkhOH/+wCHURDkKHRIII0e+uoWbSbGRYv/SFy0qnj1yM6ArUEDDAQEOOBu9UqIF3xrMCWWRBGiAnP8eqKEBBpVIkgUhyg22nWocxKJLeEMBYIEAqVSD"></html>";
NSString *encodedBody = [eMailBody stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = [NSString stringWithFormat:@"mailto:[email protected]?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
Ответ 5
(К сожалению, следующий метод не работает, но я оставляю это сообщение, потому что пример строки преобразования URL-адреса изображения действительно полезен для других случаев, когда вам нужны пути HTML файла в вашем коде. См. мой пост в Base64Encoding для способ, который работает.)
Я столкнулся с этим вопросом сам, и нашел способ, который работает. Вы можете заставить изображения появляться в строке, используя полный путь к изображению.
Требуется небольшое преобразование с вашей стороны, но используйте обычные методы для получения каталогов приложений (NSString *path = [[NSBundle mainBundle] resourcePath], etc...)
, а затем преобразуйте строку в литеральный URL. Например, строка "path", вернувшаяся выше, будет содержать что-то вроде "/Users/Me/Library/Application Support/iPhone Simulator/3.2/Applications/25ADA98D-8DF4-4344-8B78-C18BC757EBDC/MyEmailingApplication.app" .
Вам понадобится сделать эту строку в
" файл:///Пользователи//Me//Library//Application %20Support//iPhone %20 Simulator//3.2//Приложения//25ADA98D-8DF4-4344-8B78-C18BC757EBDC//MyEmailingApplication.app//"
а затем вы можете добавить свои имена файлов изображений до конца. (этот пример указывает на ресурсы приложения, но то же самое относится к каталогам tmp и документов).
Вы можете преобразовать эту строку с помощью комбинации
[NSString stringWithFormat:@"file:///%@//%@",path,myImageName]
после использования
[path stringByReplacingOccurencesOfString:@"/" withString:@"//"]
чтобы исправить перекосы в "пути" и
[path stringByReplacingOccurencesOfString:@" " withString:@"%20"]
чтобы сделать пространства HTML дружественными. Теперь вы можете использовать этот литеральный URL в своем HTML-закодированном теле письма, например img src=\ ", pathToMyImage," \"
Пример выглядит как много работы, но на самом деле, как только вы его настроите, это совсем не сложно, и он работает как шарм:-) Удачи!
Ответ 6
Я попробовал ответ Майка работает отлично внутри MFMailComposerViewController
, но, к сожалению, не с большинством клиентов электронной почты.
Поскольку мне действительно нужно отправить некоторый контент электронной почты с внедренным UIImage, вот что я сделал:
- Я сохранил код Майк для создания моей страницы HTML с помощью
UIImage
- Я создал
UIWebView
, представляя эту страницу, [yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
- ВАЖНО: я показываю это в
UIViewController
как страницу предварительного просмотра для пользователя
- Затем я создаю PDF из этого
UIWebView
, благодаря методу AnderCover
- Наконец, я добавляю созданный PDF в качестве прикрепления к электронной почте с помощью
[mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]
Хорошо, не обвиняйте меня, я знаю, что для добавления нескольких изображений достаточно много конверсий и действий, но ваша структура электронной почты HTML остается той же с встроенными изображениями, а конечный пользователь получит только одно красивое прикрепление.
"Грязная" часть заключается в том, что содержимое PDF на самом деле является скриншотами веб-представления... Нельзя использовать повторно.
Ответ 7
EDIT: Что вы собираетесь читать, НЕ работает (пока)! Проверьте мой другой пост на Base64. Кодирование вашего изображения, которое работает.
В окне компоновки электронной почты это выглядит очень хорошо, но фактическое отправленное письмо не включает фотографии (я просто протестировал его на своем телефоне). Я ошибочно думал, что почтовое приложение будет base64 кодировать сами изображения (это делается для прикрепленных изображений). И, хотя это боль, вы можете получить электронное письмо на iPhone, чтобы вставить несколько "проторенных" встроенных изображений, перейдя в папку с изображениями, скопировав изображение в буфер обмена, перейдя по электронной почте и вставив его туда, где вы хотите. Вы можете написать больше текста, сохранить электронную почту в виде черновика и повторить процесс с большим количеством изображений, вставленных в тот же адрес электронной почты. Отправьте электронное письмо себе, затем откройте его на своем компьютере с помощью текстового редактора. Вы сможете точно определить форматирование, которое принимает электронное письмо (включая изображения с кодировкой base64).
Что странно происходит с моим кодом ниже, так это то, что текст превращает его в электронную почту, но изображения просто исчезают полностью (даже не свисающая "сломанная" ссылка на них: -/). Это заставляет меня сомневаться, что работа с изображениями на внешнем сервере будет работать. Я собираюсь продолжить работу над этим... Мне интересно, будет ли он вести себя по-другому, если у меня есть запуск электронной почты в почтовом приложении за пределами моей программы. Я буду продолжать возвращаться, чтобы обновить это, поскольку я больше разбираюсь... кажется, что это должно быть проще, чем Apple делает это: -/
Этот код написан для файлов изображений, которые вы сохранили в вашем каталоге "Документы" (поэтому ваше приложение должно было бы создавать образы, которые там хранятся, и HTML-код, который ссылается на эти изображения. Для изображений, которые вы сохранили в комплекте приложений используйте [[NSBundle mainBundle] resourcePath] для исходного пути к изображениям).
- (void)createEmailWithInlineImages {
//get app Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
//make spaces HTML friendly
documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
//make forward-slash into double-forward-slash for HTML file-URL comapatibility
documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
//get the name for your image into the string however your app works
//create a string formatted like a literal HTML URL to the image, e.g.
//file:///myiPhoneFileSystemPath//MyApplication//MyApplicationDirectories//Documents//imageName.jpg
NSString *myHTMLImageName = @"myHTMLImage.jpg";
NSString *imagePath = [NSString stringWithFormat:@"file:///%@//%@",documentsPath,myHTMLImageName];
//this string is an example of your email body text with HTML formatting
NSString *emailText = [NSString stringWithFormat:@"%@%@%@",@"<html><head><title>My Inline Image Example Email</title></head><body><p>Here some text before the inline image</p><p><img src = \"",imagePath,@"\"></p><p>Here some text for after the inline image. You could add more inline images and text after this with the same kind of formatting.</p></body></html>"];
//create email
MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];
emailDialog.mailComposeDelegate = self;
[emailDialog setSubject:@"My Inline Image Email Document"];
[emailDialog setMessageBody:emailText isHTML:YES];
[self presentModalViewController:emailDialog animated:YES];
[emailDialog release];
}
Ответ 8
- удалить тег изображения
- просто удалите тег и изображение с изображением, используя представление uimage
Я пробовал приведенные выше примеры, но они не работают. Ниже вы найдете пример кода, который работает на 100%. Но вам нужно проверить URL-адрес тега изображения.
//remove the img tag
NSScanner *theScanner;
NSString *gt =nil;
theScanner = [NSScanner scannerWithString:emailBody];
while ([theScanner isAtEnd] == NO) {
// find start of tag
[theScanner scanUpToString:@"<img" intoString:NULL] ;
// find end of tag
[theScanner scanUpToString:@">" intoString:>] ;
emailBody = [emailBody stringByReplacingOccurrencesOfString:[ NSString stringWithFormat:@"%@>", gt] withString:@""];
NSString *tt=[ NSString stringWithFormat:@"%@>", gt];
NSLog(@"*********************%@",tt);
st=tt;
NSLog(@"*********************%@",st);
}
st =[st stringByReplacingOccurrencesOfString:@"<img src=\"" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@"\"/>" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@".png" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@"\"align=\"left" withString:@""];
//"align="left
NSLog(@"*********************%@",st);
NSString *path1 = [[NSBundle mainBundle] pathForResource:[ NSString stringWithFormat:@"%@", st] ofType:@"png"];
NSData *myData1 = [NSData dataWithContentsOfFile:path1];
[picker addAttachmentData:myData1 mimeType:@"image/png" fileName:[ NSString stringWithFormat:@"%@", st]];