简体   繁体   English

EWS 在 C# 中发送邮件失败,但在 VB.Net 中没有

[英]EWS sending mail fails in C# but not in VB.Net

public ExchangeService CreateConnection(string url)
    {
        ServicePointManager.ServerCertificateValidationCallback = (object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true;
        ExchangeService service = new ExchangeService();
        service.Url = new Uri(url);
        service.UseDefaultCredentials = true;        // Uses users windows login credentials
        return service;
    }
public void SendEmail(string sEmailTo, string slocation, DateTime dtdate, string slogyard, string sScaling, string sLogMfct, string sOther, string sScaler, int icheckbox)
    {
        string scheckbox;
        string sDomain = Globals.gDefaultEmailSuffix;
        string sUserName = SystemInformation.UserName;
        ExchangeService service = CreateConnection("https://myexchangeserver.com/EWS/Exchange.asmx");
        string sHTMLpre = $"{EmailBody(Globals.gHTML)}";
        EmailMessage mailMessage = new EmailMessage(service);                 // Use with exchange service
                                                                     
        ReplaceWithBR(slogyard);
        ReplaceWithBR(sScaling);
        ReplaceWithBR(sLogMfct);
        ReplaceWithBR(sOther);

        if (icheckbox > 0)
            scheckbox = "Yes";
        else
            scheckbox = "No";

        sHTMLpre = sHTMLpre.Replace("[@Location]", slocation);
        sHTMLpre = sHTMLpre.Replace("[@Date]", dtdate.ToString());
        sHTMLpre = sHTMLpre.Replace("[@LogYard]", slogyard);
        sHTMLpre = sHTMLpre.Replace("[@Scaling]", sScaling);
        sHTMLpre = sHTMLpre.Replace("[@LogManufacturing]", sLogMfct);
        sHTMLpre = sHTMLpre.Replace("[@Scaler]", sScaler);
        sHTMLpre = sHTMLpre.Replace("[@Other]", sOther);
        sHTMLpre = sHTMLpre.Replace("[@RemotesExist]", scheckbox);

        mailMessage.ToRecipients.Add(new EmailAddress($"{sEmailTo}@{sDomain}"));     // Use with Exchange service
        mailMessage.From = new EmailAddress($"{sUserName}@{sDomain}");               // Use with Exchange service
        mailMessage.Subject = $"Scaling Yard Report for {slocation} on {dtdate}";    // Use with Exchange
        mailMessage.Body = sHTMLpre;                                                 // Use with Exchange
                    

        try
        {  
            mailMessage.SendAndSaveCopy());                    //Use with Exchange Service
            if (Globals.bLastEmail == true)
            {
                MessageBox.Show("Email Sent Successfully!");
                Globals.MonthlyLog("Email Sent", $"Recipients:{Globals.gEmailList}");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            Globals.MonthlyLog("Email Fail", $"{ex.Message}");

            return;
        }
    }

And Here is the VB.Net code that works just fine:这是运行良好的 VB.Net 代码:

Public Function CreateConnection(ByVal url As String) As ExchangeService
    ServicePointManager.ServerCertificateValidationCallback = Function(ByVal obj As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal errors As SslPolicyErrors) True
    Dim service As New ExchangeService()
    service.Url = New Uri(url)
    service.UseDefaultCredentials = True        ' Uses users windows login credentials
    Return service
End Function
Public Sub SendEmail(sEmailTo As String, slocation As String, dtdate As String, slogyard As String, sScaling As String, sLogMfct As String, sOther As String, sScaler As String, scheckbox As String)
    Dim sDomain As String = gDefaultEmailSuffix
    Dim sUserName As String = SystemInformation.UserName
    Dim service As ExchangeService = CreateConnection("https://myexchangeserver.com/EWS/Exchange.asmx")
    Dim sHTMLpre As String = $"{EmailBody(gHTML)}"
    Dim mailMessage = New EmailMessage(service)                 ' Use with exchange service
    'Dim mailMessage As New MailMessage()                       ' Use with SMTP client service

    slogyard = slogyard.Replace(ControlChars.Lf, "<br>")
    sScaling = sScaling.Replace(ControlChars.Lf, "<br>")
    sLogMfct = sLogMfct.Replace(ControlChars.Lf, "<br>")
    sOther = sOther.Replace(ControlChars.Lf, "<br>")

    If scheckbox = True Then
        scheckbox = "Yes"
    Else
        scheckbox = "No"
    End If

    sHTMLpre = sHTMLpre.Replace("[@Location]", slocation)
    sHTMLpre = sHTMLpre.Replace("[@Date]", dtdate)
    sHTMLpre = sHTMLpre.Replace("[@LogYard]", slogyard)
    sHTMLpre = sHTMLpre.Replace("[@Scaling]", sScaling)
    sHTMLpre = sHTMLpre.Replace("[@LogManufacturing]", sLogMfct)
    sHTMLpre = sHTMLpre.Replace("[@Scaler]", sScaler)
    sHTMLpre = sHTMLpre.Replace("[@Other]", sOther)
    sHTMLpre = sHTMLpre.Replace("[@RemotesExist]", scheckbox)

    mailMessage.ToRecipients.Add(New EmailAddress($"{sEmailTo}@{sDomain}"))     ' Use with Exchange service
    mailMessage.From = New EmailAddress($"{sUserName}@{sDomain}")               ' Use with Exchange service
    mailMessage.Subject = $"Scaling Yard Report for {slocation} on {dtdate}"    ' Use with Exchange
    mailMessage.Body = sHTMLpre                                                 ' Use with Exchange

    'mailMessage.IsBodyHtml = True                                              ' Use with SMTP CLient
    'mailMessage.To.Add($"{sEmailTo}@{sDomain}")                                ' Use with SMTP CLient
    'mailMessage.From = New MailAddress($"{sUserName}@{sDomain}")               ' Use with SMTP  
    'mailMessage.Subject = $"Scaling Yard Report for {slocation} on {dtdate}"   ' Use with SMTP
    'mailMessage.Body = sHTMLpre                                                ' Use with SMTP


    'Dim SmtpCli As New SmtpClient()                                            ' Leaving this just in case the EWS breaks
    'With SmtpCli                                                               ' SMTP Client Code
    '    .UseDefaultCredentials = False
    '    .Port = 25
    '    .DeliveryMethod = SmtpDeliveryMethod.Network
    '    .Host = gSMTPServer
    '    .Credentials = New NetworkCredential(gSMTPUsername, gSMTPPassword)
    'End With

    Try
        'SmtpCli.Send(mailMessage)                                              ' Use with SMPT client
        mailMessage.SendAndSaveCopy()                                           ' Use with Exchange Service
        If bLastEmail = True Then
            MsgBox("Email Sent Successfully!")
            Call MonthlyLog("Email Sent", $"Recipients:{gEmailList}")
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Call MonthlyLog("Email Fail", $"{ex.Message}")

        Exit Sub
    End Try

End Sub

It fails at the line: mailMessage.SendAndSaveCopy() -in C# but not VB.Net它失败了: mailMessage.SendAndSaveCopy() - 在 C# 但不是 VB.Net

Getting the error: "the request failed. the underlying connection was closed: an unexpected error occurred on a send"收到错误:“请求失败。底层连接已关闭:发送时发生意外错误”

As I said, it works fine with vb.net code, so it is not an exchange server setting like throttling.正如我所说,它适用于 vb.net 代码,因此它不是像节流这样的交换服务器设置。 Any ideas?有任何想法吗?

Needed to update the target .Net Framework to at least 4.6 or higher.需要将目标 .Net Framework 更新到至少 4.6 或更高版本。 I was working with 4.5.我正在使用 4.5。 Should have known because I have run into issues with the vb.net program not being able to send the emails on older non updated 32bit Windows 10 PC's that don't have 4.6.应该知道,因为我遇到了 vb.net 程序无法在没有 4.6 的旧版非更新 32 位 Windows 10 PC 上发送电子邮件的问题。

I was using .net 4.5.2 and received the same error.我正在使用 .net 4.5.2 并收到相同的错误。 Lower versions of .Net did not force it to use TLS version > 1.1 Either use higher version of .Net framework.较低版本的 .Net 并没有强制它使用 TLS 版本 > 1.1 或者使用更高版本的 .Net 框架。 Or you can force it to use TLS 1.2或者您可以强制它使用 TLS 1.2

' this resolves the unexpected error the underlying connection was closed by forcing it to use TLS 1.2 ' 这通过强制它使用 TLS 1.2 解决了底层连接被关闭的意外错误

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM