Reject Excess 8-Bit Characters

Much of the spam email that arrives from the Far East (especially Korea and China) is sent with Subject: headers that contain unencoded 8-bit characters. Because 8-bit characters in the Subject: header are illegal, it is perfectly OK to reject such email.

In this section we show you how to write a routine that can reject 8-bit Subject: headers using the checkcompat( ) routine. In the following example, the numbers to the left are for reference and are not a part of the code.

1  int
2  checkcompat(to, e)
3          register ADDRESS *to;
4          register ENVELOPE *e;
5  {
6          char *cp, *h;
7          int len, cnt;
8   
9          if (!bitnset(M_LOCALMAILER, to->q_mailer->m_flags))
10                 return EX_OK;
11  
12         if ((h = hvalue("subject", e->e_header)) =  = NULL)
13                 return EX_OK;
14        
15         if ((len = strlen(h)) =  = 0)
16                 return EX_OK;
17
18         cnt = 0;
19         for (cp = h; *cp != ''; ++cp)
20         {
21                 if ((*cp & 0x80) != 0)
22                         ++cnt;
23         }
24         if ((cnt * 2) > len)
25         {
26                 e->e_flags |= EF_NO_BODY_RETN;
27                 e->e_message = "553 Cannot accept eight-bit subjects";
28                 to->q_status = "5.7.1";
29                 return EX_UNAVAILABLE;
30         }
31         return EX_OK;
32 }

We begin (line 2) by declaring checkcompat( ) the same way it is declared inside conf.c. The two arguments (*to and *e) passed to it are described in the first section of this appendix.

Our routine for rejecting 8-bit characters in the Subject: header requires four local variables (line 6). The *h will point to the value of the Subject: header. The *cp will be walked through *h looking ...

Get Sendmail, 3rd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.