views:

143

answers:

4

i have a strange problem with sending HTML mail in c#.

Basically i am trying to email myself the weather every morning and I begin by downloading the weather in HTML markup from an ftp site.

After obtaining the source file i then read it into a string and create a mailMessage using the following code.

string body = File.ReadAllText(@"C:\Weather.htm");

MailMessage mailMessage = new MailMessage();
SmtpClient mailClient = new SmtpClient("smtp.gmail.com");

mailClient.Credentials = new NetworkCredential(username, password);
mailClient.Port = 587;
mailClient.EnableSsl = true;
mailMessage.From = new MailAddress(emailFrom);
mailMessage.IsBodyHtml = true;    
mailMessage.To.Add(emailTo);
mailMessage.Subject = "Test Email";
mailMessage.SubjectEncoding = System.Text.Encoding.Unicode;
mailMessage.Body = body;
mailMessage.BodyEncoding = System.Text.Encoding.Unicode;
mailClient.Send(mailMessage);

The problem is that whilst the email arrives in HTML format, all of the DIV / CSS are not respected and it looks weird. I have tried to email to a different email address & client and it looks the same as well as trying different encodings.

So somewhere along the line something is going wrong.

Does anyone know how to fix this and get a properly formatted email?

Good Image

alt text

BadImage

alt text

source markup

<html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;head xmlns="">
        <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Sydney Forecast</title>
        <link rel="stylesheet" type="text/css" href="http://www.bom.gov.au/watl/standard/common.css"&gt;
        <link rel="stylesheet" type="text/css" href="http://www.bom.gov.au/weather-services/styles/text-gfe.css"&gt;
    </head>
    <body>
        <div class="product">
            <p xmlns="" class="p-id">IDN10064</p>
            <p xmlns="" class="source">Australian Government Bureau of Meteorology<br/>New South Wales
            <h2 xmlns="">Updated Sydney Forecast</h2>
            <p xmlns="" class="date">Issued at 8:11 am&nbsp;EST on Thursday 9 September 2010<br>for the period until midnight EST&nbsp;Wednesday 15 September 2010.</p>
            <h3 xmlns="" class="warning">Warning Summary at issue time</h3>
            <p xmlns="">Nil.</p>
            <p xmlns="" class="p-id">Details of warnings are available on the Bureau's website www.bom.gov.au, by telephone 1300-659-218* or through some TV and radio broadcasts.</p>
            <h3 xmlns="" class="day">Forecast for the rest of Thursday</h3>
            <p xmlns="" class="sl">Cloud increasing. Areas of rain this afternoon and evening. Winds northerly averaging up to 20 km/h.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">A little rain later.</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                </div>
                <div class="line">
                    <div class="rain_l">Chance of any rainfall:</div>
                    <div class="rain_prob_v">30%</div>
                    <div class="rain_l">Chance of no rainfall:</div>
                    <div class="rain_prob_v">70%</div>
                    <div class="rain_l">Rainfall:</div>
                    <div class="rain_v">0 to 1 mm</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Late rain.</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                </div>
                <div class="line">
                    <div class="rain_l">Chance of any rainfall:</div>
                    <div class="rain_prob_v">30%</div>
                    <div class="rain_l">Chance of no rainfall:</div>
                    <div class="rain_prob_v">70%</div>
                    <div class="rain_l">Rainfall:</div>
                    <div class="rain_v">0 to 1 mm</div>
                </div>
                <div class="line">
                    <div>
                        <h4>Around Sydney</h4>
                    </div>
                </div>
                <div class="line">
                    <div class="name">Liverpool</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                    <div class="name">Parramatta</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                </div>
                <div class="line">
                    <div class="name">Terrey Hills</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">19</div>
                    <div class="name">Campbelltown</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">19</div>
                </div>
                <div class="line">
                    <div class="name">Richmond</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                    <div class="name">Bondi</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">19</div>
                </div>
            </div>
            <p xmlns="" class="sl">Fire Danger: Low to Moderate [0-11]</p>
            <p xmlns="" class="sl">UV Alert from 9:10 am to 2:40 pm, UV Index predicted to reach 6 [High]</p>
            <h3 xmlns="" class="day">Forecast for Friday</h3>
            <p xmlns="" class="sl">Partly cloudy. Winds west to northwesterly averaging up to 25 km/h tending westerly up to 40 km/h around midday.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Becoming windy.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">13</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">22</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Partly cloudy. Becoming windy.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">11</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">23</div>
                </div>
            </div>
            <h3 xmlns="" class="day">Forecast for Saturday</h3>
            <p xmlns="" class="sl">Sunny. Winds west to southwesterly averaging up to 25 km/h tending mainly southeast to southwesterly up to 20 km/h around midday.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">12</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">21</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">9</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">22</div>
                </div>
            </div>
            <h3 xmlns="" class="day">Forecast for Sunday</h3>
            <p xmlns="" class="sl">Mostly sunny. Light winds.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Mostly sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">10</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">21</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">6</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">23</div>
                </div>
            </div>
            <h3 xmlns="" class="day">Forecast for Monday</h3>
            <p xmlns="" class="sl">Becoming cloudy. Isolated showers later in the day. Winds west to southwesterly averaging up to 25 km/h.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Shower or two developing.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">13</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">22</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Shower or two developing.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">10</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">22</div>
                </div>
            </div>
            <h3 xmlns="" class="day">Forecast for Tuesday</h3>
            <p xmlns="" class="sl">Sunny. Light winds tending north to northeasterly up to 20 km/h during the evening.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">12</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">19</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Sunny.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">10</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">19</div>
                </div>
            </div>
            <h3 xmlns="" class="day">Forecast for Wednesday</h3>
            <p xmlns="" class="sl">Isolated showers during the morning. Sunny afternoon. Winds northwesterly averaging up to 25 km/h tending westerly up to 35 km/h during the morning.</p>
            <div xmlns="" class="grid">
                <div class="line space-b">
                    <div class="name">City Centre</div>
                    <div class="wx">Shower or two clearing.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">12</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">20</div>
                </div>
                <div class="line space-b">
                    <div class="name">Penrith</div>
                    <div class="wx">Shower or two clearing.</div>
                    <div class="min_l">Min</div>
                    <div class="min_v">8</div>
                    <div class="max_l">Max</div>
                    <div class="max_v">21</div>
                </div>
            </div>
            <p xmlns="" class="dt">The next routine forecast will be issued at 4:20 pm&nbsp;EST&nbsp;Thursday.</p>
            <p xmlns="" class="p-id">* Calls to 1300 numbers cost around 27.5c incl. GST, higher from mobiles or public phones.</p>
        </div>
