Outlook '13 and '16 have a bug where if more than one table is nested inside of a VML object (specifically for the purpose of a background-image), left padding will fail for the first, second and all remaining nested tables.
Case 1
<vml>
<table><tr><td style="padding: 40px;">
Padding works as intended with 40px on all 4 sides. For most cases, additional nesting is not necessary for layout.
</td></tr></table>
</vml>
Case 2
<vml>
<table><tr><td style="padding: 40px;">
<table><tr><td>
Initial td is used as a container, and a second nested table will be used for content. In this case, Outlook '13 and '16 fail to render the left padding on the containing td. The remaining 3 padding properties work as intended.
</td></tr></table>
</td></tr></table>
</vml>
Case 3
<vml>
<table><tr><td style="padding: 40px;">
<table><tr><td style="padding: 40px;">
To see how far the rabbit hole went, I decided to keep nesting tables and adding padding to all, or only the next closest table to the content. In the end, it seems that any additional table nested after the first will render any and all left-padding irrelevant.
</td></tr></table>
</td></tr></table>
</vml>
Inversely, both clients render margin-left
as intended, without supporting the other 3 margin attributes under these circumstances.
Therefore, we can add a class/id and padding to a td (this would be a Case 2 scenario, acting as a container fix) <td class="padding" style="padding: 40px;">
and use conditional css to add a left margin for Outlook clients greater than or equal to 13.
<!doctype html>
<html>
<head>
<!--[if gte mso 13]>
<style type="text/css">
.padding { margin-left: 40px !important; padding-left: 0 !important; }
</style>
<![endif]-->
</head>
<body>
<vml>
<table><tr><td class="padding" style="padding: 40px;">
<table><tr><td>
Hello world! I'm nested and padded!
</td></tr></table>
</td></tr></table>
</vml>
</body>
</html>
Setting the padding-left attribue to 0 doesn't seem to have any effect in the conditional css.
A point was brought up to use the inset
value on the <v:textbox>
element, but that would have adverse affects in conjunction with the padding for all remaining MSO clients that do render it properly. This approach tries to tackle the problem directly, by fixing the CSS that should be valid in the first place.
EoA test for reference.
https://www.emailonacid.com/app/acidtest/tM4rWkVK9Ptna79iMhKldDRiymezJ7L7Al2vKJ9KH9Vug/list
Test File -
mso_13+16_pad_fix.zip
UPDATE
Second alternative option without declaring classes or css styles is to override the padding directly inline with
<!doctype html>
<html>
<body>
<vml>
<table><tr><td class="padding" style="padding-top: 40px; padding-right: 40px padding-bottom: 40px; padding-left: 40px; mso-padding-right-alt: 0; mso-padding-left-alt: 0;">
<table><tr><td>
Hello world! I'm nested and padded!
</td></tr></table>
</td></tr></table>
</vml>
</body>
</html>
This approach can't mix short/long format, so all padding properties must be explicitly expressed for this version to work correctly.