You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift使用SMTP发送UITableView选中PDF对应URL的实现问题

功能实现方案

第一步:修复选中PDF的收集逻辑

你现有代码里的selectdeselectcell方法每次选中都会清空selectedPdf数组,完全无法保存选中项,修改为以下逻辑:

func selectdeselectcell(tableview : UITableView ,indexpath : IndexPath){
    guard pdfListView.isEditing else { return }
    // 清空旧的选中数据后重新收集所有选中项
    selectedPdf.removeAll()
    if let selectedIndexPaths = pdfListView.indexPathsForSelectedRows {
        for indexPath in selectedIndexPaths {
            let pdfItem: pdfClass
            if searching {
                pdfItem = searchall[indexPath.row]
            } else {
                pdfItem = pdfList[indexPath.row]
            }
            selectedPdf.append(pdfItem)
        }
    }
}

第二步:添加邮件发送触发入口

修改编辑按钮的点击逻辑,退出编辑模式时如果有选中的PDF,弹出邮箱输入框,确认后触发发送:

@objc func showEditing(_ sender: UIBarButtonItem) {
    if(self.pdfListView.isEditing == true) {
        self.pdfListView.isEditing = false
        self.navigationItem.rightBarButtonItem?.title = "Edit"
        // 退出编辑时判断是否有选中项,有则弹出收件邮箱输入弹窗
        if !selectedPdf.isEmpty {
            let alert = UIAlertController(title: "发送PDF链接", message: "请输入收件邮箱地址", preferredStyle: .alert)
            alert.addTextField { textField in
                textField.placeholder = "收件邮箱"
                textField.keyboardType = .emailAddress
            }
            alert.addAction(UIAlertAction(title: "取消", style: .cancel))
            alert.addAction(UIAlertAction(title: "发送", style: .default, handler: { _ in
                guard let toEmail = alert.textFields?.first?.text, !toEmail.isEmpty else { return }
                self.sendEmail(to: toEmail, selectedPdfs: self.selectedPdf)
            }))
            present(alert, animated: true)
        }
    } else {
        self.pdfListView.allowsMultipleSelectionDuringEditing = true
        self.pdfListView.isEditing = true
        self.navigationItem.rightBarButtonItem?.title = "Done"
        // 进入编辑模式时清空之前的选中项
        selectedPdf.removeAll()
    }
}

第三步:修改邮件发送方法,动态生成邮件内容

把原来写死的sendEmail方法改成可传入收件邮箱和选中PDF列表的形式,拼接所有PDF的名称和链接到邮件正文:

func sendEmail(to toEmail: String, selectedPdfs: [pdfClass]) {
    let message = SKPSMTPMessage()
    message.relayHost = "smtp.gmail.com"
    message.login = "你的发件邮箱@gmail.com"
    // 注意:Gmail现在不支持直接用账号密码登录,需要去谷歌账号后台生成应用专用密码
    message.pass = "你的应用专用密码"
    message.requiresAuth = true
    message.wantsSecure = true
    message.relayPorts = [587]
    message.fromEmail = "你的发件邮箱@gmail.com"
    message.toEmail = toEmail
    message.subject = "你选择的PDF资源链接"
    
    // 拼接邮件正文
    var emailContent = "以下是你选择的PDF资源访问链接:\n\n"
    for (index, pdf) in selectedPdfs.enumerated() {
        emailContent += "\(index+1). \(pdf.pdf_name ?? "未命名PDF"):\n\(pdf.pdf_url)\n\n"
    }
    emailContent += "点击链接即可直接访问下载对应PDF资源。"
    
    let messagePart = [kSKPSMTPPartContentTypeKey: "text/plain; charset=UTF-8",
                       kSKPSMTPPartMessageKey: emailContent]
    message.parts = [messagePart]
    message.delegate = self
    message.send()
}

额外调整

删除viewDidLoad里默认调用的sendEmail()代码,原有默认调用无实际业务意义,还会造成不必要的请求。
可以在messageSent和messageFailed代理方法里添加弹窗提示,告知用户邮件发送结果,提升使用体验。

内容的提问来源于stack exchange,提问作者aig_88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:45:02