C# 发送 HTML 和文本电子邮件 - 最优雅?

2024-01-10

同时发送 HTML 和文本电子邮件是最佳做法吗?

如果我只发送 HTML 有什么危险?

我在想下面这样的事情,来自http://johnnycoder.com/blog/2009/04/15/net-mailmessage-linkedresources-alternateviews-and-exceptions/ http://johnnycoder.com/blog/2009/04/15/net-mailmessage-linkedresources-alternateviews-and-exceptions/.

try
{
    // Assign a sender, recipient and subject to new mail message
    MailAddress sender =
        new MailAddress("[email protected] /cdn-cgi/l/email-protection", "Sender");

    MailAddress recipient =
        new MailAddress("[email protected] /cdn-cgi/l/email-protection", "Recipient");

    MailMessage m = new MailMessage(sender, recipient);
    m.Subject = "Test Message";

    // Define the plain text alternate view and add to message
    string plainTextBody =
        "You must use an email client that supports HTML messages";

    AlternateView plainTextView =
        AlternateView.CreateAlternateViewFromString(
            plainTextBody, null, MediaTypeNames.Text.Plain);

    m.AlternateViews.Add(plainTextView);

    // Define the html alternate view with embedded image and
    // add to message. To reference images attached as linked
    // resources from your HTML message body, use "cid:contentID"
    // in the <img> tag...
    string htmlBody =
        "<html><body><h1>Picture</h1><br>" +
        "<img src=\"cid:SampleImage\"></body></html>";

    AlternateView htmlView =
        AlternateView.CreateAlternateViewFromString(
            htmlBody, null, MediaTypeNames.Text.Html);

    // ...and then define the actual LinkedResource matching the
    // ContentID property as found in the image tag. In this case,
    // the HTML message includes the tag
    // <img src=\"cid:SampleImage\"> and the following
    // LinkedResource.ContentId is set to "SampleImage"
    LinkedResource sampleImage =
        new LinkedResource("sample.jpg",
            MediaTypeNames.Image.Jpeg);
    sampleImage.ContentId = "SampleImage";

    htmlView.LinkedResources.Add(sampleImage);

    m.AlternateViews.Add(htmlView);

    // Finally, configure smtp or alternatively use the
    // system.net mailSettings
    SmtpClient smtp = new SmtpClient
          {
              Host = "smtp.example.com",
              UseDefaultCredentials = false,
              Credentials =
                  new NetworkCredential("username", "password")
          };

    //<system.net>
    //    <mailSettings>
    //        <smtp deliveryMethod="Network">
    //            <network host="smtp.example.com"
    //              port="25" defaultCredentials="true"/>
    //        </smtp>
    //    </mailSettings>
    //</system.net>

    smtp.Send(m);
}
catch (ArgumentException)
{
    throw new
        ArgumentException("Undefined sender and/or recipient.");
}
catch (FormatException)
{
    throw new
        FormatException("Invalid sender and/or recipient.");
}
catch (InvalidOperationException)
{
    throw new
        InvalidOperationException("Undefined SMTP server.");
}
catch (SmtpFailedRecipientException)
{
    throw new SmtpFailedRecipientException(
        "The mail server says that there is no mailbox for recipient");
}
catch (SmtpException ex)
{
    // Invalid hostnames result in a WebException InnerException that
    // provides a more descriptive error, so get the base exception
    Exception inner = ex.GetBaseException();
    throw new SmtpException("Could not send message: " + inner.Message);
}

我想说,在当今世界,“最佳实践”方法是确保您以以下方式发送消息:both纯文本和 HTML(如果您确实想发送 HTML 电子邮件)。

哦,并确保您确实发送了content在纯文本视图中,而不是一句“您必须使用支持 HTML 消息的电子邮件客户端”。 Google Mail 采用了这种方法,而且似乎工作得很好,允许在成熟的 PC 客户端上查看“丰富”视图,同时还允许在更受限制的设备(即移动/手机)上查看“最少”视图。

