我有一个向用户发送邮件的Windows服务。使用的代码是发送邮件的基本方式。
SmtpClient client = new SmtpClient("servername");
MailMessage msg = new Mailmsg(); ...// configuration
client.send(msg);
如果我从客户端设置凭据,我可以通过Exchange服务器发送邮件(2007)。交换服务器配置为允许无需身份验证即发送电子邮件(匿名)。
因此,如果我在false时不提供usedefaultcredentials的凭据,它可以在我的控制台应用程序中运行,但不能在我的Windows服务中运行。
我收到消息“smtp服务器需要安全连接或客户端未经过身份验证”。 任何人都知道为什么我在使用Windows服务而不是控制台应用程序(相同的代码)时得到这个
答案 0 :(得分:0)
用于运行服务的Windows帐户必须没有足够的权限。请检查这些。
答案 1 :(得分:0)
可能是运行该服务的用户可能没有发送电子邮件的权限。右键单击该服务,然后在“登录”选项卡下,您将看到该服务正在运行的用户。您可以在那里设置用户。
答案 2 :(得分:0)
您需要在具有访问Exchange服务器权限的帐户下运行该服务。在服务的属性中设置帐户:
alt text http://www.adobe.com/devnet/contribute/articles/cps_autodeploy/fig06.gif
答案 3 :(得分:0)
我会创建SMTP会话的日志文件,只是为了验证您实际连接到您认为自己的服务器。然后,您还可以直观地检查日志文件,并查看从SMTP服务器返回的实际响应。
要创建SMTP会话的日志文件,您需要在.config文件中启用日志记录开关。
以下跟踪开关示例将导致SMTP会话记录到名为“System.Net.trace.log”的文件中。
<configuration>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net" >
<listeners>
<add name="MyTraceFile"/>
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="MyTraceFile"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add
name="MyTraceFile"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="System.Net.trace.log" />
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
<add name="System.Net.Sockets" value="Verbose" />
</switches>
</configuration>
我在这里有更多的信息: http://systemnetmail.com/faq/4.10.aspx
答案 4 :(得分:0)
只是一个想法,但;您的交换服务是否依赖于使用证书的安全通信?如果是这样,您可能需要仔细检查您的服务是否可以访问实际拥有正确证书的证书存储。(基于服务的用户凭据)