eSQ,SrSSKJr SSKJr SSKJr SSKJr "SS5r"SS 5r "S S \ 5r S r "S S5r "SS\ 5r"SS5r"SS\5r"SS5r"SS\5r"SS\5r"SS\5r"SS5r"SS 5r"S!S"\5r"S#S$\5r"S%S&5r"S'S(5r0S)\_S*\_S+\_S,\_S-\_S.\_S/\_S0\_S1\_S2\_S3\_S4\_S5\_S6\_S7\_S8\_S9\_\\\S:.Er"S;S<5rg=)>zRepresenting and manipulating email headers via custom objects. This module provides an implementation of the HeaderRegistry API. The implementation is designed to flexibly follow RFC5322 rules. )MappingProxyType)utils)errors)_header_value_parsercp\rSrSrS Sjr\S5r\S5r\S5r\S5r Sr S r S r S r g) Address Nc SR[SXX4455nSU;dSU;a [S5eUbU(dU(a [S5e[R "U5upgU(a[SR Xd55eUR(aURSeURnURnXl X l X0l g) aCreate an object representing a full email address. An address can have a 'display_name', a 'username', and a 'domain'. In addition to specifying the username and domain separately, they may be specified together by using the addr_spec keyword *instead of* the username and domain keywords. If an addr_spec string is specified it must be properly quoted according to RFC 5322 rules; an error will be raised if it is not. An Address object has display_name, username, domain, and addr_spec attributes, all of which are read-only. The addr_spec and the string value of the object are both quoted according to RFC5322 rules, but without any Content Transfer Encoding. N  z8invalid arguments; address parts cannot contain CR or LFz=addrspec specified when username and/or domain also specifiedz6Invalid addr_spec; only '{}' could be parsed from '{}'r) joinfilter ValueError TypeErrorparser get_addr_specformat all_defects local_partdomain _display_name _username_domain)self display_nameusernamer addr_specinputsa_srests :/opt/imh/python3.13/lib/python3.13/email/headerregistry.py__init__Address.__init__s"|v&QRS 6>TV^WX X  6!899,,Y7IC "==CV$'>455ooa((~~HZZF)! cUR$Nrrs r"rAddress.display_name8!!!r%cUR$r')rr)s r"rAddress.username< ~~r%cUR$r')rr)s r"rAddress.domain@ ||r%cURn[RRU5(d[R"U5nUR (aUS-UR -$U(dgU$)zThe addr_spec (username@domain) portion of the address, quoted according to RFC 5322 rules, but with no Content Transfer Encoding. @<>)rr DOT_ATOM_ENDS isdisjoint quote_stringr)rlps r"rAddress.addr_specDsY ]]##..r22$$R(B ;;8dkk) ) r%cSRURRURURUR 5$)Nz1{}(display_name={!r}, username={!r}, domain={!r}))r __class____name__rrrr)s r"__repr__Address.__repr__Rs9BII//))4==$++G Gr%cURn[RRU5(d[R"U5nU(a/UR S:XaSO UR nSR X5$UR $)Nr4r z{} <{}>)rrSPECIALSr6r7rr)rdisprs r"__str__Address.__str__Wsf  ))$//&&t,D "nnd2I##D4 4~~r%c[U[5(d[$URUR:H=(a9 URUR:H=(a UR UR :H$r') isinstancerNotImplementedrrrrothers r"__eq__Address.__eq__`sX%))! !!!U%7%77, /, u||+ -r%)rrr)r r r N)r< __module__ __qualname____firstlineno__r#propertyrrrrr=rBrI__static_attributes__r%r"rr sh(T""  G -r%rcP\rSrSrS Sjr\S5r\S5rSrSr Sr S r g) GrouphNc^XlU(a[U5Ulg[5Ulg)aCreate an object representing an address group. An address group consists of a display_name followed by colon and a list of addresses (see Address) terminated by a semi-colon. The Group is created by specifying a display_name and a possibly empty list of Address objects. A Group can also be used to represent a single address that is not in a group, which is convenient when manipulating lists that are a combination of Groups and individual Addresses. In this case the display_name should be set to None. In particular, the string representation of a Group whose display_name is None is the same as the Address object, if there is one and only one Address object in the addresses list. N)rtuple _addresses)rr addressess r"r#Group.__init__js *.7% *UWr%cUR$r'r(r)s r"rGroup.display_name|r+r%cUR$r')rVr)s r"rWGroup.addressess r%cxSRURRURUR5$)Nz${}(display_name={!r}, addresses={!r})rr;r<rrWr)s r"r=Group.__repr__s15<<((""DNN4 4r%cURc1[UR5S:Xa[URS5$URnUb:[R R U5(d[R"U5nSRSUR55nU(aSU-OUnSRX5$)Nr, c38# UHn[U5v M g7fr')str).0xs r" Group.__str__..s:>a3q66>s z{}:{};) rlenrWrcrr@r6r7rr)rrAadrstrs r"rB Group.__str__s    $T^^)$>t$D$D&&t,D:4>>::!'vVt,,r%c[U[5(d[$URUR:H=(a URUR:H$r')rErRrFrrWrGs r"rI Group.__eq__sC%''! !!!U%7%772%//1 3r%)rVr)NN) r<rKrLrMr#rNrrWr=rBrIrOrPr%r"rRrRhs?E$""4 -3r%rRc`\rSrSrSrSrSr\S5r\S5r Sr \ S5r S r S rg ) BaseHeaderaBase class for message headers. Implements generic behavior and provides tools for subclasses. A subclass must define a classmethod named 'parse' that takes an unfolded value string and a dictionary as its arguments. The dictionary will contain one key, 'defects', initialized to an empty list. After the call the dictionary must contain two additional keys: parse_tree, set to the parse tree obtained from parsing the header, and 'decoded', set to the string value of the idealized representation of the data from the value. (That is, encoded words are decoded, and values that have canonical representations are so represented.) The defects key is intended to collect parsing defects, which the message parser will subsequently dispose of as appropriate. The parser should not, insofar as practical, raise any errors. Defects should be added to the list instead. The standard header parsers register defects for RFC compliance issues, for obsolete RFC syntax, and for unrecoverable parsing errors. The parse method may add additional keys to the dictionary. In this case the subclass must define an 'init' method, which will be passed the dictionary as its keyword arguments. The method should use (usually by setting them as the value of similarly named attributes) and remove all the extra keys added by its parse method, and then use super to call its parent class with the remaining arguments and keywords. The subclass should also make sure that a 'max_count' attribute is defined that is either None or 1. XXX: need to better define this API. cS/0nURX#5 [R"US5(a[R"US5US'[R XS5nUS UR "U40UD6 U$)Ndefectsdecoded)parser_has_surrogates _sanitizerc__new__init)clsnamevaluekwdsrs r"rwBaseHeader.__new__sq2 %  i 1 1#ood9o>DO{{3Y0 O $$ r%c(XlX lX0lgr')_name _parse_tree_defects)rrz parse_treerrs r"rxBaseHeader.inits % r%cUR$r')rr)s r"rzBaseHeader.names zzr%c,[UR5$r')rUrr)s r"rrBaseHeader.defectssT]]##r%c[URRURR[ U54UR 54$r')_reconstruct_headerr;r< __bases__rc __getstate__r)s r" __reduce__BaseHeader.__reduce__sC ''((D      ! !r%c,[RX5$r')rcrw)ryr{s r" _reconstructBaseHeader._reconstructs{{3&&r%c [R"[R"[R"URS5[R"SS5/5/5nUR (a;UR [R"[R"SS5/55 UR UR 5 URUS9$)a$Fold header according to policy. The parsed representation of the header is folded according to RFC5322 rules, as modified by the policy. If the parse tree contains surrogateescaped bytes, the bytes are CTE encoded using the charset 'unknown-8bit". Any non-ASCII characters in the parse tree are CTE encoded using charset utf-8. XXX: make this a policy setting. The returned value is an ASCII-only string possibly containing linesep characters, and ending with a linesep character. The string includes the header name and the ': ' separator. z header-name:z header-seprhfws)policy) rHeader HeaderLabel ValueTerminalrzrappendCFWSListWhiteSpaceTerminalfold)rrheaders r"rBaseHeader.folds"   $$TYY >$$S,7 9 :     MM!:!:3!F GH J d&&'{{&{))r%)rrrN)r<rKrLrM__doc__rwrxrNrzrrr classmethodrrrOrPr%r"rorosX@ $$!''*r%roc8[X05RU5$r')typer)cls_namebasesr{s r"rrs  $ 1 1% 88r%cL\rSrSrSr\"\R5r\ S5r Sr g)UnstructuredHeaderiNcNURU5US'[US5US'g)Nrrs) value_parserrcryr{r|s r"rtUnstructuredHeader.parse s* --e4\d<01Yr%rP) r<rKrLrM max_count staticmethodrget_unstructuredrrrtrOrPr%r"rrs)I 7 78L22r%rc\rSrSrSrSrg)UniqueUnstructuredHeaderir`rPNr<rKrLrMrrOrPr%r"rrIr%rct^\rSrSrSrSr\"\R5r \ S5r U4Sjr \ S5rSrU=r$) DateHeaderiayHeader whose value consists of a single timestamp. Provides an additional attribute, datetime, which is either an aware datetime using a timezone, or a naive datetime if the timezone in the input string is -0000. Also accepts a datetime as input. The 'value' attribute is the normalized form of the timestamp, which means it is the output of format_datetime on the datetime. NcU(dJUSR[R"55 SUS'SUS'[R"5US'g[ U[ 5(aXS'[R"U5nXS'[R"US5US'URUS5US'g![aH USR[R"S55 SUS'[R"5US'gf=f)Nrrdatetimer rsrzInvalid date value or format) rrHeaderMissingRequiredValuer TokenListrErcrparsedate_to_datetimerInvalidDateDefectformat_datetimerrs r"rtDateHeader.parse$s O " "6#D#D#F G#D  DO!'!1!1!3D   eS ! !#O 33E: !Z//Z0@AY --d9o>\ Y&&v'?'?@^'_`#'Z %+%5%5%7\"  s,B::AD  D cR>URS5Ul[TU] "U0UD6 g)Nr)pop _datetimesuperrxrargskwr;s r"rxDateHeader.init9s$ +  d!b!r%cUR$r'rr)s r"rDateHeader.datetime=r.r%r)r<rKrLrMrrrrrrrrtrxrNrrO __classcell__r;s@r"rrsLI  7 78L??("r%rc\rSrSrSrSrg)UniqueDateHeaderiBr`rPNrrPr%r"rrBrr%rcl^\rSrSrSr\S5r\S5rU4Sjr \ S5r \ S5r Sr U=r$) AddressHeaderiGNcR[R"U5upU(aS5eU$)Nzthis should not happen)rget_address_list)r{ address_lists r"rAddressHeader.value_parserKs)$55e< 222yr%c [U[5(aURU5=US'n/nURHnUR [ UR URVs/sHIn[UR =(d SUR=(d SUR=(d S5PMK sn55 M [UR5nOF[US5(dU/nUVs/sH#n[US5(d [ SU/5OUPM% nn/nXBS'XrS'SRUVs/sHn[U5PM sn5US'SU;aURUS5US'ggs snfs snfs snf) Nrr __iter__rWgroupsrrrars)rErcrrWrrRr all_mailboxesrrrlistrhasattrr) ryr{r|rraddrmbrritems r"rtAddressHeader.parseQs eS ! !140@0@0G GD F$.. eD$5$504/A/A%C0B&-R__-B-/]]-@b-/YY_"&>0B%CDE/ <334G5*--1670529{1K1KeD4&)/3405 7GX!Y))6$B64SY6$BCY t #!$!1!1$y/!BD  $!%C7 %Cs&AE63*E;8Fcr>[URS55UlSUl[TU]"U0UD6 g)Nr)rUr_groupsrVrrxrs r"rxAddressHeader.initms0RVVH-.   d!b!r%cUR$r')rr)s r"rAddressHeader.groupsrr1r%cvURc![SUR55UlUR$)Nc3N# UHnURHnUv M M g7fr')rW)rdgroupaddresss r"rf*AddressHeader.addresses..ys'$L;@??%,;J%,s#%)rVrUrr)s r"rWAddressHeader.addressesvs5 ?? "#$L$LLDOr%)rVr)r<rKrLrMrrrrrtrxrNrrWrOrrs@r"rrGs]I CC6" r%rc\rSrSrSrSrg)UniqueAddressHeaderi~r`rPNrrPr%r"rr~rr%rc$\rSrSr\S5rSrg)SingleAddressHeaderic[UR5S:wa$[SRUR55eURS$)Nr`z9value of single address header {} is not a single addressr)rirWrrrzr)s r"rSingleAddressHeader.addresssB t~~  !#$*F499$57 7~~a  r%rPN)r<rKrLrMrNrrOrPr%r"rrs !!r%rc\rSrSrSrSrg)UniqueSingleAddressHeaderir`rPNrrPr%r"rrrr%rc^\rSrSrSr\"\R5r\ S5r U4Sjr \ S5r \ S5r\ S5rSrU=r$) MIMEVersionHeaderir`c>URU5=US'n[U5US'USRUR5 URcSO UR US'URUS'URbSR USUS5US'gSUS'g)Nrrsrrmajorminorz{}.{}version)rrcextendrrrrryr{r|rs r"rtMIMEVersionHeader.parses*-*:*:5*AA\Zj/Y Yz556 * 0 0 8j>N>NW "((W    '%nnT']DMJDO"DOr%c>URS5UlURS5UlURS5Ul[TU]"U0UD6 g)Nrrr)r_version_major_minorrrxrs r"rxMIMEVersionHeader.initsBy) ffWo ffWo   d!b!r%cUR$r')rr)s r"rMIMEVersionHeader.major {{r%cUR$r')rr)s r"rMIMEVersionHeader.minorrr%cUR$r')rr)s r"rMIMEVersionHeader.version }}r%)rrr)r<rKrLrMrrrparse_mime_versionrrrtrxrNrrrrOrrs@r"rrskI 9 9:L # #" r%rcL^\rSrSrSr\S5rU4Sjr\S5r Sr U=r $)ParameterizedMIMEHeaderir`cpURU5=US'n[U5US'USRUR5 URc0US'gURVVs0sH>upA[ R "U5R5[ R "U5_M@ snnUS'gs snnf)Nrrsrrparams)rrcrrrrrvlower)ryr{r|rrzs r"rtParameterizedMIMEHeader.parses*-*:*:5*AA\Zj/Y Yz556    $DN 3=2C2CE2C;4$ood399;$)OOE$:;2CEDNEs%AB2cR>URS5Ul[TU] "U0UD6 g)Nr)r_paramsrrxrs r"rxParameterizedMIMEHeader.inits$vvh'   d!b!r%c,[UR5$r')rr r)s r"rParameterizedMIMEHeader.paramss --r%)r ) r<rKrLrMrrrtrxrNrrOrrs@r"rrs7 I E E"..r%rc|^\rSrSr\"\R 5rU4Sjr\ S5r \ S5r \ S5r Sr U=r$)ContentTypeHeaderic>[TU]"U0UD6 [R"URR 5Ul[R"URR5Ulgr') rrxrrvrmaintype _maintypesubtype_subtypers r"rxContentTypeHeader.initsL  d!b!)9)9)B)BC(8(8(@(@A r%cUR$r')rr)s r"rContentTypeHeader.maintyper.r%cUR$r')rr)s r"rContentTypeHeader.subtyperr%c:URS-UR-$)N/)rrr)s r" content_typeContentTypeHeader.content_types}}s"T\\11r%)rr)r<rKrLrMrrparse_content_type_headerrrxrNrrrrOrrs@r"rrsU @ @ALB 22r%rc\^\rSrSr\"\R 5rU4Sjr\ S5r Sr U=r $)ContentDispositionHeaderic>[TU]"U0UD6 URRnUcX0lg[R "U5Ulgr')rrxrcontent_dispositionrrv_content_disposition)rrrcdr;s r"rxContentDispositionHeader.inits?  d!b!    1 1*,*B!%//":M!r%cUR$r'r$r)s r"r#,ContentDispositionHeader.content_dispositions(((r%r() r<rKrLrMrr parse_content_disposition_headerrrxrNr#rOrrs@r"r!r!s- G GHLN ))r%r!cp^\rSrSrSr\"\R5r\ S5r U4Sjr \ S5r SrU=r$)ContentTransferEncodingHeaderir`cURU5=US'n[U5US'USRUR5 gNrrsrrrrcrrrs r"rt#ContentTransferEncodingHeader.parseA*-*:*:5*AA\Zj/Y Yz556r%c>[TU]"U0UD6 [R"URR 5Ulgr')rrxrrvrcte_cters r"rx"ContentTransferEncodingHeader.inits0  d!b!OOD$4$4$8$89 r%cUR$r'r4r)s r"r3!ContentTransferEncodingHeader.ctes yyr%r7)r<rKrLrMrrr&parse_content_transfer_encoding_headerrrrtrxrNr3rOrrs@r"r,r,sCI M MNL77 :r%r,cL\rSrSrSr\"\R5r\ S5r Sr g)MessageIDHeaderi r`cURU5=US'n[U5US'USRUR5 gr.r/rs r"rtMessageIDHeader.parser1r%rPN) r<rKrLrMrrrparse_message_idrrrtrOrPr%r"r;r; s)I 7 78L77r%r;subjectdatez resent-datez orig-datesenderz resent-sendertoz resent-toccz resent-ccbccz resent-bccfromz resent-fromzreply-toz mime-versionz content-type)zcontent-dispositionzcontent-transfer-encodingz message-idc:\rSrSrSr\\S4SjrSrSr Sr Sr g ) HeaderRegistryi2z%A header_factory and header registry.Tcx0UlXlX lU(a URR[5 gg)aCreate a header_factory that works with the Policy API. base_class is the class that will be the last class in the created header class's __bases__ list. default_class is the class that will be used if "name" (see __call__) does not appear in the registry. use_default_map controls whether or not the default mapping of names to specialized classes is copied in to the registry when the factory is created. The default is True. N)registry base_class default_classupdate_default_header_map)rrJrKuse_default_maps r"r#HeaderRegistry.__init__6s1 $*  MM !4 5 r%c<X RUR5'g)zLRegister cls as the specialized class for handling "name" headers. N)rIrrrzrys r" map_to_typeHeaderRegistry.map_to_typeHs'* djjl#r%cURRUR5UR5n[ SUR -X R 405$)N_)rIgetrrKrr<rJrQs r" __getitem__HeaderRegistry.__getitem__NsCmm d.@.@AC $sOO&r^s #0Y-Y-x/3/3ha*a*H9221 ++\z 44n- !-! 3 ""J..:2/2, )6 )* 7 7 $< $4J$4   $=  $7  $7M $7M $7M $7M$7 $5!"$5#$%=$A$3).*'*'r%