如果您想采取纯粹主义者的观点,您根本不会发送 HTML 电子邮件,也不会将二进制文件“附加”到电子邮件中。原始电子邮件标准的两个损坏,该标准仅起初用于纯文本。 (看看一些人对此的看法here http://www.georgedillon.com/web/html_email_is_evil.shtml and here http://birdhouse.org/etc/evilmail.html)

然而,在务实的现代现实世界中,HTML 电子邮件是非常真实的,并且非常容易被接受。发送 HTML 电子邮件的主要缺点是收件人是否会按照您希望的方式看到电子邮件。这与网页设计师多年来一直在努力解决的问题大致相同。让他们的网站在所有可能的浏览器中看起来“恰到好处”(尽管今天比许多年前要容易得多)。

类似于确保网站正常运行无需Javascript,通过以 HTML 和纯文本形式发送电子邮件,您将确保您的电子邮件优雅地降级这样人们在(例如)小型移动设备(如今这种设备变得越来越流行,并且可能能够也可能无法呈现完整的 HTML 电子邮件)上阅读电子邮件时仍然可以毫无问题地阅读您的电子邮件内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 发送 HTML 和文本电子邮件 - 最优雅? 的相关文章

  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName

随机推荐

  • 如何加载页脚之前的内容?

    我的页脚是在内容加载之前加载的 我的导航栏中有多个按钮 单击时会打开一个新组件 当用户点击事件时 它会在从 api 加载事件后发出 此时页脚加载正常 但之后我转到另一个链接 比如说特殊链接 然后页脚在活动之前加载 我尝试如下 事件组件 ts
  • 在选项卡栏控制器之前显示登录屏幕

    我正在做一个 Twitter 应用程序 并在 AppDelegate 上 didFinishLaunchingWithOptions如果该对象上的 NSUserDefaults 为空 我将使用下一个代码来加载登录视图 NSUserDefau
  • 基于 PySpark 中另一个数据帧的列值创建指标数组

    我有两个数据框 df1 id1 items1 0 B C D E 1 E A C 2 F A E B 3 E G A 4 A C E B D and df2 id2 items2 001 A C 002 D
  • Developer M 预览版中的共享库

    我正在尝试在 Android M 开发预览版上测试我的应用程序 我的应用程序使用共享库 我已将其放置在 Android Studio 内的 jni libs armeabi 中 我相信当它召唤的时候System loadLibrary my
  • 如何减小 Puppeteer 的大小

    我使用 Puppeteer 进行网页抓取 并使用我制作的一个小型 NodeJs Web 应用程序 该网络应用程序托管在 Heroku 上并使用jontewks puppeteer heroku buildpack到作品 我面临的问题是 由于
  • Firebase 查询方法不起作用

    这是我的数据树 look twopointo 0 comment Hi Text1 Hello Text2 Bonsoir type Bonjour version 4 0 6 由于某种原因查询不起作用 button setOnClickL
  • Javascript 数组映射 2D 数组

    我正在尝试聚合下面的数组 arr 以便获得如下输出 期望的输出 2011 04 11 开放 6 2011 04 11 关闭 4 但我得到 Output 2011 04 11 开园 6 2011 04 11 闭园 4 我如何获取 javasc
  • VSTS (Azure DevOps) 中的 Selenium 屏幕截图

    根据我的搜索 它应该 正常工作 This https learn microsoft com en us azure devops test collect screenshots and video view vsts是我找到的最好的文章
  • 处理文件时,如何获取当前行号?

    当我使用下面的构造循环文件时 我还需要当前行号 with codecs open filename rb utf8 as f retval for line in f process line 是否存在类似的东西 for line line
  • WSGI:start_response函数的目的是什么

    你能提供一个现实生活中的例子吗WSGI http wsgi readthedocs org en latest start response http webpython codepoint net wsgi application int
  • 在 Android 谷歌地图 API v2 中隐藏标记信息窗口

    目前 我可以使用 Android Google 地图 API v2 查看 Google 地图中的所有标记 在地图中添加我的标记 mapView addMarker new MarkerOptions position aUsersLocat
  • Mysql 列约束为“非空”/“必需”

    我们可以将mysql中的一列指定为 非空 必需 吗 要求是确保该字段在任何记录插入时都不会保持空白 我假设你不想要空白 空字符串 而不是NULL 表中允许的值 通常情况下 这就是CHECK约束为 你做类似的事情 CREATE TABLE m
  • 使用 Laravel 的 eloquent 在 JSON 列中搜索

    我一直在使用 Laravel 5 4 的 eloquent 遇到了一个问题 我有一个名为posts其中 有一列名为template ids 它将值存储在json encoded格式如下 1 25 48 现在 我想根据 ID 数组对查询应用过
  • 为什么 Jarvis 的 March(“礼品包装算法”)的这种实现不起作用?

    我正在尝试实现贾维斯算法来查找一组点的凸包 但由于某种原因它不起作用 这是我的实现 procedure TPointList ConvexHull aHull TPointList Return the convex hull of a s
  • Keras ImageDataGenerator 设置平均值和标准差

    我有一个预训练的 keras 模型 我想在新数据集上使用它 我有预训练模型中的权重 平均值和标准文件 我想使用图像数据生成器中的 flow from directory 来加载新数据集 问题是如何显式设置均值和标准文件以进行标准化 Than
  • 使用延迟和管道的链式回调

    我正在努力使用延迟将回调与管道链接起来 它似乎工作得很好 但在回调 2 中 它给我带来了来自回调 1 的数据 代码如下所示 var getCall1 function return ajax url type GET data conten
  • 想学习如何在 Objective-C 中使用 OpenGL,但不知道从哪里开始。帮助? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对 OpenGL 的经验为零 对 Objective C 的经验也很少 但我对 C 的了解相当不错 我应该查看哪些资源来开始学习如何在
  • 在 MVC Web 应用程序中,谁负责过滤大量对象、视图或模型?

    我有一个基于 MVC 设计构建的 Web 应用程序 我有一个数据库 其中包含大量对象 论坛线程 我无法立即将其加载到内存中 我现在想用不同的过滤器来显示这个集合 的一部分 有点像 stackoverflow 对按日期 投票 标签等排序的问题
  • Perl 中 printf、print 和 sprintf 之间的区别

    具体用法是什么print printf and sprintf在 Perl 中 这三个关键字都用于打印目的 但有人可以简单地区分一下吗 Short 请参阅手册 http perldoc perl org functions print ht
  • C# 发送 HTML 和文本电子邮件 - 最优雅?

    同时发送 HTML 和文本电子邮件是最佳做法吗 如果我只发送 HTML 有什么危险 我在想下面这样的事情 来自http johnnycoder com blog 2009 04 15 net mailmessage linkedresour