在windows平臺使用Apache James搭建郵件伺服器以及使用C#向外網發送郵件

来源:https://www.cnblogs.com/liemei/archive/2017/12/26/8119496.html
-Advertisement-
Play Games

首先環境搭建: 1、下載安裝JDK,並且配置環境變數 2、下載Apache James ,下載解壓之後的目錄如圖 雙擊bin下邊的run.bat批處理文件安裝James 服務,提示如下信息說明安裝成功: 安裝之後如圖所示: 修改E:\james-2.3.2.1\apps\james\SAR-INF\ ...


 

 

首先環境搭建:

1、下載安裝JDK,並且配置環境變數

2、下載Apache James ,下載解壓之後的目錄如圖

雙擊bin下邊的run.bat批處理文件安裝James 服務,提示如下信息說明安裝成功:

Using PHOENIX_HOME:   C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME:
 
Phoenix 4.0.1
 
james 2.3.2.1
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service Disabled
Fetch POP Disabled

安裝之後如圖所示:

 

 修改E:\james-2.3.2.1\apps\james\SAR-INF\config.xml文件

將配置文件中的

········

<postmaster>Postmaster@localhost</postmaster>

···········

 <servernames autodetect="false" autodetectIP="false">

<!-- CONFIRM? -->

         <servername>localhost</servername>

      </servernames>

 

中的localhost修改為自己的功能變數名稱,這裡假設修改為star.com,如果開通賬號為zsf的話那麼郵件地址就是[email protected],並且將autodetectIP修改為false。修改結果如下:

·····

<postmaster>[email protected]</postmaster>

······

<servernames autodetect="false" autodetectIP="false">

<!-- CONFIRM? -->

         <servername>star.com</servername>

      </servernames>

找到配置項:

<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">   
    <processor> relay-denied </processor>   
    <notice>550 - Requested action not taken: relaying denied</notice>   
</mailet> 

註釋掉該配置項

找到下麵的配置項,去掉註釋:

<authRequired>true</authRequired>

這樣的話訪問郵箱就需要賬號驗證才行。

在控制臺中輸入命令行telnet localhsot 4555 進入James的控制台

提示輸入Login ID和Password

Login ID 和Password在之前修改的配置文件中設置,找到節點

 <account login="root" password="!changeme!"/>

root就是Login ID,可以在此處修改登錄的賬號密碼。登錄成功之後提示:

Welcome root. HELP for a list of commands

輸入 help 就可以查看James的相關命令

輸入 adduser liemei 123456 回車就可以添加一個新的用戶,用戶的郵箱就是[email protected]

賬號就是liemei 密碼是123456。

到目前為止基本的Apache James配置已經完成,但是要向外網如163郵箱發送郵件,還有一些問題,因為James的SMTP 服務預設在 25 埠啟動,POP3 服務預設在 110 埠啟動, NNTP 服務預設在 119 埠啟動,所以如果想要在外網正常使用需要配置防火牆允許這些埠通過,配置的位置在防火牆高級設置,添加入站規則,如圖

 

 

 

下一步就是在路由器中配置對應的外網映射,將功能變數名稱star.com對應的外網IP地址映射到郵件伺服器上,埠一一對應即可。

使用C#發送郵件測試

 

string senderServerIp = "xxx.xx.xx.x";  //功能變數名稱star.com對應的外網IP

                string toMailAddress = "[email protected]";

                string fromMailAddress = "[email protected]";

                string subjectInfo = "Test sending e_mail";

                string bodyInfo = "Hello Eric, This is my first testing e_mail";

                string mailUsername = "liemei";

                string mailPassword = "123456"; //發送郵箱的密碼()

                string mailPort = "25";

                string attachPath = "";

 

                MyEmail email = new MyEmail(senderServerIp, toMailAddress, fromMailAddress, subjectInfo, bodyInfo, mailUsername, mailPassword, mailPort, false, false);

                email.AddAttachments(attachPath);

                email.Send();