</html>
+3  A: 

css settings which are supported in web pages are not 100% supported in email. so it is normal the content rends differently.

Also it is not recommended using divs in email, since table is a safer option for email content.

check the link: http://css-tricks.com/using-css-in-html-emails-the-real-story/ http://www.campaignmonitor.com/css/

D.J
+2  A: 

A lot of email clients cut out everything that appears above the body tag (i.e. your CSS links) - what happens if you do all your CSS inline??

This link might offer some useful help

stephenmurdoch
+2  A: 

The 'bad' image looks exactly like how the HTML would render if the CSS wasn't being applied. If you're on a webmail, use something like HTTPFox to check if the browser's even requesting the CSS files - they may be getting supressed as part of the anti-spam measure (no remote content loaded automatically). If it's a real mail client (Outlook, Thunderbird, etc...) use a wire sniffer and do the same check.

Most likely you'll have to download the css and embed it inline, preferably somewhere after the <body> tag.

Marc B
+1  A: 

I had to do this type of project recently. Try writing to the lowest common denominator, such as OE 6 and prior. OE 6.0 and prior will not be consistent in its presentation of CSS - even if it is embedded in the header. Same with DIV in the body.

(Retrieved from Yahoo Answers 09-09-2010 1)

Best Answer - Chosen by Voters It would definitely depend on which version of outlook you are using. Any that do, probably only support inline styles...

 <p style=" color:red; ">this is red</p>

... but certainly not linked style sheets, and probably not stylesheets in the head.

Suggested Solution: Convert source rows to HTML 2.0 formatted table rows.

From your source, programmatically convert each line to an HTML 2.0 table row, using embedded styles. Then append each table row in the body. Finally, close the table.

This is the most sure way to get the results you want (short of remote loading a pre-formatted image).

If you want to include images in the table, you can remote load them, OR, you can insert them as attachments, and reference the attachment in the table body. I tried using 64-bit image encoding, but it was not consistent in email clients. I opted for the attachment method, since I did not want to rely on a server from which to remote load images.

Mike