ホームページ バックエンド開発 PHPチュートリアル 「Nginx の詳細な理解」のメモ: ngx_mail 関連の構造

「Nginx の詳細な理解」のメモ: ngx_mail 関連の構造

Jul 30, 2016 pm 01:30 PM
mail protocol str

Nginxメール関連モジュールの構造

ngx_mail_module_t

これはメールモジュールの抽象インターフェース、つまりngx_module_tのctxメンバーが指すメールモジュール固有のインターフェースです。各メールモジュールは独自の ngx_mail_module_t 構造を実装します。

<code><span>typedef</span><span>struct</span> {
     <span>// POP3 STMP IMAP邮件模块提取出的通用接口</span>
    ngx_mail_protocol_t        *protocol;

     <span>// 用于创建main级别配置项的结构体</span><span>void</span>                       *(*create_main_conf)(ngx_conf_t *cf);

    <span>// 解析完main级别配置项后被回调的函数</span><span>char</span>                       *(*init_main_conf)(ngx_conf_t *cf, <span>void</span> *conf);

     <span>// 用于创建srv级别配置项的结构体</span><span>void</span>                       *(*create_srv_conf)(ngx_conf_t *cf);

    <span>// 根据具体模块处理srv下和main下同名的配置项</span><span>char</span>                       *(*merge_srv_conf)(ngx_conf_t *cf, <span>void</span> *prev,
                                      <span>void</span> *conf);
} ngx_mail_module_t;</code>
ログイン後にコピー

ngx_protocol_s

<code><span>typedef</span><span>struct</span> ngx_mail_protocol_s ngx_mail_protocol_t;

<span>// 四个POP3 SMTP IMAP等应用级别的邮件模块所需要实现的接口方法</span><span>typedef</span><span>void</span> (*ngx_mail_init_session_pt)(ngx_mail_session_t *s,
    ngx_connection_t *c);
<span>typedef</span><span>void</span> (*ngx_mail_init_protocol_pt)(ngx_event_t *rev);
<span>typedef</span><span>void</span> (*ngx_mail_auth_state_pt)(ngx_event_t *rev);
<span>typedef</span> ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s);


<span>struct</span> ngx_mail_protocol_s {
     <span>// 邮件模块名称</span>
    ngx_str_t                   name;

    <span>// 当前邮件模块中所要监听的最常用4个端口</span>
    in_port_t                   port[<span>4</span>];

    <span>// 邮件模块类型</span>
    ngx_uint_t                  type;

     <span>// 与客户端建立起TCP连接后的初始化方法</span>
    ngx_mail_init_session_pt    init_session;

    <span>// 接收、解析客户端请求的方法</span>
    ngx_mail_init_protocol_pt   init_protocol;

    <span>// 解析客户端邮件协议的接口方法</span>
    ngx_mail_parse_command_pt   parse_command;
    ngx_mail_auth_state_pt      auth_state;

     <span>// 当处理中没有遇到错误时,返回internal_server_error指定的响应给客户端</span>
    ngx_str_t                   internal_server_error;
    ngx_str_t                   cert_error;
    ngx_str_t                   no_cert;
};</code>
ログイン後にコピー

ngx_mail_session_t

Nginx はクライアントとの TCP 接続を確立した後、ngx_mail_init_connection 関数をコールバックして電子メール プロトコルを初期化します。この時点で、HTTP リクエストの ngx_http_request_t に似たコア構造 ngx_mail_session_s が作成されます。

