ExchangeService使用AutodiscoverUrl发送邮件时,发送的电子邮件地址错误

3

我正在使用这段代码在winforms应用程序中通过Outlook发送电子邮件。

_exchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
_exchangeService.AutodiscoverUrl(_sender);
// ...
var email = new EmailMessage(_exchangeService)
{
    Subject = mailMessage.Subject, 
    Body = mailMessage.Body
};
email.ToRecipients.AddRange(mailMessage.To.Select(x => x.Address));
email.SendAndSaveCopy();

我已经在 _exchangeService.AutodiscoverUrl(_sender); 上设置了断点,并且可以看到发送者是 customerservice@mycompany.com。但是,电子邮件是以实际登录到 Windows 窗体应用程序的用户的名义发送的。例如:person@mycompany.com
我们尝试设置 Active Directory 以 "Send As" 和 "Send on Behalf" 的方式为此用户允许以 customerservice@mycompany.com 的名义发送,但没有帮助。我们还审查了此电子邮件的 Exchange Server 日志,清楚地表明它是从 person@mycompany.com 发送的。
在这里的代码示例中(https://msdn.microsoft.com/en-us/library/dd634273),它们使用了一个 NetworkCredential。我需要这么做吗?
为什么发送者(电子邮件的 发件人)会出现错误?

为什么不使用PrincipalContext,你可以通过它获取网络登录用户的电子邮件。你附加的链接使用了网络凭据,所以可以使用相同的示例尝试一下。 - MethodMan
@MethodMan 我想要从客服的邮箱发送邮件,而不是从用户的邮箱地址发送。 - Jess
你可以在.config文件中添加一个条目,或者切换你的代码使用SMTP发送电子邮件。如果你需要一个工作示例,我可以为你发布它。实际上,我知道一种方法可以让它工作,但我不确定这是否能解决问题。我马上会发布一个答案。 - MethodMan
很好。我已经在另一个项目中改用 SMTP,但是我宁愿解决这个问题,因为自动发现功能不会受服务器名称的影响。(最近当电子邮件服务器名称更改时,我们不得不重新部署应用程序,这非常繁琐) - Jess
如果您需要发送附件,只需取消注释我发布的代码部分即可。 - MethodMan
我还发布了一个SMTP方法,完全可以使用,昨天我为Stackoverflow上的某个人创建了这个方法,请注意我如何利用using,它非常好用。顺便说一下,你在mycomnpany中有一个拼写错误,应该是customerservice@mycomnpany.com - MethodMan
1个回答

2
_exchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
_exchangeService.AutodiscoverUrl(_sender);
using email = new EmailMessage(_exchangeService)
{
    From = new MailAddress("customerservice@mycompany.com"),
    Subject = subject,
    Body = body
})
{
    //System.Net.Mail.Attachment attachment;
    //attachment = new System.Net.Mail.Attachment("your attachment file");
    //mail.Attachments.Add(attachment);
    message.To.Add(address);//Jess@Jess.com for example
    _exchangeService.Send(message);
};

如果您想要一个良好的SendEmail方法,这里还有我为您创建的一个静态方法

public static void SendEmail(string subject, string body)
{
    using (var client = new SmtpClient(utilities.EmailHost, 25))
    using (var message = new MailMessage()
    {
        From = new MailAddress(utilities.FromEmail),
        Subject = subject,
        Body = body
    })
    {
        System.Net.Mail.Attachment attachment;
        attachment = new System.Net.Mail.Attachment("your attachment file");
        mail.Attachments.Add(attachment);
        message.To.Add(address);//Jess@Jess.com for example
        client.Send(message);
    };
}

你的第一个代码片段中未定义 client。你是不是指的 _exchangeService?如果我只需要设置 From,那我会感到非常尴尬。 - Jess
哦,对不起。我会马上编辑的,@Jess。 - MethodMan
FYI,希望今天尝试你的解决方案...目前还有其他阻碍。 - Jess
1
SMTP解决方案非常好,我测试了很多次并让其他人知道。我认为你最初编写的解决方案无法按照你的期望工作的原因是它使用本地用户网络凭据。如果你在Exchange上设置了一个服务帐户或类似的帐户,那么我认为这将解决你的问题。 - MethodMan
做得好,Man先生。"From"是答案。哇,我简直不敢相信。我以为发送者注册服务会占上风,但看来并非如此。 - Jess
我很高兴能够快速发现问题。@Jess 祝你周末愉快。 - MethodMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接