1

我正在尝试使用来自sendgrid.com的邮件 api,但每次它都以失败块结束。另外我不明白如何将图像作为附件发送到电子邮件中。谁能告诉我下面的代码有什么问题以及如何发送图像?我现在正在使用下面的代码

-(void)sendEmail
{
    NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
    [params setValue:@"username" forKey:@"api_user"];
    [params setValue:@"sdsfddf23423" forKey:@"api_key"];
    [params setValue:@"test@gmail.com" forKey:@"to"];
    [params setValue:@"test user" forKey:@"toname"];
    [params setValue:@"Test SendGrid" forKey:@"subject"];
    [params setValue:@"Test SendGrid from iOS app" forKey:@"text"];
    [params setValue:@"noreply@gmail.com" forKey:@"from"];

    NSURL *url = [NSURL URLWithString:@"https://sendgrid.com/api"];
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL: url];
    NSMutableURLRequest *request = [client requestWithMethod:POST path:@"/mail.send.json"  parameters:params];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
        DLog(@"Get latest product info response : %@", response);
        NSLog(@"Success");
    } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Failure");
    }];
    [operation start];
}

提前致谢。

更新

我对代码进行了一些更改,现在我可以成功发送电子邮件,如下所示

-(void)sendEmailWithoutImage
{

     NSDictionary *parameters = @{@"api_user": @"username",
                                 @"api_key": @"sdsfddf23423",
                                 @"subject":@"Test SendGrid",
                                 @"from":@"noreply@gmail.com",
                                 @"to":@"test@gmail.com",
                                 @"text":@"Test SendGrid from iOS app"};

    [[MyAPIClient sharedAPIClient] POST:@"mail.send.json" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject)
    {
        NSLog(@"Success::responseObject : %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error::Mail response : %@", error);
    }];
}

但是当我尝试将图像作为附件发送时,它会导致 400 错误请求。所以我认为我的文件上传块中有一些错误。这是我的代码

-(void)sendEmailWithImage
{
    NSDictionary *parameters = @{@"api_user": @"username",
                                 @"api_key": @"sdsfddf23423",
                                 @"subject":@"Test SendGrid",
                                 @"from":@"noreply@gmail.com",
                                 @"to":@"test@gmail.com",
                                 @"text":@"Test SendGrid from iOS app"};

    [[MyAPIClient sharedAPIClient] POST:@"mail.send.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
    {
        UIImage *image = [UIImage imageNamed:@"redWine.png"];
        NSData *imageToUpload = UIImagePNGRepresentation(image);
        [formData appendPartWithFileData:imageToUpload name:@"files" fileName:[NSString stringWithFormat:@"%@",@"abc.png"] mimeType:@"image/png"];
    }
    success:^(NSURLSessionDataTask *task, id responseObject)
    {
        NSLog(@"Success::responseObject : %@", responseObject);
    }
    failure:^(NSURLSessionDataTask *task, NSError *error)
    {
        NSLog(@"Error::Mail response : %@", error);
    }];
} 

有人能告诉我上传图片时出了什么问题吗?

谢谢

4

1 回答 1

3

Just modified your code a little. It looks like there was an issue with the parameters being sent and the URL path.

Also since you are already using AFNetworking to make your POST request, you can follow their docs and example on how to send a photo over here: http://cocoadocs.org/docsets/AFNetworking/2.0.1/

NSDictionary *parameters = @{@"api_user": @"username",
                                 @"api_key": @"sdsfddf23423",
                                 @"Test SendGrid":@"test",
                                 @"from":@"noreply@gmail.com",
                                 @"to":@"test@gmail.com",
                                 @"text":@"Test SendGrid from iOS app"};


    NSURL *url = [NSURL URLWithString:@"https://sendgrid.com/api/"];
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL: url];
    NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"mail.send.json"  parameters:parameters];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
        // DLog(@"Get latest product info response : %@", response);
         NSLog(@"Success: %@", response);
     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"%@",error);
     }];
    [operation start];

Update**

Created a Sendgrid-ios library to make it easier to send an email and photo attachment.

//create Email Object
gridmail *msg = [gridmail user:@"username" andPass:@"password"];

//set parameters
msg.to = @"foo@bar.com";
msg.subject = @"subject goes here";
msg.from = @"me@bar.com";
msg.text = @"hello world";   
msg.html = @"<h1>hello world!</h1>";


//Image attachment
[msg attachImage:self.photo];

//Send email through Web API Transport
[msg sendWithWeb];
于 2013-10-16T19:28:34.233 回答