發送郵件類:

 class MyEmail
    {
        private MailMessage mMailMessage;   //主要處理髮送郵件的內容(如:收發人地址、標題、主體、圖片等等)
        private SmtpClient mSmtpClient; //主要處理用smtp方式發送此郵件的配置信息(如:郵件伺服器、發送埠號、驗證方式等等)
        private int mSenderPort;   //發送郵件所用的埠號(htmp協議預設為25)
        private string mSenderServerHost;    //發件箱的郵件伺服器地址(IP形式或字元串形式均可)
        private string mSenderPassword;    //發件箱的密碼
        private string mSenderUsername;   //發件箱的用戶名(即@符號前面的字元串,例如:[email protected],用戶名為:hello)
        private bool mEnableSsl;    //是否對郵件內容進行socket層加密傳輸
        private bool mEnablePwdAuthentication;  //是否對發件人郵箱進行密碼驗證

        ///<summary>
        /// 構造函數
        ///</summary>
        ///<param name="server">發件箱的郵件伺服器地址</param>
        ///<param name="toMail">收件人地址(可以是多個收件人,程式中是以“;"進行區分的)</param>
        ///<param name="fromMail">發件人地址</param>
        ///<param name="subject">郵件標題</param>
        ///<param name="emailBody">郵件內容(可以以html格式進行設計)</param>
        ///<param name="username">發件箱的用戶名(即@符號前面的字元串,例如:[email protected],用戶名為:hello)</param>
        ///<param name="password">發件人郵箱密碼</param>
        ///<param name="port">發送郵件所用的埠號(htmp協議預設為25)</param>
        ///<param name="sslEnable">true表示對郵件內容進行socket層加密傳輸,false表示不加密</param>
        ///<param name="pwdCheckEnable">true表示對發件人郵箱進行密碼驗證,false表示不對發件人郵箱進行密碼驗證</param>
        public MyEmail(string server, string toMail, string fromMail, string subject, string emailBody, string username, string password, string port, bool sslEnable, bool pwdCheckEnable)
        {
            try
            {
                mMailMessage = new MailMessage();
                mMailMessage.To.Add(toMail);
                mMailMessage.From = new MailAddress(fromMail);
                mMailMessage.Subject = subject;
                mMailMessage.Body = emailBody;
                mMailMessage.IsBodyHtml = true;
                mMailMessage.BodyEncoding = System.Text.Encoding.UTF8;
                mMailMessage.Priority = MailPriority.Normal;
                this.mSenderServerHost = server;
                this.mSenderUsername = username;
                this.mSenderPassword = password;
                this.mSenderPort = Convert.ToInt32(port);
                this.mEnableSsl = sslEnable;
                this.mEnablePwdAuthentication = pwdCheckEnable;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        ///<summary>
        /// 添加附件
        ///</summary>
        ///<param name="attachmentsPath">附件的路徑集合,以分號分隔</param>
        public void AddAttachments(string attachmentsPath)
        {
            if (string.IsNullOrEmpty(attachmentsPath))
                return;
            try
            {
                string[] path = attachmentsPath.Split(';'); //以什麼符號分隔可以自定義
                Attachment data;
                ContentDisposition disposition;
                for (int i = 0; i < path.Length; i++)
                {
                    data = new Attachment(path[i], MediaTypeNames.Application.Octet);
                    disposition = data.ContentDisposition;
                    disposition.CreationDate = File.GetCreationTime(path[i]);
                    disposition.ModificationDate = File.GetLastWriteTime(path[i]);
                    disposition.ReadDate = File.GetLastAccessTime(path[i]);
                    mMailMessage.Attachments.Add(data);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        ///<summary>
        /// 郵件的發送
        ///</summary>
        public void Send()
        {
            try
            {
                if (mMailMessage != null)
                {
                    mSmtpClient = new SmtpClient();
                    //mSmtpClient.Host = "smtp." + mMailMessage.From.Host;
                    mSmtpClient.Host = this.mSenderServerHost;
                    mSmtpClient.Port = this.mSenderPort;
                    mSmtpClient.UseDefaultCredentials = false;
                    mSmtpClient.EnableSsl = this.mEnableSsl;
                    if (this.mEnablePwdAuthentication)
                    {
                        System.Net.NetworkCredential nc = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                        //mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                        //NTLM: Secure Password Authentication in Microsoft Outlook Express
                        mSmtpClient.Credentials = nc.GetCredential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");
                    }
                    else
                    {
                        mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                    }
                    mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
                    mSmtpClient.Send(mMailMessage);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

發送完郵件之後登陸163郵箱就可以看到已經收到了剛剛發送的郵件,如圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 前言 "上一篇文章" 介紹了各種WPF本地化的入門知識,這篇文章介紹UWP本地化的入門知識。 2. 使用resw資源文件實現本地化 在以前的XAML平臺,resx資源文件是一種很方便的本地化方案,但在UWP中微軟又再次推薦x:Uid方案,預設的資源文件也變成resw資源文件。雖然尾碼名只差了一 ...
  • 背水一戰 Windows 10 之 全球化: Demo, 格式化數字 ...
  • 一、為什麼會用到網頁實時監控 LZ最近在無錫買房了,雖然在上海工作,但是上海房價實在太高無法承受,所以選擇還可以接受的無錫作為安身之地。買過房的小伙伴可能知道買房的流程,買房中間有一步很重要的就是需要商品房備案,簡單點說就是你買房時可以在政府商品房備案網站處查看你購買房的備案情況,如果是已經備案了開 ...
  • 一、統一賬號管理 1.LDAP 統一管理各種平臺帳號和密碼,包括但不限於各種操作系統(Windows、Linux),Linux系統sudo集成,系統用戶分組,主機登入限制等;可與Apache,HTTP,FTP,SAMBA,ZABBIX,Jenkins等集成;支持密碼策略(密碼強度、密碼過期時間、強制 ...
  • 無監控,不運維。好了,廢話不多說,下麵都是乾貨。 流量黨勿入,圖片太多!!! 項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html 一、User parameters 用戶參數 1、介紹和用法 ① 介紹 自定義用戶參數,也就是自定義key ...
  • python簡介: 一、什麼是python Python(英國發音:/ pa θ n/ 美國發音:/ pa θɑ n/),是一種面向對象、直譯式的電腦程式語言。 每一門語言都有自己的哲學: pythonde 設計哲學是:“優雅”、“明確”、“簡單” 二、python由來 1989年的聖誕節期間,吉 ...
  • 本文目錄:1. 入門示例:虛擬主機提供web服務2. tomcat體繫結構基本說明3. tomcat的appBase和docBase詳細說明4. webapp體繫結構5. tomcat進階:tomcat配置文件server.xml詳解 5.1 頂級元素server 5.2 頂級元素service 5 ...
  • sudo命令 系統安全sudo命令用來以其他身份來執行命令,預設的身份為root。在/etc/sudoers中設置了可執行sudo指令的用戶。若其未經授權的用戶企圖使用sudo,則會發出警告的郵件給管理員。用戶使用sudo時,必須先輸入密碼,之後有5分鐘的有效期限,超過期限則必須重新輸入密碼。 語法 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...