Как создать RAW-Email-сообщение на AWS-SES в Swift 5 - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать RAW-Email внутри моего iOS-приложения. Глядя на документацию , мне нужно закодировать мое сообщение в MIME-Standard, но я не очень знаком с этой темой. В документации также приведен пример кода для python и java.

Как этого добиться в SWIFT?

func sendRawMail(){
    let sender = "sender@mail.com"
    let recipient = "recipient@mail.com"

    let rawMessage = AWSSESRawMessage()
   // rawMessage?.data = "I guess HERE I have to put the MIME-   Data?!"
    let rawRequest = AWSSESSendRawEmailRequest()
    rawRequest?.destinations = [recipient]
    rawRequest?.source = sender

    rawRequest?.rawMessage = rawMessage

    AWSSES.default().sendRawEmail(rawRequest!) { (response, error) in
        if let response = response{
            print(response)
        }
        if let error = error{
            print(error)
        }
    }
}

До сих пор работает отправка пустого письма с моим кодом.

1 Ответ

0 голосов
/ 08 ноября 2019

После долгих чтений я наконец-то начал работать. Вам нужно написать большую строку, основанную на стандартах MIME. Эту большую строку вы должны закодировать в BASE64. Вложения, необходимые также для преобразования данных в строку BASE64.

Я опубликую свой код, который может отправлять письма с изображением в формате .png. Я также протестирую другие типы файлов, но это должен быть тот же принцип.

Сначала я создал перечисление для своих типов файлов.

enum DataTypes{
case png
case jpg
case pdf
}

Теперь я создал функцию для получения строки-значение для определенного типа данных

func getMIMEDataType(dataType:DataTypes) -> String{
    var MIMEData = String()
    switch dataType {
    case .png:
        MIMEData = "image/png"
    case .jpg:
        MIMEData = "image/jpg"
    case .pdf:
        MIMEData = "application/pdf"
    }
    return MIMEData
}

Наконец, функция для отправки необработанного письма. В строке сообщения уже есть переменные, поэтому вы можете использовать эту функцию гибкой.

func sendRawMail(sender:String,reciepients:[String],subject:String,message:String,attachment:Data?,dataType:DataTypes?,attachmentName:String?,completion: @escaping (_ messageCode:String?,_ error:Error?) -> ()){

    let attachmentString = attachment!.base64EncodedString(options: .lineLength64Characters)

    let MIMEDataType = getMIMEDataType(dataType: dataType!)

    let message:String = """
    Subject: \(subject)
    MIME-Version: 1.0
    Content-Type: multipart/mixed;
            boundary="XXXXboundary text"

    This is a multipart message in MIME format.

    --XXXXboundary text
    Content-Type: text/plain

    \(message)

    --XXXXboundary text
    Content-Type: \(MIMEDataType);
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="\(attachmentName!).\(MIMEDataType.components(separatedBy: "/")[1])"

    \(attachmentString)

    --XXXXboundary text--
    """

    let data = message.data(using: .utf8)
    let rawMessage = AWSSESRawMessage()
    rawMessage?.data = data
    let rawRequest = AWSSESSendRawEmailRequest()
    rawRequest?.destinations = reciepients
    rawRequest?.source = sender

    rawRequest?.rawMessage = rawMessage

    AWSSES.default().sendRawEmail(rawRequest!) { (response, error) in
        if let response = response{
            completion(response.messageId,nil)
        }
        if let error = error{
            completion(nil,error)
        }
    }
}

Вы можете использовать его следующим образом и обработать результат в завершении завершения.

sendRawMail(sender: "sender.mail@mail.com", reciepients: ["recipient.mail@mail.com"], subject: "This is a test", message: "TestMessage", attachment: attachment.data, dataType: .png, attachmentName: "testpicture") { (messageID, error) in
                    if let messageID = messageID{
                        print(messageID)
                    }
                    if let error = error{
                        print(error)
                    }

Надеюсь, это поможет кому-нибудь в будущем:)

...