Pete's information junkyard

SmtpClient.cs fix

Na eindelijk de mailing van Willow 'altijd' goed te hebben, bleek na de laatste mailing dat er toch nog iets mis ging. Niet in mij eigen code, maar in de SMTP implementatie van Mono. Postfix, de mailserver die ik gebruikt, stelt dat elke regel in de mail, die met een punt begint, verdubbeld moet worden. Ge-escaped, zoals het heet. Dit, omdat volgens het protocol, het DATA deel van de e-mail, afgesloten moet worden met Cr+LF.Cr+LF. Dus een regel met een enkele punt. Na in het bestand /mcs/class/System/System.Net.Mail/SmtpClient.cs te hebben gekeken, blijkt dat de Mono implementatie dit niet zo doet. Mogelijk doet Mono dit, om 100% compatible te zijn met .Net, waarvan bekend is dat er bugs in de SMTP implementatie zitten.

Nou kan ik een alternatief implementeren, of Mono aanpassen. Ik heb gekozen voor het laatste. 100% .Net compatibiliteit vind ik niet interessant, maar dat mijn mail goed verstuurd wordt wel. Vandaar de onderstaande aanpassing in SmtpClient.cs

#define WILLOW_SMTP_FIX

private void SendData (string data) {
if (String.IsNullOrEmpty (data)) {
writer.Write("\r\n");
writer.Flush();
return;
}

StringReader sr = new StringReader (data);
string line;
bool escapeDots = deliveryMethod == SmtpDeliveryMethod.Network;
while ((line = sr.ReadLine ()) != null) {
CheckCancellation ();

if (escapeDots) {
#if WILLOW_SMTP_FIX
if (line.Length > 0 && line[0] == '.')
writer.Write ('.');
#else

int i;
for (i = 0; i < line.Length; i++) {
if (line[i] != '.')
break;
}
if (i > 0 && i == line.Length) {
line += ".";
}
#endif
}
writer.Write (line);
writer.Write ("\r\n");
}
writer.Flush ();
}

Tags: C# Mono Willow
Created on 02-02-2012






stopsoftwarepatents.eu petition banner