简体   繁体   中英

How to send email using Alamofire and Mailgun with Swift?

I am trying to send email using Alamofire and Mailgun but just can't get it working.

I am using the Mailgun sandbox and Alamofire is added corectly but when I run this code:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    let key = "my correct key"

    let parameters = [
        "Authorization" : "api:my correct key",
        "from": "sender email",
        "to": "destination email",
        "subject": "Test",
        "text": "Testing email send"
    ]

    let r = Alamofire.request(.POST, "https://api.mailgun.net/v3/<my sandbox>/messages", parameters:parameters)
        .authenticate(user: "api", password: key)
        .response { (request, response, data, error) in
            print(request)
            print(response)
            print(error)
    }
    print(r)
}

I get this error log:

POST https://api.mailgun.net/v3/sandbox3fecb2a1fd334a66bae85d3ed7d4ea9c.mailgun.org/messages
2015-10-01 15:58:57.520 Email[7001:912455] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
Optional(<NSMutableURLRequest: 0x7f9551722230> { URL: https://api.mailgun.net/v3/sandbox3fecb2a1fd334a66bae85d3ed7d4ea9c.mailgun.org/messages })
nil
Optional(Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7f9551483e30>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x7f95514858d0 [0x10f0f17b0]>{type = immutable, count = 3, values = (
0 : <cert(0x7f9551481f00) s: *.mailgun.net i: GeoTrust SSL CA>
1 : <cert(0x7f9551482990) s: GeoTrust SSL CA i: GeoTrust Global CA>
2 : <cert(0x7f9551483140) s: GeoTrust Global CA i: Equifax Secure Certificate Authority>
)}, NSUnderlyingError=0x7f9551708d90 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f9551483e30>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7f95514858d0 [0x10f0f17b0]>{type = immutable, count = 3, values = (
0 : <cert(0x7f9551481f00) s: *.mailgun.net i: GeoTrust SSL CA>
1 : <cert(0x7f9551482990) s: GeoTrust SSL CA i: GeoTrust Global CA>
2 : <cert(0x7f9551483140) s: GeoTrust Global CA i: Equifax Secure Certificate Authority>
)}}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://api.mailgun.net/v3/sandbox3fecb2a1fd334a66bae85d3ed7d4ea9c.mailgun.org/messages, NSErrorFailingURLStringKey=https://api.mailgun.net/v3/sandbox3fecb2a1fd334a66bae85d3ed7d4ea9c.mailgun.org/messages, NSErrorClientCertificateStateKey=0})

The problem is Apple's new App Transport Security (ATS) feature that is meant to improve security. Because your app is trying to connect to an HTTP server (api.mailgun.net) that doesn't support the latest SSL technology (TLSv1.2), ATS causes your connection to fail with such an error. I had the same problem.

See this article: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

If you don't want to read it, just right click on your info.plist, select "Open as"->"Source Code" and then paste this before the last <\\dict>

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>api.maillgun.net</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM