Как добавить UIImage в Листе MailComposer MFMailComposeViewController

Для запуска удерживается от использования ServletRequest.getRealPath (Строковый путь) . Соответствующая замена:

ServletContext context = session.getServletContext();
String realContextPath = context.getRealPath(request.getContextPath());

Однако документы API для ServletContext.getRealPath (Строковый путь) состояние:

"Этот метод возвраты null, если контейнер сервлета не может перевести виртуальный тракт в реальный путь ни по какой причине (такой как тогда, когда содержание делается доступным из архива .war)".

, Таким образом, API выполняет свой контракт! Однако не все потеряно, поскольку можно загрузить ресурс из ВОЙНЫ с помощью следующего метода, как определено в ServletContext:

ServletContext context = session.getServletContext();
InputStream is = context.getResourceAsStream("generate.xml");

53
задан nevan king 22 May 2013 в 01:00
поделиться

5 ответов

Вернемся снова с новым ответом. Тем не менее, я все еще оставляю свой предыдущий код, потому что я все еще не уверен, что нет способа его использовать. Я сам буду продолжать. Следующий код ДЕЙСТВИТЕЛЬНО работает. Мустафа предлагает кодировать изображения base64 и говорит, что они работают только от Apple до Apple, но на самом деле это не так. Кодировка Base64 теперь работает с большинством почтовых клиентов (раньше IE не поддерживал ее, но теперь она поддерживается для изображений до определенного размера, хотя я не уверен, какой именно размер). Проблема в том, что почтовые клиенты, такие как Gmail, будут вырезать данные ваших изображений, но для этого есть простой обходной путь ... просто поместите теги и вокруг вашего Тег - это все, что вам нужно сделать, чтобы не допустить его удаления. Чтобы добавить изображение в электронную почту, вам необходимо добавить в свой проект кодировщик base64.Их несколько (в основном C), но самый простой ObjC, который я нашел, был назван NSData + Base64 Мэттом Галлахером (я убрал "+" из имени после его копирования, потому что он давал мне проблемы). Скопируйте файлы .h и .m в свой проект и не забудьте # импортировать файл .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 работал отлично, и все источники, которые я нашел, говорят, что жирные теги - это все, что вам нужно для его работы. Надеюсь, это поможет всем!

64
ответ дан 7 November 2019 в 08:46
поделиться

Есть два способа сделать это, в зависимости от того, где хранятся изображения:

Если изображения находятся на сервере, просто добавьте теги HTML с исходным URL-адресом, установленным на удаленное изображение. Пользователь, просматривающий почтовое сообщение, видит изображение во время композиции, а получатель видит его, когда открывает сообщение (если только они не отключили загрузку изображения по умолчанию).

Если изображения находятся на телефоне, вы можете включить их как встроенные ' изображений. Для этого нужно сделать два шага. Сначала вам нужно прикрепить все изображения, которые вы хотите использовать в качестве вложений MIME, состоящих из нескольких частей, и им нужно будет назначить «идентификатор содержимого» (он же cid ), имя файла и Content- Диспозиция установлена ​​на встроенный . В теле сообщения HTML вы можете ссылаться на них следующим образом:

<img src="cid:{messageid}/image.png" alt="My image" />

Плохая новость в том, что стандартный механизм составления почты iPhone не позволяет добавлять эти дополнительные данные во вложения. Во-вторых, следует отметить письмо как имеющее «альтернативный» тип содержимого MIME. Еще раз, почтовый составитель не позволяет вам этого делать.

Чтобы решить эту проблему, нужно либо составить сообщение самостоятельно, а затем отправить его на почтовый сервер напрямую через SMTP, либо попросить прокси-сервер сделать это за вас через ретранслятор SMTP . Если вы решите пойти по этому пути, возможно, вы захотите проверить skpsmtpmessage в коде Google или такую ​​службу, как AuthSMTP .

Однако как только пользователь получит это сообщение, он увидит сообщение автономное HTML-сообщение со всеми встроенными изображениями прямо здесь. Но это сложно настроить. Первый метод (размещение изображений на сервере) намного проще.

Если вы решите пойти этим путем, возможно, вы захотите проверить skpsmtpmessage в коде Google или такую ​​службу, как AuthSMTP .

