[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