2017-01-18 10 views
1

После поиска некоторое время я успел отправить письмо, но без привязанности следующим образом:Как отправить GTLRGmail_Message с приложением

NSString *messageString =        @"From: \"From Email USer Name\" <fromEmail>\r\n"; 
messageString = [messageString stringByAppendingString:@"To: \"To Email User Name\" <ToEmail>\r\n"]; 
messageString = [messageString stringByAppendingString:@"Subject: New stuff\r\n"]; 
messageString = [messageString stringByAppendingString:@"Content-type: text/html;charset=iso-8859-1\r\n\r\n"]; 
messageString = [messageString stringByAppendingString:@"Hello my friend, \n can you please call me when have free time. \nMark."]; 

NSData *data = [messageString dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *base64Encoded = GTLREncodeWebSafeBase64(data); 


GTLRGmail_Message *message = [[GTLRGmail_Message alloc] init]; 

message.raw = base64Encoded; 

GTLRGmailQuery_UsersMessagesSend *query = [GTLRGmailQuery_UsersMessagesSend queryWithObject:message userId:@"myEmailAddress" uploadParameters:nil]; 

[self.service executeQuery:query completionHandler:^(GTLRServiceTicket * _Nonnull callbackTicket, id _Nullable object, NSError * _Nullable callbackError) { 
     NSLog(@"%@",callbackError); 
}]; 

я попытался добавить GTLRUploadParameters следующим образом:

GTLRUploadParameters *params = [GTLRUploadParameters uploadParametersWithData:imageData MIMEType:@"message/rfc822"]; 

но до сих пор нет успеха, я попытался разделить сообщение на несколько GTLRGmail_MessagePartBody и добавить их в контейнер GTLRGmail_MessagePartBody в качестве message.payload:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IMG_1253" ofType:@"jpg"]; 

/***************************** create a imageData part ******************/ 

NSData *imagedata = [NSData dataWithContentsOfFile:filePath]; 
NSString *imageBase64String = GTLREncodeWebSafeBase64(imagedata); 
GTLRGmail_MessagePartBody *bodyImage = [[GTLRGmail_MessagePartBody alloc] init]; 
bodyImage.data = imageBase64String; 
bodyImage.size = @(imagedata.length); 

GTLRGmail_MessagePart *imagePart = [[GTLRGmail_MessagePart alloc] init]; 
imagePart.body = bodyImage; 
imagePart.mimeType = @"image/jpeg"; 
imagePart.filename = @"IMG_1253"; 


/***************************** create a message part ******************/ 

NSString *messageString = @"Hello my friend, \n can you please call me when have free time. \nMark."; 
NSData *dataMessage = [messageString dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *base64EncodedMessage = GTLREncodeWebSafeBase64(dataMessage); 

GTLRGmail_MessagePartBody *bodyText = [[GTLRGmail_MessagePartBody alloc] init]; 
bodyText.data = base64EncodedMessage; 
bodyText.size = @(dataMessage.length); 


GTLRGmail_MessagePart *messagePart = [[GTLRGmail_MessagePart alloc] init]; 
messagePart.body = bodyText; 
messagePart.mimeType = @"text/plain"; 

/***************************** create a payload part ******************/ 

GTLRGmail_MessagePartHeader *toHeader = [[GTLRGmail_MessagePartHeader alloc] init]; 
toHeader.name = @"to"; 
toHeader.value = @"userEmail"; 

GTLRGmail_MessagePart *payload = [[GTLRGmail_MessagePart alloc] init]; 
payload.mimeType = @"multipart/mixed; boundary=\"IMG_1253\""; 
payload.parts = @[messagePart, imagePart]; 


GTLRGmail_Message *message = [[GTLRGmail_Message alloc] init]; 
message.payload = payload; 

GTLRGmailQuery_UsersMessagesSend *query = [GTLRGmailQuery_UsersMessagesSend queryWithObject:message userId:@"myEmail" uploadParameters:nil]; 

[self.service executeQuery:query completionHandler:^(GTLRServiceTicket * _Nonnull callbackTicket, id _Nullable object, NSError * _Nullable callbackError) { 

    NSData *data = callbackError.userInfo[@"data"]; 
    NSString *string = [[NSString alloc] initWithData:data encoding:0]; 

    NSLog(@"%@",string); 
}]; 

, но в этом случае я получаю: Code=400 "'raw' RFC822 payload message string or uploading message via /upload/* URL required", если я добавить base64Encoded к message.raw из предыдущего решения я получить электронную почту, но не вложение
что я делаю неправильно?

+0

Вы проверили http://stackoverflow.com/questions/25363312/how-to-s end-email-through-gmail-api-go? rq = 1 – Amanpreet

+0

@Amanpreet да, я проверил это и многие другие, но не успел –

ответ

1

поэтому раствор модифицированного немного Veaanswer не хорошеет один, но:

GTLRUploadParameters *uploadParam = [[GTLRUploadParameters alloc] init]; 
uploadParam.MIMEType = @"message/rfc822"; 
uploadParam.data = [self getFormattedRawMessage]; 

GTLRGmail_Message *message = [[GTLRGmail_Message alloc] init]; 

GTLRGmailQuery_UsersMessagesSend *query = [GTLRGmailQuery_UsersMessagesSend queryWithObject:message userId:@"[email protected]" uploadParameters:uploadParam]; 

[self.service executeQuery:query completionHandler:^(GTLRServiceTicket * _Nonnull callbackTicket, id _Nullable object, NSError * _Nullable callbackError) { 

    NSData *data = callbackError.userInfo[@"data"]; 
    NSString *string = [[NSString alloc] initWithData:data encoding:0]; 

    NSLog(@"%@",string); 
}]; 

и getFormattedRawMessage:

- (NSData *)getFormattedRawMessage 
{ 
    // 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: <[email protected]>\r\n"; 

    // To string 
    NSString *to = @"To: <[email protected]>\r\n"; 

    // CC string 
    NSString *cc = @""; 

    // BCC string 
    NSString *bcc = @""; 

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

    // Body string 
    NSString *body = @"Hello my friend, \n can you please call me when have free time. \nMark. \r\n"; 

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

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


    // Image Content Type string 
    NSString *contentTypeJPG = boundary; 
    contentTypeJPG = [contentTypeJPG stringByAppendingString:[NSString stringWithFormat:@"Content-Type: image/jpeg; name=\"%@\"\r\n",@"IMG_1253.jpg"]]; 
    contentTypeJPG = [contentTypeJPG stringByAppendingString:@"Content-Transfer-Encoding: base64\r\n"]; 

    // PNG image data 
    UIImage *image = [UIImage imageNamed:@"IMG_1253.jpg"]; 
    NSData *jpegData = UIImageJPEGRepresentation(image, 1); 
    NSString *imageBase64String = GTLREncodeBase64(jpegData); 
    NSString *pngString = [NSString stringWithFormat:@"%@\r\n",imageBase64String]; 
    contentTypeJPG = [contentTypeJPG stringByAppendingString:pngString]; 

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


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

    return [rawMessage dataUsingEncoding:NSUTF8StringEncoding]; 
} 

, но я до сих пор, что бы знать, как использовать GTLRGmail_MessagePartBody и GTLRGmail_MessagePartHeader за message.payload