Ответ API с доступом к именам почты From и To - PullRequest
0 голосов
/ 07 мая 2018

Я могу получать сообщения из API Gmail. В ответ я получаю письма от и до, как показано ниже

enter image description here.

{
    "name": "From",
    "value": Mail Delivery Subsystem **Symbol lessthan**mailer-daemon@googlemail.com**Symbol greaterthan**
}

{
    "name": "To",
    "value": Rahul, kumar **Symbol greaterthan**rahulkumar1234@gmail.com**Symbol lessthan**
}

Я могу получить доступ к значению, как показано ниже, с помощью цикла.

 if element.name == "From" {
   print("From ::: \(String(describing: element.value!))")
 }

OutPut:

From ::: Mail Delivery Subsystem <mailer-daemon@googlemail.com>

Вместо имени отправителя и почты. Я хочу получить только почту и имя отправителя individullay. Как я могу разделить значение на две части / строки, одна для имени, а другая для почты.

В некоторых случаях нет имени отправителя, а также символов меньшего и большего размера, в это время я получаю только почту.

@ vadian Я указал ниже все форматы в ответе. иногда я не получаю меньше и больше чем. А также я хочу сохранить имя и адрес электронной почты в виде двух отдельных строк. если в ответе нет имени, то нет необходимости захватывать его как строку. Достаточно только письма, чтобы захватить его как строку. enter image description here

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Прежде всего \(String(describing: element.value!) ужасно.В любом случае element.value! должен быть строкой, а перенос в String(describing: и снова в String Interpolation вдвое избыточнее.

Не злоупотребляйте String(describing для типов, которые в любом случае соответствуют ExpressibleByStringLiteral.

Просто напишите print("From ::: ", element.value!)


ЭтоФункция возвращает кортеж для name и email.Он проверяет, есть ли символ <.

Если его нет, он возвращает пустую строку как name, а входную строку как email.
Если он есть, он возвращаетподстрока после < до второго последнего символа как email, а остальные обрезаются на double quote, space и < как name.

func extractNameAndMail(in string: String) -> (name:String, email:String) {
    if let rangeOfLessThan = string.range(of: "<") {
        let email = string[rangeOfLessThan.upperBound...].dropLast()
        let name = string[...rangeOfLessThan.lowerBound].trimmingCharacters(in: CharacterSet(charactersIn: "\" <"))
        return (name: String(name), email: String(email))
    } else {
        return (name:"", email:string)
    }
}

let string = "\"Some Guy\" <mailer-daemon@googlemail.com>"
let extractedString = extractNameAndMail(in: string)
0 голосов
/ 07 мая 2018

2 варианта, которые я могу придумать,

1й: быстрый и грязный

Разделите строку, используя оператор «<», получите вторую часть, которая будет битом после «<», затем удалите «>» из этого результата, чтобы очистить ее. Это может быть опасно, если пользователь может иметь в своем имени символы «<» или «>», поэтому не будет полагаться на этот подход.

2-й: RegEx

Используйте регулярные выражения, чтобы получить письмо от значения

var value = "Some Guy <email@example.com>"

// no idea how robust this pattern is I just grabbed it from google so feel free to change
var pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let regex = try NSRegularExpression(pattern: pattern)
let results = regex.matches(in: value, range: NSRange(value.startIndex..., in: value))

// Generates a string array of emails
var emails = results.map {
    String(value[Range($0.range, in: value)!])
}

вы, вероятно, когда-либо будете иметь только одно электронное письмо в поле От, но это позволит вам захватить несколько электронных писем, если они есть в поле Кому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...