記錄一次bug Linux jexus專業版 部署.net 項目 不能發送郵件的坑

不說廢話,直接說幾個重要的點吧!一個小小的bug搞了四天,頭皮發麻。。。。。。
自己寫的小項目 用到了.net 的 System.Net.Mai 裏面的 SmtpClient 來發送郵件。
原始代碼 在本地運行沒有任何錯誤 iis 也沒有報錯 可以正常運行,但是發佈到服務器(Linux jexus)
上就開始報錯。。。。。

            MailMessage mailMessage = new MailMessage();
            mailMessage.From = new MailAddress("[email protected]");
            mailMessage.To.Add(new MailAddress("收件人郵箱"));
            mailMessage.Subject = "標題";
            mailMessage.Body = "{0}內容:{1} ";
            var smtpClient = new SmtpClient
            {
                Host = "smtp.sohu.com",
                //使用安全加密連接。
                EnableSsl = false,
                //不和請求一塊發送。
                UseDefaultCredentials = false,
                //驗證發件人身份(發件人的郵箱,郵箱裏的生成授權碼);
                Credentials = new NetworkCredential("[email protected]", "xxx")
            };
            smtpClient.Send(mailMessage);

具體的報錯信息當時忘記了沒保存,通過各種百度,找到原因:

某雲服務器禁止了 25 端口的通訊,而smtp服務器默認端口就是25 所以採用465端口 ssl 加密傳輸

當時 我就蒙了, 對端口這些還真沒具體瞭解過,先不管了,先把代碼中的 EnableSs= false 改爲 EnableSs= true; Port = 465; 端口也改爲465,安全組也配置了 465端口 ,防火牆 也開啓了 465 端口 ,趕快去試試 結果 還是一樣 報錯 具體報錯當時沒看(有點後悔沒有開啓錯誤日誌)最嚴重的,在本地打開465端口 也報錯 說是 連接遠程主機失敗 !!!!!最後 在百度得到可以申請解封25 端口 ,於是去請求 結果肯定是禁止使用 !
申請解封25端口
最後再某雲官網找到一段代碼 可以使用465發送郵件 官方的代碼 總不會出錯 拿去試試 想看代碼的朋友去阿里官網

又百度到 這樣一片博文 意思是他使用 CDO 可以發送;
https://blog.csdn.net/yu18352566889/article/details/86500265
本地測試ok了 但是服務器還是報錯,
報錯截圖
多方求助大佬 最終解決 是因爲引用了第三方庫CDO 裏面 附帶了 ole32.dll 必須依賴windows
所以這個代碼也失敗!
使用第三方插件 ----Microsoft CDO for Windows Library :CDO.dll

using CDO;
try
      {
             Message oMsg = new Message();
             Configuration conf = new ConfigurationClass();
             conf.Fields[CdoConfiguration.cdoSendUsingMethod].Value = CdoSendUsing.cdoSendUsingPort;
             conf.Fields[CdoConfiguration.cdoSMTPAuthenticate].Value = CdoProtocolsAuthentication.cdoBasic;
             conf.Fields[CdoConfiguration.cdoSMTPUseSSL].Value = true;
             conf.Fields[CdoConfiguration.cdoSMTPServer].Value = "smtp.sohu.com";//必填,而且要真實可用   
             conf.Fields[CdoConfiguration.cdoSMTPServerPort].Value = 465;//465特有
             conf.Fields[CdoConfiguration.cdoSendEmailAddress].Value = "<" + "[email protected]" + ">";
             conf.Fields[CdoConfiguration.cdoSendUserName].Value = "[email protected]";//真實的郵件地址   
             conf.Fields[CdoConfiguration.cdoSendPassword].Value = "xxx";   //爲郵箱密碼,必須真實   
             conf.Fields.Update();
             oMsg.Configuration = conf;
             oMsg.HTMLBody = "你好";
             oMsg.Subject = "主題";
             oMsg.From = "[email protected]";
             oMsg.To = "[email protected]";
             oMsg.Send();
         }
         catch (System.Net.Mail.SmtpException ex)
         {
             throw ex;
         }

最終 在大佬的教導下 使用 MailKit.dll 發送

using MailKit.Net.Smtp;
using MimeKit;
			var message = new MimeMessage();
            message.From.Add(new MailboxAddress("發件人用戶名", "發件人地址"));
            message.To.Add(new MailboxAddress("收件人用戶名", "收件人地址"));
            message.Subject = string.Format("來自Hack The Game的{0}郵件 ", "註冊");  //郵件標題     
            message.Body = new TextPart("plain")
            {
                Text = string.Format("{0}內容:{1} ", "註冊", "測試")//郵件內容。
            };
            using (var client = new SmtpClient())
            {
                // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
                client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                client.Connect("smtpdm.qq.com");
                // Note: only needed if the SMTP server requires authentication
                client.Authenticate("[email protected]", "xxxx");
                client.Send(message);
                client.Disconnect(true);
            }

本地測試ok 發佈到服務器 !!!!又是報錯 !!!不過報錯不一樣
服務器報錯圖片
意思就是說不能加載這個插件 BouncyCastle.Crypto.dll 但是我根本沒有這個插件啊 最後翻譯了一下
具體意思是 BouncyCastle.Crypto.dll 沒有找到 先不管爲啥 ,把這個dll 找到 加到項目中 去了服務器試一下 。。。結果 成功了!!!!! 我驚了 !!好高興 ,但是爲啥 爲啥 爲啥呢 ????
總之 是成功了!
成功的頁面截圖

在本地測試的時候還有個問題,使用 465 端口發送 郵件 會報錯 : 郵件發送失敗; 不知道爲什麼
先這樣吧 !! 反正算是部署成功了 也是第一次寫博文 ,寫的不好 見諒!
插一句 : 最近在玩遊戲 有興趣的來玩一玩 養龍 養龍游戲註冊碼8utmzf
確實可以體現 ---- 已提現 200塊!有問題直接留言告訴我
關於上面的問題 有大佬知道詳情的a 願意幫助我的也跟麻煩留言告訴我一聲 半根藍白感激不盡。抱拳!
項目源碼 已上傳GitHub
源碼下載傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章