在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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...