Отправка электронной почты в формате HTML с тегом IMG из приложения iPhone с помощью класса MFMailComposeViewController - PullRequest
1 голос
/ 20 июля 2010

Я использую класс MFMailComposeViewController для отправки отформатированного электронного письма в формате HTML из моего приложения для iPhone. Мне нужно добавить изображение в электронное письмо, и я добавил тег IMG к своему телу электронной почты

- (IBAction)shareWithOther
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"My Message Subject"];

    NSString *emailBody = @"<h3>Some and follow by an image</h3><img src=\"SG10002_1.jpg\"/>and then more text.";
    [picker setMessageBody:emailBody isHTML:YES];

    [self presentModalViewController:picker animated:YES];
    [picker release];
}

файл изображения "SG10002_1.jpg" был добавлен в мою папку ресурсов, но изображение не отображалось в теле сообщения (отображается только как [?]). Может кто-нибудь сказать мне, что я делаю неправильно, если путь изображения неправильный или есть лучший способ сделать это?

Большое спасибо.

Ответы [ 4 ]

12 голосов
/ 20 июля 2010

Я твердо верю (из вашего вопроса), что ваше изображение SG10002_1.jpg находится в основном комплекте.
Если это так, то приведенный ниже код должен работать для вас.Это полный взлом из этого вопроса.

- (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];
}
3 голосов
/ 20 июля 2010

Вы не можете использовать изображения с относительными путями, такими как этот, в почте, потому что он попытается найти файл в почтовом клиенте получателя.

Вы можете встроить изображение, используя закодированный объект base64 (Googlehtml image base64) или загрузите изображение на общедоступный веб-сервер и укажите абсолютный URL-адрес изображения из вашей почты, чтобы почтовый клиент получателя всегда мог получить к нему доступ.

1 голос
/ 20 июля 2010

Добавить в качестве изображения / вложения в формате JPEG.Он появится внизу вашего сообщения, но над подписью.

Есть много других возможных способов, но все они немного дерьмовы.

0 голосов
/ 20 июля 2010

Вот код, который работал для меня,

Класс mailClass = (NSClassFromString (@ "MFMailComposeViewController"));

        if (mailClass != nil)
        {

            // We must always check whether the current device is configured for sending emails


            UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();
            MFMailComposeViewController *composeVC = [[MFMailComposeViewController alloc] init];
            composeVC.mailComposeDelegate = self;
            [composeVC setSubject:@"test"];
            NSString *messageBody = @"";
            [composeVC setMessageBody:messageBody isHTML:NO];
            UIImage *artworkImage = viewImage;
            NSData *artworkJPEGRepresentation = nil;
            if (artworkImage)
            {
                artworkJPEGRepresentation = UIImageJPEGRepresentation(artworkImage, 0.7);
            }
            if (artworkJPEGRepresentation) 
            {
                [composeVC addAttachmentData:artworkJPEGRepresentation mimeType:@"image/jpeg" fileName:@"Quote.jpg"];
            }

            NSString *emailBody = @"Find out more  App at <a href='http://itunes.apple.com/us/artist/test/id319692005' target='_self'>Test</a>";//add code
            const char *urtfstring = [emailBody UTF8String];
            NSData *HtmlData = [NSData dataWithBytes:urtfstring length:strlen(urtfstring)];
            [composeVC addAttachmentData:HtmlData mimeType:@"text/html" fileName:@""];
            //Add code
            [self presentModalViewController:composeVC animated:YES];
            [composeVC release];
            [self dismissModalViewControllerAnimated:YES];
            UIGraphicsEndImageContext();
...