iOS:GMail API-使用电子邮件发送附件 [英] iOS :GMail API - Send Attachments with email

查看:67
本文介绍了iOS:GMail API-使用电子邮件发送附件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够成功发送没有附件的电子邮件. 但是,当我尝试使用GTLUploadParamaters上传附件时,出现了501错误.

I am able to successfully able to send emails without attachments. However, when I try to upload attachments using GTLUploadParamaters, I am getting a 501 error.

我尝试从照片库添加附件的NSData,以及仅发送图像的URL.

I have tried adding the NSData of an attachment from the Photo Library, as well as just sending the URL of an image.

在两种情况下,我都遇到相同的错误.

In both cases I got the same error.

// Create the message
GTLGmailMessage *message = [[GTLGmailMessage alloc]init];
message.raw = [self getFormattedRawMessageForMail:mail];

if(!self.gmailService) {
    self.gmailService = [Utilities initializeGmailService];
}
// Get the data of the image present in the photo library
GTLUploadParameters *image = [GTLUploadParameters uploadParametersWithData:[Singleton sharedInstance].dataImage MIMEType:@"image/jpeg"];

GTLQueryGmail *query = [GTLQueryGmail queryForUsersMessagesSendWithUploadParameters:image];
query.userId = [ORBSingleton sharedInstance].userProfile.email;
query.message = message;

[self.gmailService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLGmailMessage *mail, NSError *error) {
    if(!error){
        handler(YES, error);
    }
    else{
        handler(NO, error);
    }
}];

我错过了什么吗?任何帮助将不胜感激.

Am I missing something? Any help will be appreciated.

推荐答案

添加附件以允许发送最大大小为35 mb的邮件时,我没有使用GTLGmailMessage.

When adding attachments that would allow the mail to be sent with a maximum size of 35 mb, I did not use GTLGmailMessage.

在下面的解决方案中使用了 rfc822 ,而不是 base64 编码(您当前的解决方案).

Instead of base64 encoding (your current solution), rfc822 is used in the solution below.

// Create the param
GTLUploadParameters *uploadParam = [[GTLUploadParameters alloc] init];
uploadParam.MIMEType = @"message/rfc822";
uploadParam.data = [self getFormattedRawMessageForMail:mail filenames:arrFilenames];

// Create the query
GTLQueryGmail *query = [GTLQueryGmail queryForUsersMessagesSendWithUploadParameters:uploadParam];
query.userId = @"me";

// Execute query
[self.gmailService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLGmailMessage *mail, NSError *error) {

}];

getFormattedRawMessageForMail:文件名方法

- (NSData *)getFormattedRawMessageForMail:(ORBEmail *)mail filenames:(NSMutableArray *)arrFilenames{

    // Date string
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss Z";
    NSString *strDate = [dateFormatter stringFromDate:[NSDate date]];
    NSString *finalDate = [NSString stringWithFormat:@"Date: %@\r\n", strDate];

    // From string
    NSString *from = @"From: <sampleFrom@gmail.com>\r\n";

    // To string
    NSString *to = @"To: <sampleTo@gmail.com>\r\n",

    // CC string
    NSString *cc = @"";
    if(mail.cc.length > 0) {
      cc = [self getFormattedStringForFieldName:SEND_MAIL_CC ForAllReceivers:mail.cc];
    }

    // BCC string
    NSString *bcc = @"";
    if(mail.bcc.length > 0) {
        bcc = [self getFormattedStringForFieldName:SEND_MAIL_BCC ForAllReceivers:mail.bcc];
    }

    // Subject string
    NSString *subject = @"Subject: Sample Subject\r\n\r\n";

    // Body string
    NSString *body = @"Sample body\r\n";

    // Final string to be returned
    NSString *rawMessage = @"";

    // Depending on whether the email has attachments, the email can either be sent as "text/plain" or "multipart/mixed"
    if (arrFilenames.count > 0) {

        // Send as "multipart/mixed"
        NSString *contentTypeMain = @"Content-Type: multipart/mixed; boundary=\"project\"\r\n";

        // Reusable Boundary string
        NSString *boundary = @"\r\n--project\r\n";

        // Body string
        NSString *contentTypePlain = @"Content-Type: text/plain; charset=\"UTF-8\"\r\n";

        // Combine strings from "finalDate" to "body"
        rawMessage = [[[[[[[[[contentTypeMain stringByAppendingString:finalDate] stringByAppendingString:from]stringByAppendingString:to]stringByAppendingString:cc]stringByAppendingString:bcc]stringByAppendingString:subject]stringByAppendingString:boundary]stringByAppendingString:contentTypePlain]stringByAppendingString:body];

        // Attachments strings
        for (NSString *filename in arrFilenames) {

            // Image Content Type string
            NSString *contentTypePNG = boundary;
            contentTypePNG = [contentTypePNG stringByAppendingString:[NSString stringWithFormat:@"Content-Type: image/png; name=\"%@\"\r\n",filename]];
            contentTypePNG = [contentTypePNG stringByAppendingString:@"Content-Transfer-Encoding: base64\r\n"];

            // PNG image data
            NSData *pngData = UIImagePNGRepresentation([Utilities getImageFromFolder:FOLDER_UPLOADS filename:filename]);
            NSString *pngString = [NSString stringWithFormat:@"%@\r\n",GTLEncodeBase64(pngData)];
            contentTypePNG = [contentTypePNG stringByAppendingString:pngString];

            // Add to raw message
            rawMessage = [rawMessage stringByAppendingString:contentTypePNG];
        }

        // End string
        rawMessage = [rawMessage stringByAppendingString:@"\r\n--project--"];

    }else{

        // Send as "text/plain"
        rawMessage = [[[[[[finalDate stringByAppendingString:from]stringByAppendingString:to]stringByAppendingString:cc]stringByAppendingString:bcc]stringByAppendingString:subject]stringByAppendingString:body];

    }

    return [rawMessage dataUsingEncoding:NSUTF8StringEncoding];
}

如果电子邮件中包含附件,则rawMessage字符串的内容应如下所示.

If the email has attachments, the content of rawMessage string should look something like this.

Content-Type: multipart/mixed; boundary="project"
Date: Fri, 08 Jul 2016 14:25:32 +0800
From: <sampleFrom@gmail.com>
To: <sampleTo@gmail.com>
Subject: Sample Subject

--project
Content-Type: text/plain; charset="UTF-8"
Sample body

--project
Content-Type: image/png; name="SampleImage1.jpg"
Content-Transfer-Encoding: base64

<Image data>

--project
Content-Type: image/png; name="SampleImage2.jpg"
Content-Transfer-Encoding: base64

<Image data>

--project--

这篇关于iOS:GMail API-使用电子邮件发送附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