【问题标题】:How do I generate long valid email address?如何生成长期有效的电子邮件地址?
【发布时间】:2017-03-10 22:45:32
【问题描述】:

我的意思:

$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@gmail.com", FILTER_VALIDATE_EMAIL));'
Command line code:1:
string(74) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@gmail.com"
$ php -r 'var_dump(filter_var(str_repeat("a", 65) . "@gmail.com", FILTER_VALIDATE_EMAIL));'
Command line code:1:
bool(false)

邮箱名称的长度有限制吗?我需要一封长度超过 255 个字符的电子邮件(用于测试)。

UPD 让我解释一下我需要这个做什么。我想在我的测试中确保用户不能指定超过 255 个字符的电子邮件地址。这就是为什么我需要一个长电子邮件地址。

UPD 遵循 Justinas 的建议:

$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat("g", 63) . ".com", FILTER_VALIDATE_EMAIL));'
Command line code:1:
string(132) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg.com"
$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat("g", 64) . ".com", FILTER_VALIDATE_EMAIL));'
Command line code:1:
bool(false)

【问题讨论】:

  • 将您的电子邮件地址保持在不超过 127 个字符的范围内就足够了——也就是说......

标签: php validation email email-address rfc822


【解决方案1】:

Source

电子邮件地址的格式为 local-part@domain,其中 本地部分最长可达 64 个字符最多可包含255 个字符


要生成一些长字符串,您可以使用像str_repeat 这样简单的东西

var_dump(str_repeat('a', 64).'@'.str_repeat('g', 255).'.com');

【讨论】:

  • 它最多与str_repeat('g', 63) 一起使用,请参阅我更新的问题。
  • @x-yuri 你不是把' 在你的代码里弄乱了吗?
  • @x-yuri 也回答您的问题:是的,电子邮件地址有限制。而且由于您生成的地址太长,它会导致false
  • 谢谢,我从不同的地方编译了上一次“更新”,但忘了修正引号。至于“电子邮件地址限制”,从您提供的链接中,它必须是 254 个符号。但64 + 1 + 64 + 4 = 133 远不止于此。
  • php/php-src来看,最大邮件地址长度为320个字符。这意味着它与regexp1 不匹配。
【解决方案2】:

您可以使用此功能生成符合最多 64 个字符的本地部分和最多 255 个字符的域部分的随机电子邮件地址。

     <?php

        function generateEmailAddress($maxLenLocal=64, $maxLenDomain=255){
            $numeric        =  '0123456789';
            $alphabetic     = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            $extras         = '.-_';
            $all            = $numeric . $alphabetic . $extras;
            $alphaNumeric   = $alphabetic . $numeric;
            $alphaNumericP  = $alphabetic . $numeric . "-";
            $randomString   = '';

            // GENERATE 1ST 4 CHARACTERS OF THE LOCAL-PART
            for ($i = 0; $i < 4; $i++) {
                $randomString .= $alphabetic[rand(0, strlen($alphabetic) - 1)];
            }
            // GENERATE A NUMBER BETWEEN 20 & 60
            $rndNum         = rand(20, $maxLenLocal-4);

            for ($i = 0; $i < $rndNum; $i++) {
                $randomString .= $all[rand(0, strlen($all) - 1)];
            }

            // ADD AN @ SYMBOL...
            $randomString .= "@";

            // GENERATE DOMAIN NAME - INITIAL 3 CHARS:
            for ($i = 0; $i < 3; $i++) {
                $randomString .= $alphabetic[rand(0, strlen($alphabetic) - 1)];
            }

            // GENERATE A NUMBER BETWEEN 15 & $maxLenDomain-7
            $rndNum2        = rand(15, $maxLenDomain-7);
            for ($i = 0; $i < $rndNum2; $i++) {
                $randomString .= $all[rand(0, strlen($all) - 1)];
            }
            // ADD AN DOT . SYMBOL...
            $randomString .= ".";

            // GENERATE TLD: 4
            for ($i = 0; $i < 4; $i++) {
                $randomString .= $alphaNumeric[rand(0, strlen($alphaNumeric) - 1)];
            }

            return $randomString;

        }


        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());
        var_dump(generateEmailAddress());

【讨论】:

  • 生成的电子邮件地址未通过filter_var(..., FILTER_VALIDATE_EMAIL) 测试。
【解决方案3】:

引用the link Justinas 提供的更多内容:

电子邮件地址的格式是 local-part@domain 其中本地部分可能最多 64 个字符可能最多 255 个字符 - 但正向或反向路径的最大 256 个字符长度限制 整个电子邮件地址 不超过 254 个字符长

现在,如果我们查看filter_varsource,我们会发现那里基本上有两个检查:

  1. 如果整个电子邮件地址是longer than 320 symbols
  2. 如果它匹配the regex(除非我们指定FILTER_FLAG_EMAIL_UNICODE标志)

正则表达式可以改写如下:

/^
  ### check if total length is no more than 254 symbols
  (?!
    (?:
      (?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)
      |
      (?:\\x22?[^\\x5C\\x22]\\x22?)
    ){255,}
  )
  ### check if the part before @ is no more than 64 symbols
  (?!
    (?:
      (?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)
      |
      (?:\\x22?[^\\x5C\\x22]\\x22?)
    ){65,}
    @
  )
  (?:
    (?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)
    |
    (?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)
  )
  (?:
    \\.
    (?:
      (?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)
      |
      (?:
        \\x22
        (?:
          [\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]
          |
          (?:\\x5C[\\x00-\\x7F])
        )*
        \\x22
      )
    )
  )*
  @
  (?:
    (?:
      ### no segment must be longer than 64 symbols
      (?!.*[^.]{64,})
      (?:
        (?:
          (?:xn--)?
          [a-z0-9]+
          (?:-+[a-z0-9]+)*
          \\.
        ){1,126}
      ){1,}
      (?:
        (?:[a-z][a-z0-9]*)
        |
        (?:(?:xn--)[a-z0-9]+)
      )
      (?:-+[a-z0-9]+)*
    )
    |
    ### ip
    (?:
      \\[
      (?:
        (?:
          IPv6:
          (?:
            (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})
            |
            (?:
              (?!(?:.*[a-f0-9][:\\]]){7,})
              (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?
              ::
              (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?
            )
          )
        )
        |
        (?:
          (?:
            IPv6:
            (?:
              (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)
              |
              (?:
                (?!(?:.*[a-f0-9]:){5,})
                (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?
                ::
                (?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?
              )
            )
          )?
          (?:
            (?:25[0-5])
            |
            (?:2[0-4][0-9])
            |
            (?:1[0-9]{2})
            |
            (?:[1-9]?[0-9])
          )
          (?:
            \\.
            (?:
              (?:25[0-5])
              |
              (?:2[0-4][0-9])
              |
              (?:1[0-9]{2})
              |
              (?:[1-9]?[0-9])
            )
          ){3}
        )
      )
      \\]
    )
  )
$/iD

知道我们能得到的最好的是:

$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat(str_repeat("g", 63) . ".", 2) . str_repeat("g", 61), FILTER_VALIDATE_EMAIL));'
Command line code:1:
string(254) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg.ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg.ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat(str_repeat("g", 63) . ".", 2) . str_repeat("g", 62), FILTER_VALIDATE_EMAIL));'
Command line code:1:
bool(false)

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2015-11-19
    • 1970-01-01
    • 2021-07-03
    • 2021-01-02
    相关资源
    最近更新 更多