IT이야기

MFMailComposeViewController의 MailComposer 시트에 UIImage를 추가하는 방법

cyworld 2021. 10. 10. 13:58
반응형

MFMailComposeViewController의 MailComposer 시트에 UIImage를 추가하는 방법


UIImage의 작성 시트 안에 s 를 삽입하고 싶습니다 MFMailComposerViewController.

첨부하고 싶지는 않지만 이메일 본문의 일부가 될 HTML 코드를 사용하여 테이블에 배치하고 싶습니다.


새로운 답변으로 다시 돌아왔습니다. 나는 여전히 이전 코드를 그대로 두고 있습니다. 왜냐하면 여전히 그것을 사용할 방법이 없다는 확신이 없기 때문입니다. 내가 직접 해보겠습니다. 다음 코드가 작동합니다. Mustafa는 이미지 인코딩을 base64로 제안하고 Apple에서 Apple로만 작동한다고 말하지만 실제로는 그렇지 않습니다. Base64 인코딩은 현재 대부분의 메일 클라이언트에서 작동합니다(IE에서는 이전에는 지원하지 않았지만 이제는 특정 크기까지의 이미지에 대해 지원되지만 크기가 정확히 얼마인지는 확실하지 않음). 문제는 이미지 데이터를 제거 할 Gmail과 같은 그 메일 클라이언트이지만, 간단한 해결 방법은 퍼팅 ... 그것을 위해 거기 <b> and </b>주위에 태그를 당신의<img ...>태그가 제거되지 않도록 하려면 태그만 있으면 됩니다. 이메일에 이미지를 가져오려면 프로젝트에 base64 인코더를 가져와야 합니다. 몇 가지가 있지만(대부분 C), 내가 찾은 가장 간단한 ObjC는 Matt Gallagher의 NSData+Base64 라고 불렸습니다 (복사한 후 이름에서 "+"를 빼면 문제가 발생했습니다). .h 및 .m 파일을 프로젝트에 복사하고 사용할 .h 파일을 #import해야 합니다. 그런 다음 이와 같은 코드는 이메일 본문에 이미지를 가져옵니다...

- (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는 완벽하게 작동했으며 내가 찾은 모든 출처에서는 볼드 태그만 있으면 작동할 수 있다고 말합니다. 이것이 모두에게 도움이 되기를 바랍니다!


이미지가 저장된 위치에 따라 두 가지 방법이 있습니다.

이미지가 서버에 있는 <img>경우 소스 URL이 원격 이미지로 설정된 HTML 태그를 포함 하기만 하면 됩니다. 메일 메시지를 미리 보는 사용자는 작성하는 동안 이미지가 표시되고 수신자는 메시지를 열 때 이를 볼 수 있습니다(기본 이미지 로드를 비활성화하지 않은 경우).

이미지가 전화에 있는 경우 '인라인' 이미지로 포함할 수 있습니다. 여기에는 두 가지 단계가 있습니다. 먼저 다중 부분 MIME 첨부 파일로 사용하려는 모든 이미지를 첨부해야 하며 '콘텐츠 ID'(일명 cid), 파일 이름을 할당 하고 로 Content-Disposition설정해야 inline합니다. HTML 메시지 본문 내에서 다음과 같이 참조할 수 있습니다.

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

나쁜 소식은 표준 iPhone 메일 작성기 메커니즘이 이 추가 데이터를 첨부 파일에 추가하는 것을 허용하지 않는다는 것입니다. 두 번째는 이메일을 "대체" MIME 콘텐츠 유형으로 표시하는 것입니다. 다시 말하지만, 메일 작성기는 그렇게 하도록 허용하지 않습니다.

이 문제를 해결하는 방법은 메시지를 직접 작성한 다음 SMTP를 통해 직접 메일 서버로 보내거나 서버 프록시가 SMTP 릴레이를 통해 이를 수행하도록 하는 것입니다. 이 방법을 사용하기로 결정했다면 Google 코드 또는 AuthSMTP 와 같은 서비스 에서 skpsmtpmessage 를 확인하는 것이 좋습니다 .

그러나 사용자가 이 메시지를 받으면 모든 인라인 이미지가 포함된 자체 포함된 HTML 메시지가 표시됩니다. 그러나 설정하는 데 많은 번거 로움이 있습니다. 첫 번째 방법(서버에 이미지를 저장하는 것)은 훨씬 더 쉬운 방법입니다.


iOS 3.0 이상의 경우 다음을 참조하십시오. 이메일에 이미지를 첨부하시겠습니까?

예시:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];

아마도 이것이 당신을 위해 일할 것입니다 :

Mail Composer 메시지 본문에 UIImage를 포함하는 방법

내용은 다음과 같습니다.

기본적으로 이미지를 base64(아래 첨부된 base64는 메시지 길이 제한으로 인해 짧아야 하므로 유효한 이미지가 아님) 문자열로 변환하고 이미지 태그에 삽입합니다. 포함된 이미지는 iPhone에서 다른 iPhone으로만 볼 수 있기 때문에 이 작업을 중단한 것으로 기억합니다. 소스 데이터를 볼 때 운이 없는 Outlook 클라이언트가 이미지를 표시하지 않는 Gmail로 테스트한 것을 기억합니다. 있다. 따라서 스팸 필터 문제는 그다지 중요하지 않지만 이메일 클라이언트는 더 똑똑합니다. 내가 이것을 조사하는 동안 실제로 이것이 스팸 필터를 통과하도록 이미지 전용 정보가 포함된 이메일을 날려 버리는 스패머의 수라는 것을 발견했습니다. 젠장, 스패머 여러분, 좋은 목적으로 사용하려고 했지만 대부분의 메일 클라이언트가 이미지를 표시하지 않는다는 것을 알았을 때 거의 쓸모가 없었습니다. 무엇 때문에'

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];