<code><span>typedef</span><span>struct</span> {
    uint32_t                signature;         <span>/* "MAIL" */</span><span>// 下游客户端和Nginx之间的连接</span>
    ngx_connection_t       *connection;

     <span>// 可存需要向下游客户端发送的内容</span>
    ngx_str_t               out;

    <span>// 用于接收来自客户端的请求</span>
    ngx_buf_t              *buffer;

     <span>// 指向一个指针数组,保存着这个请求中各个邮件模块的上下文建构体指针</span><span>void</span>                  **ctx;

    <span>// main级别配置结构体组成的指针数组</span><span>void</span>                  **main_conf;

    <span>// srv级别配置结构体组成的指针数组</span><span>void</span>                  **srv_conf;

     <span>// 解析主机域名</span>
    ngx_resolver_ctx_t     *resolver_ctx;

     <span>// proxy上下文,用于Nginx双向透传客户端与邮件服务器间的通信</span>
    ngx_mail_proxy_ctx_t   *proxy;

     <span>// 表示与邮件服务器交互时,当前处于哪种状态</span>
    ngx_uint_t              mail_state;

     <span>// 邮件协议类型</span><span>unsigned</span>                protocol:<span>3</span>;

    <span>// 1:表示当前读或写操作需要被阻塞</span><span>unsigned</span>                blocked:<span>1</span>;

    <span>// 1:请求需要结束</span><span>unsigned</span>                quit:<span>1</span>;

    <span>// 一下三个标志位仅在解析具体邮件协议时由邮件框架使用</span><span>unsigned</span>                quoted:<span>1</span>;
    <span>unsigned</span>                backslash:<span>1</span>;
    <span>unsigned</span>                no_sync_literal:<span>1</span>;

    <span>// 当使用SSL协议时才有意义</span><span>unsigned</span>                starttls:<span>1</span>;
    <span>unsigned</span>                esmtp:<span>1</span>;

    <span>// 表示与认证服务器交互时的记录认证方式</span><span>unsigned</span>                auth_method:<span>3</span>;

    <span>// 1:表示认证服务器要求暂缓接收响应,Nginx会继续等待认证服务器的后续响应</span><span>unsigned</span>                auth_wait:<span>1</span>;

     <span>// 验证时的用户名</span>
    ngx_str_t               login;

    <span>// 验证时的密码</span>
    ngx_str_t               passwd;

     <span>// 作为Auth-Salt验证的信息</span>
    ngx_str_t               salt;

    <span>// 一下三个成员仅用于IMAP通信</span>
    ngx_str_t               tag;
    ngx_str_t               tagged_line;
    ngx_str_t               text;

     <span>// 当前连接上对应的Nginx服务器地址</span>
    ngx_str_t              *addr_text;

    <span>// 主机地址</span>
    ngx_str_t               host;

    <span>//一下四个成员仅用于SMTP通信</span>
    ngx_str_t               smtp_helo;
    ngx_str_t               smtp_from;
    ngx_str_t               smtp_to;

    ngx_str_t               cmd;

     <span>// 在于邮件服务器交互时,表示解析自邮件服务器的消息类型</span>
    ngx_uint_t              command;

    <span>// 存放来自下游客户端的邮件协议中的参数</span>
    ngx_array_t             args;

     <span>// 当前请求尝试访问服务器验证的次数</span>
    ngx_uint_t              login_attempt;

    <span>/* used to parse POP3/IMAP/SMTP command */</span>    ngx_uint_t              state;
    u_char                 *cmd_start;
    u_char                 *arg_start;
    u_char                 *arg_end;
    ngx_uint_t              literal_len;
} ngx_mail_session_t;</code>
ログイン後にコピー

著作権表示: 痛みはあなたの心の中にだけあります。

上記は、「Nginx を深く理解する」のメモで ngx_mail 関連の構造を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人の参考になれば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

nginx でプロキシ プロトコルを構成して使用する方法 nginx でプロキシ プロトコルを構成して使用する方法 May 18, 2023 am 08:47 AM

nginx で proxyprotocol が使用される場合、nginx は Web サーバーおよびプロキシ サーバーであることがわかります。通常、nginx はプロキシサーバーまたは負荷分散ソフトウェア (Haproxy、Amazon Elastic LoadBalancer (ELB)) の背後で動作します。クライアントは最初にプロキシサーバーまたは LSB 負荷分散ソフトウェアを要求します。そして nginx へ 実際の Web アクセスを実行します。複数のソフトウェア層を通過するため、IP アドレス、ポート番号などの一部のクライアント情報が隠される可能性があり、問題分析やデータ統計に悪影響を及ぼします。 , 実際の顧客を獲得できるようにしたい

PHPメール活用ガイド シンプルでわかりやすいメール送信チュートリアル PHPメール活用ガイド シンプルでわかりやすいメール送信チュートリアル Mar 28, 2024 pm 12:12 PM

PHP は、Web アプリケーションの開発に広く使用されているスクリプト言語であり、電子メール送信を処理するための多くの機能を提供します。この記事では、PHPのメール送信機能の使い方と具体的なコード例を紹介します。 1. 準備 PHP を使用して電子メールを送信する前に、まずサーバーが電子メールを送信するように設定されていることを確認する必要があります。一般に、電子メールを送信するには SMTP サーバーが必要です。 Gmail の SMTP など、電子メール プロバイダーが提供する SMTP サーバーを使用できます。

Python組み込み型strソースコード解析 Python組み込み型strソースコード解析 May 09, 2023 pm 02:16 PM

