【问题标题】:Send email from iOS app从 iOS 应用发送电子邮件
【发布时间】:2017-10-15 09:00:12
【问题描述】:

我正在使用 Swift 3 构建一个非常基本的 iOS 应用程序。它包含一个包含以下字段的公式:

  • 姓名
  • 姓氏
  • 电子邮件
  • 电话
  • 城市(选择器视图)
  • 说明

我想通过电子邮件发送这些数据。使用字段电子邮件作为接收者,以及正文中的其余字段。

我希望发件人始终相同,我有一个 Wordpress 后端,我不知道我是否必须有端点来执行此操作(可能使用 PHP 发送邮件,而不是直接从应用程序发送)。

我尝试使用 MFMailComposeViewController,但这会打开发送电子邮件的模式,并且需要在设备上配置电子邮件帐户。

知道怎么做吗?

【问题讨论】:

  • 您要么需要一个网络服务端点来执行此操作,否则您必须在 iPhone 中配置电子邮件帐户并使用它
  • 您需要设计从iOS获取数据的服务,并在后端使用任何邮件芯片服务通过同一发件人发送邮件。

标签: ios swift xcode email mfmailcomposeviewcontroller


【解决方案1】:

使用网络服务将您的数据发送到您的网络服务器,然后从那里向接收者/收件人发送电子邮件。 Web 服务器可以在不通知(移动应用)用户的情况下发送电子邮件。

您可以在网络服务器上设置一个帐户,该帐户可以从一个帐户发送所有电子邮件。在您的情况下,使用网络服务从网络服务器发送电子邮件将是最佳选择。

iOS 不允许在不使用的情况下发送电子邮件 MFMailComposeViewController

【讨论】:

    【解决方案2】:

    您需要一个服务来传递您的电子邮件,这可以是您自己的 WebService,或者您可以选择众多可用服务之一,例如 sendgrid.com,它在您的 Swift 应用程序中相当容易实现,并且有 40k 的电子邮件限制免费。

    这是一个使用sendgrid.com 服务的Swift 3 示例:

    注意:在使用此方法之前,请先在sendgrid.com 注册以获取api_userapi_key 值。

    func sendEmail(_ email: String, recipientName: String, subject: String, text: String) {
        let params = [
            "api_user": ENTER_YOUR_API_USER,
            "api_key": HERE_YOU_ENTER_API_KEY,
            "to": email,
            "toname": recipientName,
            "subject": subject,
            "html": text,
            "from": "noreply@example.com"
        ]
        var parts: [String] = []
        for (k, v) in params {
            let key = String(describing: k).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
            let value = String(describing: v).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
            parts.append(String(format: "%@=%@", key!, value!))
        }
        guard let url = URL(string: String(format: "%@?%@", "https://api.sendgrid.com/api/mail.send.json", parts.joined(separator: "&"))) else { return }
    
        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: nil)
        let task = session.dataTask(with: url, completionHandler: {
            (data, response, error) in
            if (error == nil) {
                print("Email delivered!")
            } else {
                print("Email could not be delivered!")
            }
        })
        task.resume()
        session.finishTasksAndInvalidate()
    }
    

    用法-1(纯文本)

    sendEmail("recipient@email.com", recipientName: "Recipient Name", subject: "PlainText", text: "This is a PlainText test email.")
    

    用法 2 (html)

    sendEmail("recipient@email.com", recipientName: "", subject: "HTML Test", text: "<html><div>This is a <b>HTML</b> test email.</div></html>")
    

    【讨论】:

    • 在 SendGrid 中哪里可以找到 API_USER?
    • API_USER 是您的用户名,API_KEY 是您的密码,请查看 api v2 文档sendgrid.com/docs/API_Reference/Web_API/mail.html
    • 这似乎不起作用。代码被复制,即使“发送电子邮件”也没有发送电子邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多