(불행히도 다음 방법은 작동하지 않지만 이미지 URL 경로 변환 문자열 예제는 코드에 HTML 파일 경로가 필요한 다른 경우에 정말 유용하기 때문에 이 게시물을 남깁니다. 작동합니다.)

나는이 문제에 직접 부딪쳤고 작동하는 방법을 찾았습니다. 이미지에 대한 전체 파일 경로를 사용하여 이미지를 인라인으로 표시할 수 있습니다.

약간의 변환이 필요하지만 앱의 디렉터리를 가져오는 일반적인 방법을 사용한 (NSString *path = [[NSBundle mainBundle] resourcePath], etc...)다음 문자열을 리터럴 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 및 문서 디렉터리에도 동일하게 적용됩니다).

다음 조합으로 이 문자열 변환을 수행할 수 있습니다. [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

사용 후 [path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

"경로"에서 슬래시를 수정하고

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

공간을 HTML 친화적으로 만듭니다. 이제 img src=\"",pathToMyImage,"\" 와 같이 HTML로 인코딩된 이메일 본문에서 이 리터럴 URL을 사용할 수 있습니다.

이 예제는 많은 작업처럼 보이지만 실제로 설정을 하고 나면 전혀 어렵지 않고 매력처럼 작동합니다 :-) 행운을 빕니다!


나는 노력 마이크의 대답은 내부 완벽하게 작동 MFMailComposerViewController하지만, 불행히도 이메일 클라이언트의 대부분. UIImage가 포함된 이메일 콘텐츠 를 보내야 하기 때문에 다음 과 같은 작업을 수행했습니다.

  1. 나는 Mike의 답변 코드를 유지하여 HTML 페이지를 생성했습니다.UIImage
  2. 나는 UIWebView이 페이지를 발표하기 위해 만들었습니다.[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. 중요: 사용자를 위한 미리보기 페이지UIViewController이것을 표시합니다.
  4. 그런 다음 AnderCover의 방법UIWebView 덕분에 이것 에서 PDF를 생성합니다.
  5. 마지막으로 생성된 PDF를 이메일에 첨부 파일로 추가합니다. [mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

좋아요, 저를 비난하지 마세요. 이미지를 추가하기 위한 많은 전환과 작업이라는 것을 압니다. 그러나 HTML 이메일 구조는 이미지가 포함된 상태로 그대로 유지 되며 최종 사용자는 보기 좋은 첨부 파일을 하나만 받게 됩니다 .
"더러운" 부분은 PDF 콘텐츠가 실제로 webview의 스크린샷이라는 것입니다...실제로 재사용할 수 없습니다.


편집: 당신이 읽으려고 하는 것은 (아직) 작동하지 않습니다! 작동하는 Base64 인코딩 이미지에 대한 내 다른 게시물을 확인하십시오.

이것은 이메일 작성 창에서 잘 보이지만 실제 보낸 이메일에는 사진이 포함되어 있지 않습니다(방금 휴대폰에서 테스트했습니다). 메일 앱이 이미지 자체를 base64로 인코딩할 것이라고 잘못 생각했습니다(첨부된 이미지에 대해 그렇게 함). 그리고 고통스럽긴 하지만 이미지 폴더로 이동하고 이미지를 클립보드에 복사하고 이메일로 이동하여 원하는 위치에 붙여넣으면 iPhone에서 이메일을 통해 여러 "흐름" 인라인 이미지를 삽입할 수 있습니다. 더 많은 텍스트를 작성하고 이메일을 초안으로 저장하고 동일한 이메일에 더 많은 이미지를 붙여넣는 과정을 반복할 수 있습니다. 자신에게 이메일을 보낸 다음 텍스트 편집을 사용하여 컴퓨터에서 엽니다. 이메일이 사용하는 형식(base64로 인코딩된 이미지 포함)을 정확히 볼 수 있습니다.

아래 내 코드에서 이상하게도 텍스트는 이메일로 들어가지만 이미지는 완전히 사라집니다. 이것은 외부 서버의 이미지에 연결하는 것이 작동하는지 의심하게 만듭니다. 이 작업을 계속할 것입니다... 내 프로그램 외부의 메일 앱에서 이메일을 실행하면 다르게 작동할지 궁금합니다. 나는 더 많은 것을 알아내는 대로 이것을 업데이트하기 위해 계속 돌아올 것입니다... 애플이 만드는 것보다 이것이 더 쉬울 것 같습니다 :-/

이 코드는 "Documents" 디렉토리에 저장할 이미지 파일용으로 작성되었습니다(따라서 앱은 거기에 저장된 이미지와 해당 이미지를 참조하는 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. 이미지 태그 제거
  2. 제거된 이미지 태그를 가져 와서 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:&gt] ;


    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]];

ReferenceURL : https://stackoverflow.com/questions/1527351/how-to-add-a-uiimage-in-mailcomposer-sheet-of-mfmailcomposeviewcontroller

반응형