Jmeter Groovy JavaMail API multipart добавить контент в образец результата - PullRequest
1 голос
/ 14 июля 2020

Глядя на ответы, размещенные в Чтение электронных писем на основе идентификатора электронной почты получателя в Jmeter с использованием groovy Мне действительно удалось использовать поисковый запрос получателя.

Используя приведенный ниже пример в JSR223 Sampler

    import javax.mail.Multipart
    import javax.mail.internet.MimeMultipart
    import javax.mail.Message
    import javax.mail.search.RecipientStringTerm
    
    Properties properties = new Properties()
    properties.put('mail.imap.host', 'your mail server host') // i.e. imap.gmail.com
    properties.put('mail.imap.port', your mail server port)  // i.e. 993
    properties.setProperty('mail.imap.socketFactory.class', 'javax.net.ssl.SSLSocketFactory')
    properties.setProperty('mail.imap.socketFactory.fallback', 'false')
    properties.setProperty('mail.imap.socketFactory.port', 'your_mail_server_port') // i.e. 993
    
    def session = javax.mail.Session.getDefaultInstance(properties)
    def store = session.getStore('imap')
    store.connect('your username (usually email address)', 'your_password')
    
    def inbox = store.getFolder('INBOX')
    inbox.open(javax.mail.Folder.READ_ONLY)
    
    def onlyToGivenUser = inbox.search(new RecipientStringTerm(Message.RecipientType.TO,'your_recipient_address')) // i.e. test+1@gmail.com
    
    onlyFromGivenUser.each { message ->
        if (message.getContent() instanceof Multipart) {
            StringBuilder content = new StringBuilder()
            def multipart = (Multipart) message.getContent()
            multipart.eachWithIndex { Multipart entry, int i ->
                def part = entry.getBodyPart(i)
                if (part.isMimeType('text/plain')) {
                    content.append(part.getContent().toString())
                }
            }
            SampleResult.setResponseData(content.toString(), 'UTF-8')
        } else {
            SampleResult.setResponseData(message.getContent().toString(), 'UTF-8')
        }
    }

Это работает отлично, но не работает, когда электронное письмо имеет тип ContentType: multipart / MIXED, поскольку оно не детализируется до multipart / RELATED, multipart / ALTERNATIVE, а затем до TEXT / PLAIN или TEXT / HTML, на котором мне нравится выполнять регулярное выражение для извлечения ссылки из тела.

Требуется угадать какой-то счетчик на i и "если еще" или что-то вроде упомянутого здесь , но не знаете, как преобразовать, чтобы соответствовать приведенному выше сценарию ...

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 15 июля 2020

Я отказался от javax.mail.Multipart и javax.mail.inte rnet .MimeMultipart и реализовал приведенный ниже код в контроллере While

import javax.mail.Message
import javax.mail.search.RecipientStringTerm

Properties properties = new Properties();
properties.put('mail.imap.host', 'your mail server host') // i.e. imap.gmail.com
properties.put('mail.imap.port', your mail server port)  // i.e. 993
properties.setProperty('mail.imap.socketFactory.class', 'javax.net.ssl.SSLSocketFactory')
properties.setProperty('mail.imap.socketFactory.fallback', 'false')
properties.setProperty('mail.imap.socketFactory.port', 'your_mail_server_port') // i.e. 993

def session = javax.mail.Session.getDefaultInstance(properties)
def store = session.getStore('imap')
store.connect('your username (usually email address)', 'your_password')

def inbox = store.getFolder('INBOX');
inbox.open(javax.mail.Folder.READ_ONLY);

def onlyToGivenUser = inbox.search(new RecipientStringTerm(Message.RecipientType.TO,'your_recipient_address')); // i.e. test+1@gmail.com 

try {
    onlyToGivenUser.each { message ->
        ByteArrayOutputStream emailRaw = new ByteArrayOutputStream();
        message.writeTo(emailRaw);
        SampleResult.setResponseData(emailRaw.toString(), 'UTF-8');
        }
    } catch (Exception ex) {
        log.warn("Something went wrong", ex);
        throw ex;
    }

Надеюсь, однажды это кому-то поможет.

...