1 Unicode コンピュータ ストレージの基本単位は 8 ビットで構成されるバイトです。英語は 26 文字といくつかの記号のみで構成されているため、英語の文字はバイト単位で直接格納できます。ただし、他の言語 (中国語、日本語、韓国語など) では、文字数が多いため、エンコードに複数のバイトを使用する必要があります。コンピューター技術の普及に伴い、非ラテン文字エンコード技術は発展を続けていますが、依然として 2 つの大きな制限があります。 多言語サポートがないこと。 ある言語のエンコード スキームを別の言語で使用することはできません。また、統一された標準もありません。たとえば、中国語には GBK、GB2312、GB18030 など、多くのエンコード標準があります。エンコード方式が統一されていないため、開発者は異なるエンコード間で相互に変換する必要があり、必然的に多くのエラーが発生します。

Javaの組み込みメールAPIを使用してメール送信機能を実装する方法 Javaの組み込みメールAPIを使用してメール送信機能を実装する方法 May 11, 2023 pm 12:49 PM

要件: 電子メールを送信するには、jdk ネイティブ API - java.mail を使用して電子メール関数を実装します。次のコードは、qq メールボックスを例として電子メールを送信できます。 mail.MessagingException; importjavax.mail.Session;importjavax.mail.Transport;importjavax.mail.internet.Inte

SpringBoot Mailメールタスクを構成する方法 SpringBoot Mailメールタスクを構成する方法 May 12, 2023 pm 10:37 PM

1. はじめに 電子メールの送信は、登録の確認、パスワードの忘れ、またはユーザーへのマーケティング情報の送信など、Web サイトの重要な機能の 1 つです。初期の頃は、JavaMail 関連の API を使用して電子メール送信に関連するコードを記述していましたが、その後、Spring は JavaMailSender から撤退し、電子メール送信プロセスが簡素化されました。その後、springboot がこれをカプセル化し、現在は spring-boot-starter-mail です。 2. 簡単な使用法 1. spring-boot-starter-mail パッケージを pom パッケージに追加して、org.springframework.bootspring- を参照するように pom パッケージを構成します。

Python の __str__ と __repr__ の類似点と相違点は何ですか? Python の __str__ と __repr__ の類似点と相違点は何ですか? Apr 29, 2023 pm 07:58 PM

__str__ と __repr__ の類似点と相違点は何ですか? 文字列の表現については誰もが知っています。Python の組み込み関数 repr() は、識別を容易にするためにオブジェクトを文字列の形式で表現できます。これが「文字列表現」です。 repr() は、特別なメソッド __repr__ を通じてオブジェクトの文字列表現を取得します。 __repr__ が実装されていない場合、ベクトルのインスタンスをコンソールに出力すると、結果の文字列が次のようになります。 >>>classExample:pass>>>print(str(Example()))>>>

CentOSのメールコマンドmailの使い方を詳しく解説 CentOSのメールコマンドmailの使い方を詳しく解説 Jan 05, 2024 pm 10:57 PM

1. メールの基本構文 h|headers は現在のメールリストを表示します l|list は現在サポートされているコマンドリストを表示します?|help メールリストを表示するための複数のコマンドパラメータを表示します 使い方 d 現在のメールを削除し、ポインタを下に移動します。 d1-100 メールを削除 1 ~ 100 t|type|more|p|pagenum 特定のメールを読む n|next|{何も入力しない} 現在ポインタがある次のメールの内容を読みます;読んでいるときにスペースキーを押しますページをめくり、Enter キーを押すと 1 行下に移動します。 n|next|{何も入力しない}num 特定の電子メールを読みます。 f|fromnum 電子メールのヘッダーを表示します。 現在のポインタがある電子メールのヘッダーを表示します。見つかったファイル|フォルダーの表示

PHP メールを理解する: 電子メール送信のワークフロー分析 PHP メールを理解する: 電子メール送信のワークフロー分析 Mar 28, 2024 am 08:39 AM

PHPMail: 電子メール送信のワークフローの分析、具体的なコード例が必要です。インターネットの普及と電子メールの普及により、電子メール送信は私たちの日常生活や仕事に不可欠な部分になりました。 Web サイト開発では、ユーザーが重要な通知や確認情報を受信できるように、コードを介して電子メールを送信する必要があることがよくあります。 Webサイト開発で広く使われているスクリプト言語であるPHPには、便利なメール送信機能も備わっています。この記事では、PHPMail のワークフローを紹介し、具体的なコード例を示します。

See all articles