[Pymilter] Change Body from header in a mail (newbie question)

Abhijeet Rastogi abhijeet.1989 at gmail.com
Fri May 10 02:53:23 EDT 2013


Hi Stuart,

Thanks for the reply. I finally got what I wanted, thanks to you. May
I know where is it documented that what all functions can only be
called from "eom" function?


On Fri, May 10, 2013 at 10:13 AM, Stuart D Gathman <stuart at bmsi.com> wrote:
> On May 9, Abhijeet Rastogi transmitted in part:
>
>
>> As we know, there are two "from" in a mail. The actual envelope
>> mailfrom and the body from. I'm trying to change body "from" whenver
>> "envelope mailfrom" and "body from" don't match.
>
>
> A questionable goal, but certainly easy.
>
>
>> For that, I picked the official example.
>> http://pythonhosted.org/pymilter/milter-template_8py-example.html and
>> edited the below code.
>>
>>  def header(self, name, hval):
>>    if name == "From":
>>        if self.F != hval:
>>            self.log("<" + hval.strip("<>") + "via " + self.F.strip("<>") +
>> ">")
>>            hval = hval + "via" + self.F
>>
>>    self.fp.write("%s: %s\n" % (name,hval))     # add header to buffer
>>    return Milter.CONTINUE
>>
>> I can see by adding "self.log" statements that the header is actually
>> being changed but when I receive the mail, I still see the original
>> body from. Why can that be so? I even tried the
>> "Milter.set_flags(Milter.CURR_ACTS)", still it's not changing the body
>> from.
>
>
> Because you are only changing the copy of the header in your internal
> buffer.  I added that buffer to the example because people kept asking,
> "How do I collect all the headers to make a complete email (e.g. for
> archiving)?"
>
>
>> It's my first milter writing experience and I'm stuck at this. Any
>> help would be highly appreciated.
>
>
> Use chgheader to change the header in the MTA:
>
> http://pythonhosted.org/pymilter/classMilter_1_1Base.html#a2debae177f22c9ae4c53644280a2cd10
>
> Note that chgheader can only be called from eom.  In the bms.py milter,
> I use a helper method:
>
>   # addheader can only be called from eom().  This accumulates added
>   # headers which can then be applied by alter_headers() in eom().
>   def add_header(self,name,val,idx=-1):
>     self.new_headers.append((name,val,idx))
>     self.log('%s: %s' % (name,val))
>
> Additional hooks may be needed in eoh() to add the new headers to your
> internal buffer, if used.
>
> I did not implement chg_header (or even fully implement add_header), but
> the same idea applies.  You might consider it for future milters.
>
> In your case, I would just set self.from_header = None in envfrom(),
> and set it to the desired value according to your logic if it needs
> changing.  Then in eom():
>
>   def eom():
>     if self.from_header:
>       self.chgheader('from',0,self.from_header)
>     ...



-- 
Regards,
Abhijeet Rastogi (shadyabhi)
http://blog.abhijeetr.com

<!DSPAM:13E8D380B3B84551045486310>




More information about the Pymilter mailing list