C# 使用C通过具有嵌入映像的Windows服务发送自动电子邮件#

C# 使用C通过具有嵌入映像的Windows服务发送自动电子邮件#,c#,.net,image,email,windows-services,C#,.net,Image,Email,Windows Services,我已经有了一个C#windows服务,我们在内部使用它来监控网络上的目录,当它检测到更改时,会使用我们的内部SMTP服务器向指定的人群发送电子邮件 现在我需要在那封自动邮件中嵌入一个图像。我知道我需要创建一个AlternateView和一个链接资源,并在AlternateView中使用链接资源的cID,对吗 我不明白的是我应该把图像放在哪里?我是否应该将其添加到我的服务项目中,并设置复制到输出目录=始终复制?如果是这样,那么在创建LinkedResource时我将如何访问?另外,我应该将映像放在

我已经有了一个C#windows服务,我们在内部使用它来监控网络上的目录,当它检测到更改时,会使用我们的内部SMTP服务器向指定的人群发送电子邮件

现在我需要在那封自动邮件中嵌入一个图像。我知道我需要创建一个AlternateView和一个链接资源,并在AlternateView中使用链接资源的cID,对吗

我不明白的是我应该把图像放在哪里?我是否应该将其添加到我的服务项目中,并设置
复制到输出目录=始终复制
?如果是这样,那么在创建LinkedResource时我将如何访问?另外,我应该将映像放在托管服务的服务器上的什么位置

这是我到目前为止所做的,但似乎不起作用。我没有收到任何错误,我知道,但我也没有收到电子邮件。我猜它正在寻找图像,但我没有把它放在正确的位置

// This event is called when an object(file,folder) is created in the srcPath
    void WatcherCreated(object source , FileSystemEventArgs e)
    {
        var folderName = e.Name;
        var folderPath = e.FullPath;

        MailMessage mail = new MailMessage();

        mail.From = new MailAddress("FolderMonitor@myWork.org");
        mail.To.Add("PSchaller@myWork.org");

        mail.Subject = "New Enrollment for " + folderName;

        AlternateView plainView = AlternateView.CreateAlternateViewFromString("This is the plain text view", null,
                                                                              "text/html");

        AlternateView htmlView =
            AlternateView.CreateAlternateViewFromString("Here is an embedded image. <img src=cid:enrollProcessID>",
                                                        null, "text/html");

        LinkedResource imageResourceLink = new LinkedResource("C:\\FolderMonitorService\\EnrollmentProcess.jpg")
                                               {ContentId = "enrollProcessID"};

        htmlView.LinkedResources.Add(imageResourceLink);

        mail.AlternateViews.Add(plainView);
        mail.AlternateViews.Add(htmlView);

        var smtp = new SmtpClient("internalSMTP");
        smtp.Send(mail);
    }
//在srcPath中创建对象(文件、文件夹)时调用此事件
已创建void watcher(对象源、文件系统目标)
{
var folderName=e.Name;
var folderPath=e.FullPath;
MailMessage mail=新的MailMessage();
mail.From=新邮件地址(“FolderMonitor@myWork.org");
mail.To.Add(“PSchaller@myWork.org");
mail.Subject=“新注册为”+folderName;
AlternateView plainView=AlternateView.CreateAlternateView-FromString(“这是纯文本视图”,null,
“文本/html”);
备选视图htmlView=
CreateAlternateView.CreateAlternateView-FromString(“这是一个嵌入的图像。”,
null,“文本/html”);
LinkedResource imageResourceLink=新建LinkedResource(“C:\\FolderMonitorService\\EnrollmentProcess.jpg”)
{ContentId=“enrollProcessID”};
添加(imageResourceLink);
mail.AlternateViews.Add(plainView);
mail.AlternateViews.Add(htmlView);
var smtp=新的SmtpClient(“内部smtp”);
smtp.发送(邮件);
}

查看以下文章:


实际上,您误解了这里的错误。。据我所知,你的代码绝对正确。。为了再次检查,我在一个简单的应用程序中复制了它,更新了图像的本地路径并运行了它——我立即收到了电子邮件

另外,如果我给它一个错误的文件路径,它会立即抛出一个异常,声明找不到该文件:)

如果您的邮箱中没有收到图像,则可能是垃圾邮件过滤器正在对其进行过滤。。我排除了这里的smtp服务器设置,因为您说发送纯文本版本有效:)


UPD:根据个人经验,我建议将编码改为UTF8。这是我的邮件被垃圾邮件过滤器删除的标准之一。。除此之外,您的代码看起来很好,我看不出有任何理由不起作用。。毕竟,它对我来说确实有效:)

@Refracted:将图像放入服务文件夹并通过文件路径访问它有什么害处?@KMan:不知道……我应该这样做吗?“服务文件夹”是我安装exe的文件夹,还是有一个特殊的MS services主页?这取决于您选择存储应用程序/数据的方式。将图像保存为嵌入式资源是完全正常的;最好将其作为一个单独的文件保存,以防将来更改图像。我最喜欢第二种选择。我在上面的东西现在起作用了……除了……它只发送
AlternateViews=plainView
版本。如果我删除了它,并且只有
htmlView
,那么它就工作得很好。奇怪,谢谢,第二个是我开始的原因。