Однако как только пользователь получит это сообщение, он увидит сообщение автономное HTML-сообщение со всеми встроенными изображениями прямо здесь. Но это сложно настроить. Первый метод (размещение изображений на сервере) намного проще.

Если вы решите пойти по этому пути, возможно, вы захотите проверить skpsmtpmessage в коде Google или такую ​​службу, как AuthSMTP .

Однако как только пользователь получит это сообщение, он увидит сообщение автономное HTML-сообщение со всеми встроенными изображениями прямо здесь. Но это сложно настроить. Первый метод (размещение изображений на сервере) намного проще.

11
ответ дан 7 November 2019 в 08:46
поделиться

Может быть, это будет работать для вас:

Как встроить Uiimage в кузов сообщений Mail Composer

Вот что он говорит:

в основном вы преобразуете свое изображение в 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:someone@someplace.com?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
1
ответ дан 7 November 2019 в 08:46
поделиться

(К сожалению, следующий метод не работает, но я оставляю этот пост, потому что пример строки преобразования пути URL-адреса изображения действительно полезен в других случаях, когда вам нужны пути к файлам HTML в вашем коде. См. Мой пост на Base64Encoding для способ, который действительно работает.)

Я сам столкнулся с этой проблемой, и я нашел способ, который работает. Вы МОЖЕТЕ заставить изображения отображаться в строке, используя полный путь к файлу изображения.

Это требует небольшого преобразования с вашей стороны, но используйте обычные методы для получения каталогов вашего приложения (NSString * path = [[NSBundle mainBundle] resourcePath] и т. Д.) , затем преобразуйте строка в буквальный URL. Например, возвращенная выше строка «путь» будет содержать что-то вроде «/ Users / Me / Library / Application Support / iPhone Simulator / 3.2 / Applications / 25ADA98D-8DF4-4344-8B78-C18BC757EBDC / MyEmailingApplication.app» .

Вам нужно превратить эту строку в

" file: /// Users // Me // Library // Application% 20Support // iPhone% 20 Simulator // 3.2 // Applications // 25ADA98D-8DF4-4344-8B78-C18BC757EBDC // MyEmailingApplication.app // "

, а затем вы можете добавить имена файлов изображений в конец. (этот пример указывает на ресурсы приложения, но то же самое относится к каталогам tmp и documents).

Это преобразование строки можно выполнить с помощью комбинации [NSString stringWithFormat: @ "file: ///% @ //% @", path, myImageName]

после использования { {1}} [path stringByReplacingOccurencesOfString: @ "/" withString: @ "//"]

, чтобы исправить косую черту в "пути" и

{{1} }

[path stringByReplacingOccurencesOfString: @ "" withString: @ "% 20"]

, чтобы сделать пространства дружественными к HTML. Теперь вы можете использовать этот буквальный URL-адрес в HTML-кодированном теле письма, например img src = \ "", pathToMyImage, "\"

. Пример выглядит как много работы, но на самом деле, как только вы его настроите, это совсем не сложно, и работает как шарм :-) Удачи!

1
ответ дан 7 November 2019 в 08:46
поделиться

EDIT: То, что вы сейчас прочитаете, НЕ РАБОТАЕТ (пока)! Проверьте мой другой пост о Base64 Encoding your image, который ДОЛЖЕН работать.

Этот вариант выглядит просто отлично в окне составления письма, но фактически отправленное письмо не включает изображения (я только что проверил это на своем телефоне). Я ошибочно полагал, что почтовое приложение само закодирует изображения в base64 (оно делает это для вложенных изображений). И, хотя это хлопотно, вы можете заставить электронное письмо на iPhone вставлять несколько "обтекаемых" встроенных изображений, перейдя в папку изображений, скопировав изображение в буфер обмена, перейдя в электронное письмо и вставив его туда, куда вам нужно. Вы можете написать больше текста, сохранить письмо в черновике и повторить процесс с несколькими изображениями, вставленными в то же письмо. Отправьте письмо самому себе, а затем откройте его на компьютере с помощью Text Edit. Вы сможете увидеть точное форматирование, которое принимает письмо (включая изображения в кодировке 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's some text before the inline image</p><p><img src = \"",imagePath,@"\"></p><p>Here's 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];
}
-1
ответ дан 7 November 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: