Php 由于从电子邮件中提取的令牌已损坏,功能测试失败

Php 由于从电子邮件中提取的令牌已损坏,功能测试失败,php,symfony,swiftmailer,Php,Symfony,Swiftmailer,在Symfony 5项目中,如果从电子邮件中提取的确认令牌已损坏,则用户注册的功能测试将失败。(由于SwiftMailer具有发送日志的功能,因此可以使用它发送电子邮件。) 测试从填写一份带有用户名和电子邮件地址的表格开始。保存时发送电子邮件。因为测试包括$this->client->followRedirects(false)测试可以访问电子邮件的内容。当从电子邮件中提取令牌时,它包含额外的字符。因此,当测试尝试$this->client->request('GET','/register/r

在Symfony 5项目中,如果从电子邮件中提取的确认令牌已损坏,则用户注册的功能测试将失败。(由于SwiftMailer具有发送日志的功能,因此可以使用它发送电子邮件。)

测试从填写一份带有用户名和电子邮件地址的表格开始。保存时发送电子邮件。因为测试包括
$this->client->followRedirects(false)测试可以访问电子邮件的内容。当从电子邮件中提取令牌时,它包含额外的字符。因此,当测试尝试
$this->client->request('GET','/register/reset/'。$token)由于注册数据无效,测试失败

以下是测试的一个版本:

    public function testReplacementEmail() {
        $this->client->clickLink('Staff');
        $this->client->clickLink('Replace');
        $this->client->followRedirects(false);
        $this->client->submitForm('Save', [
            'user[fname]' => 'Useless',
            'user[sname]' => 'Garbage',
            'user[email]' => 'ugar@bogus.info'
        ]);
        $mailCollector = $this->client->getProfile()->getCollector('swiftmailer');

        $this->assertSame(1, $mailCollector->getMessageCount());
        $collectedMessages = $mailCollector->getMessages();
        $message = $collectedMessages[0];
        $this->assertStringContainsString('has been asked to designate', $message);

        $string = 'register/reset/';
        $offset = strlen($string);
        $pos = strpos($message, $string) + $offset;
        $token = substr($message, $pos, 32);
        var_dump($token);

        $this->client->followRedirects(true);
        $this->client->request('GET', '/logout');
        $this->client->request('GET', '/register/reset/' . $token);
        $this->client->submitForm('Save', [
            'new_password[plainPassword][first]' => '123Abc',
            'new_password[plainPassword][second]' => '123Abc',
        ]);

        $this->assertStringContainsString('You are now the registered representative', $this->client->getResponse()->getContent());
    }
我在控制器中包含了处理
Replace
链接的行
$token=md5(uniqid(rand(),true));var_dump($token)
以获取未经加密的令牌。当测试运行时,这些行生成如下内容:

string(32) "7260162194f9ab6d=
eb55eb4f38178"
字符串(32)“ad47260162194f9ab6deb55eb4f38178”

如果我使用
var\u dump($message)
在访问电子邮件内容的测试中,我可以看到如下内容:

string(32) "7260162194f9ab6d=
eb55eb4f38178"
href=”http://localhost/register/reset/ad47260162194f9ab6deb55eb4f38178“

然而,测试包括
var_dump($token)我看到的是这样的内容:

string(32) "7260162194f9ab6d=
eb55eb4f38178"

出现
=\r\n
(在Windows系统上)会导致链接失败


我想知道为什么会出现这些额外的字符,以及如何尽可能避免这些字符。

字符串中出现
=\r\n
表明消息是用MIME编码的,并且链接跨越了一个行尾。SwiftMailer消息对象似乎有一个神奇的
\uuu toString()
方法(奇怪的是,IMO)生成消息的编码形式。如果您想要原始消息字符串,您可以调用消息对象的
getBody()
方法,然后对结果使用
strpos()
测试。

字符串中存在
=\r\n
表明消息是MIME编码的,并且链接跨越了一个行尾。SwiftMailer消息对象似乎有一个神奇的
\uuu toString()
方法(奇怪的是,IMO)生成消息的编码形式。如果您想要原始消息字符串,可以调用消息对象的
getBody()
方法,然后只需对结果进行
strpos()
测试。

看起来您的电子邮件是通过MIME编码的,您的链接恰好跨越了一行末尾。我想SwiftMailer会提供一种方法来获取解码后的正文,然后在上面使用strps()。非常感谢。这导致我将测试修改为
$message=$collectedMessages[0]->getBody()我很乐意接受这样的答案。酷豆,就可以了。“酷豆”!我很少在其他地方听到这个短语,但我经常使用它。很高兴在这里看到它。看起来你的电子邮件是通过MIME编码的,而你的链接恰好跨越了一行。我想SwiftMailer会提供一种方法来获取解码后的正文,然后在上面使用strps()。非常感谢。这导致我将测试修改为
$message=$collectedMessages[0]->getBody()我很乐意接受这样的答案。酷豆,就可以了。“酷豆”!我很少在其他地方听到这个短语,但我经常使用它。很高兴在这里看到它。