2016-12-29 26 views
1
發送電子郵件時禁止

我有以下的代碼,但一直得到錯誤401禁止試圖運行它時:401斯威夫特和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

你能告訴你正在使用curl命令哪個有效? – jtbandes

回答

0

您需要設置uesrname和密碼。

事情是這樣的:

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- {ignored}'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