@@ -728,6 +728,31 @@ def test_nonascii_add_header_with_tspecial(self):
728728            "attachment; filename*=utf-8''Fu%C3%9Fballer%20%5Bfilename%5D.ppt" ,
729729            msg ['Content-Disposition' ])
730730
731+     def  test_invalid_header_names (self ):
732+         invalid_headers  =  [
733+             ('Invalid Header' , 'contains space' ),
734+             ('Tab\t Header' , 'contains tab' ),
735+             ('Colon:Header' , 'contains colon' ),
736+             ('' , 'Empty name' ),
737+             (' LeadingSpace' , 'starts with space' ),
738+             ('TrailingSpace ' , 'ends with space' ),
739+             ('Header\x7F ' , 'Non-ASCII character' ),
740+             ('Header\x80 ' , 'Extended ASCII' ),
741+         ]
742+         for  policy  in  (email .policy .default , email .policy .compat32 ):
743+             for  setter  in  (Message .__setitem__ , Message .add_header ):
744+                 for  name , value  in  invalid_headers :
745+                     self .do_test_invalid_header_names (
746+                         policy , setter ,name , value )
747+ 
748+     def  do_test_invalid_header_names (self , policy , setter , name , value ):
749+         with  self .subTest (policy = policy , setter = setter , name = name , value = value ):
750+             message  =  Message (policy = policy )
751+             pattern  =  r'(?i)(?=.*invalid)(?=.*header)(?=.*name)' 
752+             with  self .assertRaisesRegex (ValueError , pattern ) as  cm :
753+                  setter (message , name , value )
754+             self .assertIn (f"{ name !r}  , str (cm .exception ))
755+ 
731756    def  test_binary_quopri_payload (self ):
732757        for  charset  in  ('latin-1' , 'ascii' ):
733758            msg  =  Message ()
0 commit comments