2016-12-29 5 views
1

У меня есть следующий код, но постоянно получаю ошибку 401 запрещено при попытке запустить его:401 Forbidden при отправке электронной почты с Swift и Mailgun

Ошибка является:

url = https://api.mailgun.net/v3/{edited_out}/messages 
response = <NSHTTPURLResponse: 0x600000226a20> { URL: https://api.mailgun.net/v3/{edited_out}/messages } { status code: 401, headers { 
    Connection = "keep-alive"; 
    "Content-Length" = 9; 
    "Content-Type" = "text/html; charset=utf-8"; 
    Date = "Thu, 29 Dec 2016 21:22:46 GMT"; 
    Server = nginx; 
    "Www-Authenticate" = "Basic realm=\"MG API\""; 
} } 
response code = 401 

Если я пошлю такой запрос через curl с моими учетными данными работает нормально.

Любые идеи?

+0

Это ошибка аутентификации, вы должны передавать правильные учетные данные –

+0

я передаю правильные детали .. они работают отлично через завиток – RJH

+1

Можете ли вы показать завиток команду, которую вы используете который работает? – jtbandes

ответ

0

Необходимо указать имя и пароль uesr.

Что-то вроде этого:

request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization") 

и base64Credentials является:

let credentials= String(format: "%@:%@", username, password) 
let base64Credentials= credentials.data(using: String.Encoding.utf8)! 
+0

Получение одинаковой ошибки с этим:/ – RJH

+0

Как вы передаете свои учетные данные в CURL? –

+0

curl -s --user 'api: key- {omitted}' https://api.mailgun.net/v3/{omitted}/messages -F from = 'Возбужденный пользователь '-F to={omitted}@gmail.com -F subject =' Hello '-F text =' Testing ' ----- (переполнение стека преобразует https: // в ссылку) – RJH

0

Наконец получил он работает со следующим кодом, если это поможет кому-то:

func email() { 
    let session = URLSession.shared 
    let request = NSMutableURLRequest(url: NSURL(string: "https://api.mailgun.net/v3/{edited_out}/messages")! as URL) 

    request.httpMethod = "POST" 
    let credentials = "api:key-{omitted}" 
    request.setValue("Basic \(credentials.toBase64())", forHTTPHeaderField: "Authorization") 

    let data = "from: Swift Email <([email protected])>&to: [[email protected],([email protected])]&subject:Hello&text:Testing_some_Mailgun_awesomness" 
    request.httpBody = data.data(using: String.Encoding.ascii) 

    let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in 
     if let error = error { 
      print(error) 
     } 
     if let response = response { 
      print("url = \(response.url!)") 
      print("response = \(response)") 
      let httpResponse = response as! HTTPURLResponse 
      print("response code = \(httpResponse.statusCode)") 
     } 
    }) 
    task.resume() 
} 


extension String { 

    func fromBase64() -> String? { 
     guard let data = Data(base64Encoded: self) else { 
      return nil 
     } 

     return String(data: data, encoding: .utf8) 
    } 

    func toBase64() -> String { 
     return Data(self.utf8).base64EncodedString() 
    } 
} 

Так Я думаю, что ответ Уильяма работал бы с:

let base64Credentials = credentials.data(using: String.Encoding.utf8)!.base64EncodedString() 

Вместо:

let base64Credentials = credentials.data(using: String.Encoding.utf8)! 
+0

Я добавил тот же самый код, что и вы, но я получаю 400 ... – Nico

+0

Вы заменили {опущен} на свой ключ – RJH

+0

Да, конечно. Часть аутентификации прекрасна, поскольку как только я сменил ключ, я получил 401. – Nico

Смежные вопросы