Ответ 1
Новый ответ:
Чтобы загрузить файл в качестве прикрепления электронной почты непосредственно в SendGrid, вы должны использовать Web API v3 и создать запрос, как описано в docs.
Прежде всего, вам нужно добавить заголовок проверки в ваш запрос. Во-вторых, вам нужно преобразовать ваши данные в формат JSON. Если мы говорим о файлах, вам необходимо закодировать данные файла с помощью Base64, как описано в разделе параметров тела:
JSON PARAMETER: attachements/content
TYPE: string
REQUIRED: Yes
The Base64 encoded content of the attachment.
Также обратите внимание на параметры disposition
и content_id
: они помогут вам настроить внешний вид вашего файла в почте.
Старый ответ:
Стандартный способ загрузки обоих параметров и файлов - это использовать запрос POST с multipart messages. Я изменил свой код для создания данных этого формата:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage* image = info[UIImagePickerControllerEditedImage];
NSDictionary* params = @{
@"toEmailAddress" : @"[email protected]",
@"subject" : @"Some Subject",
@"message" : @"Some message...",
@"fullName" : @"Mister Bla Bla",
};
[picker dismissViewControllerAnimated:YES completion:^{
[self sendMailWithParams:params image:image];
}];
}
static NSStringEncoding const kEncoding = NSUTF8StringEncoding;
- (void)sendMailWithParams:(NSDictionary*)params image:(UIImage*)image {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
request.URL = [NSURL URLWithString:@"http://www.someURL.com/sendgrid.php"];
request.HTTPMethod = @"POST";
NSString *boundary = [NSUUID UUID].UUIDString;
// define POST request as multipart
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
// prepare boundary
NSString *middleBoundary = [NSString stringWithFormat:@"--%@\r\n", boundary];
NSData *middleBoundaryData = [middleBoundary dataUsingEncoding:kEncoding];
NSMutableData* body = [NSMutableData data];
// append params
[params enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) {
[body appendData:middleBoundaryData];
NSData* fieldData = [self dataForKey:key value:value];
[body appendData:fieldData];
}];
// append image
if (image) {
[body appendData:middleBoundaryData];
NSData* imageData = [self dataForImage:image imageName:@"photo.png"];
[body appendData:imageData];
}
// add last boundary
NSString* lastBoundary = [NSString stringWithFormat:@"--%@--\r\n", boundary];
NSData* lastBoundaryData = [lastBoundary dataUsingEncoding:kEncoding];
[body appendData:lastBoundaryData];
// set body to request
request.HTTPBody = body;
// add length of body
NSString *length = [NSString stringWithFormat:@"%llu", (uint64_t)body.length];
[request setValue:length forHTTPHeaderField:@"Content-Length"];
// send request
NSURLSession* session = [NSURLSession sharedSession];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle as you want
}];
[task resume];
}
- (NSData*)dataForImage:(UIImage*)image imageName:(NSString*)imageName {
NSString* fieldDescription = [NSString stringWithFormat:
@"Content-Disposition: form-data; name=\"image\"; filename=\"%@\"\r\n"
@"Content-Type: image/png\r\n\r\n", imageName];
NSMutableData *data = [NSMutableData data];
[data appendData:[fieldDescription dataUsingEncoding:kEncoding]];
NSData* imageData = UIImagePNGRepresentation(image);
[data appendData:imageData];
NSString* newLine = @"\r\n";
NSData* newLineData = [newLine dataUsingEncoding:kEncoding];
[data appendData:newLineData];
return data;
}
- (NSData*)dataForKey:(NSString*)key value:(NSString*)value {
NSString* fieldDescription = [NSString stringWithFormat:
@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n"
@"%@\r\n", key, value];
return [fieldDescription dataUsingEncoding:kEncoding];
}
Вы можете использовать $_ POST и $_ FILES переменные чтобы получить доступ к загруженным данным на вашем PHP скрипт. Если вы хотите узнать больше о многостраничных сообщениях, проверьте документы здесь.