prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  [SES] Does not properly verify mailbox with display name
  https://tools.ietf.org/html/rfc2822.html#section-3.4 defines two forms of valid mailbox:
  
  * `foo@example.com`
  * `"Foo Bar" <foo@example.com>`
  
  SES supports both of these forms. Per https://github.com/spulec/moto/blob/master/moto/ses/models.py#L55, only the first form is supported by moto.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `moto/ses/models.py`
  Content:
  ```
  1 from __future__ import unicode_literals
  2 
  3 import email
  4 from email.utils import parseaddr
  5 
  6 from moto.core import BaseBackend, BaseModel
  7 from .exceptions import MessageRejectedError
  8 from .utils import get_random_message_id
  9 
  10 
  11 RECIPIENT_LIMIT = 50
  12 
  13 
  14 class Message(BaseModel):
  15 
  16     def __init__(self, message_id, source, subject, body, destinations):
  17         self.id = message_id
  18         self.source = source
  19         self.subject = subject
  20         self.body = body
  21         self.destinations = destinations
  22 
  23 
  24 class RawMessage(BaseModel):
  25 
  26     def __init__(self, message_id, source, destinations, raw_data):
  27         self.id = message_id
  28         self.source = source
  29         self.destinations = destinations
  30         self.raw_data = raw_data
  31 
  32 
  33 class SESQuota(BaseModel):
  34 
  35     def __init__(self, sent):
  36         self.sent = sent
  37 
  38     @property
  39     def sent_past_24(self):
  40         return self.sent
  41 
  42 
  43 class SESBackend(BaseBackend):
  44 
  45     def __init__(self):
  46         self.addresses = []
  47         self.email_addresses = []
  48         self.domains = []
  49         self.sent_messages = []
  50         self.sent_message_count = 0
  51 
  52     def _is_verified_address(self, address):
  53         if address in self.addresses:
  54             return True
  55         user, host = address.split('@', 1)
  56         return host in self.domains
  57 
  58     def verify_email_identity(self, address):
  59         self.addresses.append(address)
  60 
  61     def verify_email_address(self, address):
  62         self.email_addresses.append(address)
  63 
  64     def verify_domain(self, domain):
  65         self.domains.append(domain)
  66 
  67     def list_identities(self):
  68         return self.domains + self.addresses
  69 
  70     def list_verified_email_addresses(self):
  71         return self.email_addresses
  72 
  73     def delete_identity(self, identity):
  74         if '@' in identity:
  75             self.addresses.remove(identity)
  76         else:
  77             self.domains.remove(identity)
  78 
  79     def send_email(self, source, subject, body, destinations):
  80         recipient_count = sum(map(len, destinations.values()))
  81         if recipient_count > RECIPIENT_LIMIT:
  82             raise MessageRejectedError('Too many recipients.')
  83         if not self._is_verified_address(source):
  84             raise MessageRejectedError(
  85                 "Email address not verified %s" % source
  86             )
  87 
  88         message_id = get_random_message_id()
  89         message = Message(message_id, source, subject, body, destinations)
  90         self.sent_messages.append(message)
  91         self.sent_message_count += recipient_count
  92         return message
  93 
  94     def send_raw_email(self, source, destinations, raw_data):
  95         if source is not None:
  96             _, source_email_address = parseaddr(source)
  97             if source_email_address not in self.addresses:
  98                 raise MessageRejectedError(
  99                     "Did not have authority to send from email %s" % source_email_address
  100                 )
  101 
  102         recipient_count = len(destinations)
  103         message = email.message_from_string(raw_data)
  104         if source is None:
  105             if message['from'] is None:
  106                 raise MessageRejectedError(
  107                     "Source not specified"
  108                 )
  109 
  110             _, source_email_address = parseaddr(message['from'])
  111             if source_email_address not in self.addresses:
  112                 raise MessageRejectedError(
  113                     "Did not have authority to send from email %s" % source_email_address
  114                 )
  115 
  116         for header in 'TO', 'CC', 'BCC':
  117             recipient_count += sum(
  118                 d.strip() and 1 or 0
  119                 for d in message.get(header, '').split(',')
  120             )
  121         if recipient_count > RECIPIENT_LIMIT:
  122             raise MessageRejectedError('Too many recipients.')
  123 
  124         self.sent_message_count += recipient_count
  125         message_id = get_random_message_id()
  126         message = RawMessage(message_id, source, destinations, raw_data)
  127         self.sent_messages.append(message)
  128         return message
  129 
  130     def get_send_quota(self):
  131         return SESQuota(self.sent_message_count)
  132 
  133 
  134 ses_backend = SESBackend()
  135
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/moto/ses/models.py b/moto/ses/models.py
  --- a/moto/ses/models.py
  +++ b/moto/ses/models.py
  @@ -49,7 +49,8 @@
           self.sent_messages = []
           self.sent_message_count = 0
   
  -    def _is_verified_address(self, address):
  +    def _is_verified_address(self, source):
  +        _, address = parseaddr(source)
           if address in self.addresses:
               return True
           user, host = address.split('@', 1)
  
verification_info: {"golden_diff": "diff --git a/moto/ses/models.py b/moto/ses/models.py\n--- a/moto/ses/models.py\n+++ b/moto/ses/models.py\n@@ -49,7 +49,8 @@\n         self.sent_messages = []\n         self.sent_message_count = 0\n \n-    def _is_verified_address(self, address):\n+    def _is_verified_address(self, source):\n+        _, address = parseaddr(source)\n         if address in self.addresses:\n             return True\n         user, host = address.split('@', 1)\n", "issue": "[SES] Does not properly verify mailbox with display name\nhttps://tools.ietf.org/html/rfc2822.html#section-3.4 defines two forms of valid mailbox:\r\n\r\n* `foo@example.com`\r\n* `\"Foo Bar\" <foo@example.com>`\r\n\r\nSES supports both of these forms. Per https://github.com/spulec/moto/blob/master/moto/ses/models.py#L55, only the first form is supported by moto.\n", "before_files": [{"content": "from __future__ import unicode_literals\n\nimport email\nfrom email.utils import parseaddr\n\nfrom moto.core import BaseBackend, BaseModel\nfrom .exceptions import MessageRejectedError\nfrom .utils import get_random_message_id\n\n\nRECIPIENT_LIMIT = 50\n\n\nclass Message(BaseModel):\n\n    def __init__(self, message_id, source, subject, body, destinations):\n        self.id = message_id\n        self.source = source\n        self.subject = subject\n        self.body = body\n        self.destinations = destinations\n\n\nclass RawMessage(BaseModel):\n\n    def __init__(self, message_id, source, destinations, raw_data):\n        self.id = message_id\n        self.source = source\n        self.destinations = destinations\n        self.raw_data = raw_data\n\n\nclass SESQuota(BaseModel):\n\n    def __init__(self, sent):\n        self.sent = sent\n\n    @property\n    def sent_past_24(self):\n        return self.sent\n\n\nclass SESBackend(BaseBackend):\n\n    def __init__(self):\n        self.addresses = []\n        self.email_addresses = []\n        self.domains = []\n        self.sent_messages = []\n        self.sent_message_count = 0\n\n    def _is_verified_address(self, address):\n        if address in self.addresses:\n            return True\n        user, host = address.split('@', 1)\n        return host in self.domains\n\n    def verify_email_identity(self, address):\n        self.addresses.append(address)\n\n    def verify_email_address(self, address):\n        self.email_addresses.append(address)\n\n    def verify_domain(self, domain):\n        self.domains.append(domain)\n\n    def list_identities(self):\n        return self.domains + self.addresses\n\n    def list_verified_email_addresses(self):\n        return self.email_addresses\n\n    def delete_identity(self, identity):\n        if '@' in identity:\n            self.addresses.remove(identity)\n        else:\n            self.domains.remove(identity)\n\n    def send_email(self, source, subject, body, destinations):\n        recipient_count = sum(map(len, destinations.values()))\n        if recipient_count > RECIPIENT_LIMIT:\n            raise MessageRejectedError('Too many recipients.')\n        if not self._is_verified_address(source):\n            raise MessageRejectedError(\n                \"Email address not verified %s\" % source\n            )\n\n        message_id = get_random_message_id()\n        message = Message(message_id, source, subject, body, destinations)\n        self.sent_messages.append(message)\n        self.sent_message_count += recipient_count\n        return message\n\n    def send_raw_email(self, source, destinations, raw_data):\n        if source is not None:\n            _, source_email_address = parseaddr(source)\n            if source_email_address not in self.addresses:\n                raise MessageRejectedError(\n                    \"Did not have authority to send from email %s\" % source_email_address\n                )\n\n        recipient_count = len(destinations)\n        message = email.message_from_string(raw_data)\n        if source is None:\n            if message['from'] is None:\n                raise MessageRejectedError(\n                    \"Source not specified\"\n                )\n\n            _, source_email_address = parseaddr(message['from'])\n            if source_email_address not in self.addresses:\n                raise MessageRejectedError(\n                    \"Did not have authority to send from email %s\" % source_email_address\n                )\n\n        for header in 'TO', 'CC', 'BCC':\n            recipient_count += sum(\n                d.strip() and 1 or 0\n                for d in message.get(header, '').split(',')\n            )\n        if recipient_count > RECIPIENT_LIMIT:\n            raise MessageRejectedError('Too many recipients.')\n\n        self.sent_message_count += recipient_count\n        message_id = get_random_message_id()\n        message = RawMessage(message_id, source, destinations, raw_data)\n        self.sent_messages.append(message)\n        return message\n\n    def get_send_quota(self):\n        return SESQuota(self.sent_message_count)\n\n\nses_backend = SESBackend()\n", "path": "moto/ses/models.py"}], "after_files": [{"content": "from __future__ import unicode_literals\n\nimport email\nfrom email.utils import parseaddr\n\nfrom moto.core import BaseBackend, BaseModel\nfrom .exceptions import MessageRejectedError\nfrom .utils import get_random_message_id\n\n\nRECIPIENT_LIMIT = 50\n\n\nclass Message(BaseModel):\n\n    def __init__(self, message_id, source, subject, body, destinations):\n        self.id = message_id\n        self.source = source\n        self.subject = subject\n        self.body = body\n        self.destinations = destinations\n\n\nclass RawMessage(BaseModel):\n\n    def __init__(self, message_id, source, destinations, raw_data):\n        self.id = message_id\n        self.source = source\n        self.destinations = destinations\n        self.raw_data = raw_data\n\n\nclass SESQuota(BaseModel):\n\n    def __init__(self, sent):\n        self.sent = sent\n\n    @property\n    def sent_past_24(self):\n        return self.sent\n\n\nclass SESBackend(BaseBackend):\n\n    def __init__(self):\n        self.addresses = []\n        self.email_addresses = []\n        self.domains = []\n        self.sent_messages = []\n        self.sent_message_count = 0\n\n    def _is_verified_address(self, source):\n        _, address = parseaddr(source)\n        if address in self.addresses:\n            return True\n        user, host = address.split('@', 1)\n        return host in self.domains\n\n    def verify_email_identity(self, address):\n        self.addresses.append(address)\n\n    def verify_email_address(self, address):\n        self.email_addresses.append(address)\n\n    def verify_domain(self, domain):\n        self.domains.append(domain)\n\n    def list_identities(self):\n        return self.domains + self.addresses\n\n    def list_verified_email_addresses(self):\n        return self.email_addresses\n\n    def delete_identity(self, identity):\n        if '@' in identity:\n            self.addresses.remove(identity)\n        else:\n            self.domains.remove(identity)\n\n    def send_email(self, source, subject, body, destinations):\n        recipient_count = sum(map(len, destinations.values()))\n        if recipient_count > RECIPIENT_LIMIT:\n            raise MessageRejectedError('Too many recipients.')\n        if not self._is_verified_address(source):\n            raise MessageRejectedError(\n                \"Email address not verified %s\" % source\n            )\n\n        message_id = get_random_message_id()\n        message = Message(message_id, source, subject, body, destinations)\n        self.sent_messages.append(message)\n        self.sent_message_count += recipient_count\n        return message\n\n    def send_raw_email(self, source, destinations, raw_data):\n        if source is not None:\n            _, source_email_address = parseaddr(source)\n            if source_email_address not in self.addresses:\n                raise MessageRejectedError(\n                    \"Did not have authority to send from email %s\" % source_email_address\n                )\n\n        recipient_count = len(destinations)\n        message = email.message_from_string(raw_data)\n        if source is None:\n            if message['from'] is None:\n                raise MessageRejectedError(\n                    \"Source not specified\"\n                )\n\n            _, source_email_address = parseaddr(message['from'])\n            if source_email_address not in self.addresses:\n                raise MessageRejectedError(\n                    \"Did not have authority to send from email %s\" % source_email_address\n                )\n\n        for header in 'TO', 'CC', 'BCC':\n            recipient_count += sum(\n                d.strip() and 1 or 0\n                for d in message.get(header, '').split(',')\n            )\n        if recipient_count > RECIPIENT_LIMIT:\n            raise MessageRejectedError('Too many recipients.')\n\n        self.sent_message_count += recipient_count\n        message_id = get_random_message_id()\n        message = RawMessage(message_id, source, destinations, raw_data)\n        self.sent_messages.append(message)\n        return message\n\n    def get_send_quota(self):\n        return SESQuota(self.sent_message_count)\n\n\nses_backend = SESBackend()\n", "path": "moto/ses/models.py"}]}