2025/09/20(土)さくらインターネットMLでFromを書き換えてSPFalignmentを成功させる

2025/9/30改訂

このページの簡便法は、間便法:Gmailにも届くメーリングリスト-さくらインターネット をご参照ください。

さくらインターネットのメーリングリストでFromを書き換える

メーリングリスト改善/さくらインターネット/Reply-toヘッダにて、reply-toの問題は解決しました。
続いて、DMARCを通させるためにFrom書換をしてみましょう。

google groups,Microsoft365などは、From書換をしています。さくらインターネットもコントロールパネルで変更できるようにしてほしいものですが、執筆時点では対応していません。

Fromを書き換えないことには、DMARCのアライメントが通りません(SPFアライメント(alignment)は、ヘッダFROMとMLの発信envelope-from(return-path)の一致をみます)。
ここでは、From 投稿者の表示名_via_ML <MLアドレス> と変更する方法を紹介します。
もし、投稿者の表示名が存在しない場合(=メールアドレスのみの場合)は、投稿者のアドレスの@より左の部分だけを表示名として取り込みます。
これで SPFアライメント は通ることとなります(ヘッダFromとenvelope-from(return-path)が一致)。
DKIMはMLが件名等を書き換えるため、壊れたままとなるので、DKIMアライメントに行き着く前に失敗します。しかし、Gmail は、SPFアライメントか,DKIMアライメントが通れば受信してくれるので、大丈夫です(執筆時点)。

※さくらインターネットは、MLにおいてDKIMを再署名する機能は提供してない。

設定の仕方は、fmlにスクリプトを組み込む方法 をご参照ください。


SUFFIXにつける追加文字(SUFFIX)は自由に変更できます。日本語もOK。
スクリプトを作成するファイル(CF)の文字コードは必ず確認してください。
my $DISPLAY_NAME_SUFFIX = '_via_ML';
my $CF_FILE_ENCODING = 'shiftjis'; # Change this if CF file uses different encoding
出力は、UTF-8 でのMIMEエンコーディングをデフォルトとしていますが、ISO_2022_JPでエンコードしたい場合には、下記のように変更してください。
my $OUTPUT_MIME_ENCODING = 'ISO-2022-JP';
以下スクリプト本体
$START_HOOK = q{
    # ========================================
    # Configuration Section
    # ========================================
    
    # Suffix to append to display names (configurable)
    # Change this value to customize the suffix
    my $DISPLAY_NAME_SUFFIX = '_via_ML';
    
    # Character encoding of this CF file (for Japanese suffix support)
    # Options: 'utf-8', 'shiftjis', 'euc-jp', 'iso-2022-jp'
    my $CF_FILE_ENCODING = 'shiftjis';  # Change this if CF file uses different encoding
    
    # Output MIME encoding for From header
    # Options: 'UTF-8' (international standard), 'ISO-2022-JP' (Japanese traditional)
    my $OUTPUT_MIME_ENCODING = 'UTF-8';  # Change to 'ISO-2022-JP' for legacy systems
    
    # Convert suffix to UTF-8 if it contains non-ASCII characters
    if ($DISPLAY_NAME_SUFFIX =~ /[\x80-\xFF]/) {
        # Suffix contains non-ASCII, decode from CF file encoding
        if ($CF_FILE_ENCODING ne 'utf-8') {
            my $temp = decode($CF_FILE_ENCODING, $DISPLAY_NAME_SUFFIX);
            if (defined $temp) {
                $DISPLAY_NAME_SUFFIX = $temp;
            }
        }
    }
    
    # ========================================
    # Reply-To Header Processing
    # ========================================
    
    # Check if sender is a mailing list member
    if (&MailListMemberP($From_address)) {
        # Member: Set Reply-To to mailing list if not already set
        unless (&GET_HEADER_FIELD_VALUE('reply-to')) {
            &DEFINE_FIELD_FORCED("reply-to", $MAIL_LIST);
        }
    }
    else {
        # Non-member: Add both original address and ML to Reply-To
        if (&GET_HEADER_FIELD_VALUE('reply-to')) {
            # Append ML to existing Reply-To
            &DEFINE_FIELD_FORCED("reply-to", &GET_HEADER_FIELD_VALUE('reply-to') . "," . $MAIL_LIST);
        } else {
            # Create new Reply-To with sender and ML
            &DEFINE_FIELD_FORCED("reply-to", $From_address . "," . $MAIL_LIST);
        }
    }
    
    # ========================================
    # From Header Rewrite Processing
    # ========================================
    
    # Load required modules
    use Encode qw(decode encode);
    use Encode::MIME::Header;
    
    # Get and save original From header
    my $orig_from = &GET_HEADER_FIELD_VALUE('from');
    &DEFINE_FIELD_FORCED('x-original-from', $orig_from);
    
    # Extract display name and email address from From header
    my ($display_name, $email_address) = extract_from_parts($orig_from);
    
    # Build new From header
    my $new_from;
    if ($display_name) {
        # Add configured suffix to display name
        $display_name .= $DISPLAY_NAME_SUFFIX;
        
        # Check if string contains non-ASCII characters
        if ($display_name =~ /[^\x00-\x7F]/) {
            # Ensure proper UTF-8 internal representation
            utf8::decode($display_name) unless utf8::is_utf8($display_name);
            
            # Encode entire display name as single MIME-Header block
            # This creates a proper RFC 2047 encoded-word
            my $encoded_name;
            if ($OUTPUT_MIME_ENCODING eq 'UTF-8') {
                # Use UTF-8 encoding (modern standard)
                $encoded_name = encode('MIME-Header', $display_name);
            } else {
                # Use ISO-2022-JP encoding (Japanese traditional)
                $encoded_name = encode('MIME-Header-ISO_2022_JP', $display_name);
            }
            $new_from = $encoded_name . ' <' . $MAIL_LIST . '>';
        } else {
            # ASCII only, use with quotes
            $display_name =~ s/"/\\"/g;  # Escape existing quotes
            $new_from = '"' . $display_name . '" <' . $MAIL_LIST . '>';
        }
    } else {
        # If no display name found, use local part of email address
        my $local_part = $email_address || 'unknown';
        $local_part =~ s/@.*$//;
        $new_from = '"' . $local_part . $DISPLAY_NAME_SUFFIX . '" <' . $MAIL_LIST . '>';
    }
    
    # Set new From header
    &DEFINE_FIELD_FORCED('from', $new_from);
    
    # ========================================
    # Function: Parse From Header
    # ========================================
    sub extract_from_parts {
        my ($from_header) = @_;
        my $display_name = '';
        my $email_address = '';
        
        # Return empty if From header is empty
        return ('', '') unless $from_header;
        
        # Store original for processing
        my $decoded_from = $from_header;
        
        # Check if header contains MIME encoding
        if ($from_header =~ /=\?[\w\-]+\?[BQbq]\?/) {
            # MIME encoded header detected - decode it
            my $temp = decode('MIME-Header', $from_header);
            if (defined $temp) {
                $decoded_from = $temp;
                # Ensure UTF-8 flag is set properly
                utf8::decode($decoded_from) unless utf8::is_utf8($decoded_from);
            }
        } else {
            # Not MIME encoded - should be ASCII only per RFC 5322
            # Log warning if non-ASCII bytes detected (RFC violation)
            if ($decoded_from =~ /[\x80-\xFF]/) {
                &LOG("warning: Non-ASCII bytes in non-MIME header (RFC violation): $from_header");
                
                # Special case: ISO-2022-JP with escape sequences
                # Some older systems might pass this through
                if ($decoded_from =~ /\x1b\$B/) {
                    my $temp = decode('iso-2022-jp', $decoded_from);
                    if (defined $temp) {
                        $decoded_from = $temp;
                    }
                }
                # For other non-ASCII cases, continue with original
                # (will likely result in using email local part as fallback)
            }
        }
        
        # Parse From header structure
        # Remove any leading/trailing whitespace
        $decoded_from =~ s/^\s+//;
        $decoded_from =~ s/\s+$//;
        
        # Pattern 1: "Display Name" <email@example.com>
        if ($decoded_from =~ /^"([^"]*(?:\\.[^"]*)*)"\s*<([^>]+)>/) {
            $display_name = $1;
            $email_address = $2;
            # Unescape quotes in display name
            $display_name =~ s/\\"/"/g;
        }
        # Pattern 2: Display Name <email@example.com> (no quotes)
        elsif ($decoded_from =~ /^([^<]+?)\s*<([^>]+)>/) {
            $display_name = $1;
            $email_address = $2;
            # Clean up display name
            $display_name =~ s/^\s+//;
            $display_name =~ s/\s+$//;
        }
        # Pattern 3: <email@example.com> (no display name)
        elsif ($decoded_from =~ /<([^>]+)>/) {
            $email_address = $1;
            $display_name = '';
        }
        # Pattern 4: email@example.com (bare email)
        elsif ($decoded_from =~ /([^\s<>]+@[^\s<>]+)/) {
            $email_address = $1;
            $display_name = '';
        }
        else {
            # Unable to parse
            &LOG("warning: Unable to parse From header: $decoded_from");
            # Try to extract email as last resort
            if ($decoded_from =~ /([^\s<>]+@[^\s<>]+)/) {
                $email_address = $1;
            }
        }
        
        # Clean up extracted values
        $email_address =~ s/^\s+//;
        $email_address =~ s/\s+$//;
        
        if ($display_name) {
            # Remove extra whitespace
            $display_name =~ s/^\s+//;
            $display_name =~ s/\s+$//;
            $display_name =~ s/\s+/ /g;
            
            # IMPORTANT: Remove surrounding quotes that may have been included from MIME decode
            # This prevents double-quoting when re-encoding
            $display_name =~ s/^"//;
            $display_name =~ s/"$//;
        }
        
        return ($display_name, $email_address);
    }
    
    # ========================================
    # End of Hook Processing
    # ========================================
};

2025/08/24(日)メールセキュリティ覚書(SPF,DKIM,DMARC)

基礎

電子メールの内部構造

呼称内容備考
エンベロープ配送制御用・SMTPプロトコル受信したメールには現れない。本当のエンベロープはSMTPセッション中だけに存在し、通常ユーザは直接見られない
ヘッダメッセージの属性・配送履歴・認証情報ヘッダ部には、ヘッダ部固有の情報のほか、エンベロープ由来の情報が書き込まれる。
ボディ本文と添付ファイル、MIMEで多層化可能

電子メールの経路

MUA (送信) → SMTP → 送信MTA → DNS (MXレコード) → SMTP → 受信MTA (MDA) → POP3/IMAP → MUA (受信)
略称名称役割
MUAMail User Agentメールの作成・閲覧ソフト
MTAMail Transfer Agent送信、受信サーバーであり、中継サーバーともなる
MDAMail Delivery Agent)メールの配送システム(ドメイン内部)

エンベロープ由来のヘッダ情報の例

Return-Path:
最終の受信サーバ*1が、その時に有効な MAIL FROM をコピーして付与する。
→ バウンス先(エラーメールの返送先)を記録する目的。

Envelope-From:
その時の受信サーバーは、その時に有効なMAIL FROMをコピーして付与する挙動が一般的な設定。

Delivered-To:
→ 実際に配送されたローカルの受信者アドレス。

X-Envelope-From / X-Envelope-To
→ 一部のMTAやフィルタが内部情報として追加する独自ヘッダ。標準化されていない(X-ヘッダ扱い)。

受信サーバによる取扱い

MAIL FROM(envelope-from)は複数の中継サーバーを通っても通常リレーである限り改変されない。
ただし、メーリングリスト、SRS、迷惑メール対策等で改変されることはある。

総合理解

パターン認証プロセスヘッダFROMとのアライメント(DMARC)
A SPF認証成功DMARCアライメント認証(return-pathとヘッダーFromの一致)
B DKIM認証成功DMARCアライメント認証(DKIM署名ヘッダーとヘッダーFromの一致)
A,Bのいずれかの成功で、DMARCは成功。

失敗した場合でも、ARC情報によてって、ある程度、救われる余地はある(ARCは完全な信頼性を有するにいたっていないので苦しいところ。将来性はあると見られている)。
  • メーリングリストは一般的に、エンベロープMAIL FROM変換(envelope-fromをMLのドメインに書換)するので、SPF認証はPASSしても、DMARCのSPFアライメントで失敗。
  • メーリングリストがDKIM証明内容のコンテンツを書き換えた場合には、DKIMは失敗する。subjectなどの書換は失敗要因。
  • 一般の転送は、エンベロープMAIL FROM変換(envelope-fromを書換)をしない。return-pathのドメインのDNSのSPF設定に転送サーバのIPアドレスの記載がないので、SPF認証で失敗する。
  • 転送時にSRSを適用すれば、エンベロープMAIL FROM変換(envelope-fromを書換)をするので、SPF認証は pass するが、DMARCのSPFアライメントで失敗。
  • 一般の転送は、本文並びにDKIMのh=タグ対象のヘッダを書き換えない。DKIMも壊れないので、DKIMは壊れずに最終MTAに届き、DKIM認証をpass。DMARCアライメントもpassする。
一般の転送は、風呂敷で包んだまま運ぶからDKIMによって内容(署名対象ヘッダも含む)は崩れない。DKIMは配送経路はどうでもいいけど、DKIMさえ崩れなければ、最初の発信者がこの内容を発信したことを保証する。SPFは、内容は保証しないけど、最終経路のみの最終発信者の身元が MAIL FROMドメインであることを保証するものなので、一般の転送ではSPF失敗する。

  • 上記から、メーリングリストの場合は、DMARC失敗となる可能性が高い。ARCでどこまで受信サーバーが斟酌して救われるか、というレベルとなる。
よって、件名等を書き換えるメーリングリストを使って、DMARCアライメントまで突破しようと思えば、ヘッダFROMをMLのドメインに書き換える、すなわちFROM書換、しかない
さくらインターネットメーリングリストでFROM書換をする方法

※だからGoogle GroupsやMicrosoft365のメールグループは、From書換をしているのでしょう。
※ARCも有力な仕組みであるとは言われているようですので、将来はどうなるかはわかりません。

SPF

return-path(=最終MTAに到着した時にHELOした送信サーバーから送付されるMAIL FROM*2(=envelope-from)) 記載のドメインから発信されているかを確認する技術である。当該検証ドメインのTXTレコードにあるspfレコードに、最終MTAに送信したサーバーのIPアドレスの記載があれば、passする。すなわち、SPFは適切に設定されており、かつ、送信サーバーと検証サーバーがSMTPプロコトルとして直結(1:1)通信していれば pass する。

SPFレコードの役目は「そのIPアドレスから発信されたメールなら正当なものですよ」ということを宣言するものである。
ドメインのDNS textレコード に メールサーバーのFQDNまたはIPアドレスを記載する。それを受信側で検証し、return-path の正当性を検証する。
SMTPプロコトルとして直結していなければ fail する。

よってSPFは、最終MTA直前の最後の経路*3しか、保証しない。経路全体は保証しない。「自分に接続してきた相手の正当性のみを確認」するものである。
  • 【送信MTA →→→ 転送MTA(ML) →→ 最終MTA】 の場合、
→→→がSPF的にfailであっても、転送MTAがSPFを適切に設定し、かつ、MAIL FROMを転送MTAに書き換えていれば、→→は、pass ということとなる。
一般的かつ正常なメーリングリストに、怪しげなメールがポストされた場合、最終MTAのSPFチェックにおいては、SPFはpassすることになる*4
  • 【送信MTA →→→ 転送MTA(MLではないただの転送) →→ 最終MTA】 の場合、
→→→がSPF的にどうであっても、転送MTAは、MAIL FROMを書き換えないので、仮に転送MTAにおいて適切にSPFが設定されていたとしても、→→において、SPFはfailすることとなる(理論上、送信MTAと転送MTAが同じドメインであれば、passする可能性はあるが、実務としてはありえないだろう)。


SPFはヘッダFromは一切検証対象としないので、ヘッダfromなりすましは、防げない。

設定例
https://www.naritai.jp/guidance_spf_example.html

DKIM

メールヘッダー部のDKIMヘッダーに、認証用ドメインを記載、これを認証する。

DKIMヘッダーには、メール本文及び複数のヘッダ(h=タグで定義される)*5をハッシュ化したものに、認証用ドメインの秘密鍵で暗号化した文字列を記載(署名することと同義)。受信側は、認証用ドメインのtextレコードから公開鍵を入手し、DKIMに記載された文字列を複合化したハッシュと、受信側で[本文+指定のヘッダ]をハッシュ化したものとの一致を確認することで、認証用ドメインを確認する。

※ハッシュ化は、元の文章が1文字でも異なれば生成されるハッシュが一致しないから、本文+ヘッダーを統合するときに正規化が行われ、空白や改行は無視される方式が多く使われる(relaxedモード)。厳密なモードも定義されているが、経路途中のMTAが勝手に空白や改行を加えることもあるから、pass率が著しく落ちてしまうので、relaxedを使うのが実務である。

認証用ドメインは、ヘッダFromを記載する方法と、ヘッダFromではなくMAIL FROM(envelope-from)を記載する方法(=第三者認証)がある*6

第三者認証が使える以上、ヘッダfromなりすましを防止できない(ただしDMARCを併用すれば、アライメントで失敗するので、ヘッダFromなりすましを防止できることとなる)。
 

https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/

DKIMでは、署名するヘッダーを選択できるが、通常、subjectヘッダも含まれており、subjectを変更するタイプのメーリングリストの場合、認証に失敗する。
(署名対象は、当該ヘッダー+本文)

ARCは、受信したサーバーが元のDKIMを認証し、成功していればそれを記録し(AAR)、その記録(AAR)と新しい本文等署名(AMS)のふたつをまとめて署名(封印:AS)するが、新たにDKIMとして署名するものではない。メーリングリストはDKIM署名を検証して、ヘッダに記録することとなるが、元のDKIM署名が壊れたままの場合は、それ以降のDKIM署名は壊れたままとなる。ARCは、認証経路の信頼の連鎖(チェーン)を保証しようとするプロコトルであり、送信元の改ざんを防ぐ仕組みそのものではない。あくまでも、チェーンの保証である(ただし、当該中継サーバーが信頼できることが前提なので、そこがARCの弁慶の泣き所となっている。)。

さくらインターネットは、2025/1に、ARCにも対応した。

転送サーバーが、前経路のDKIMを壊した場合、転送サーバーが自分のドメインでDKIM署名することは可能(再署名)。ただし、ヘッダーFromを書き換えない限り、DMARCアライメントで失敗するので、DMRACはpassしない。再署名は万能ではない。
さくらインターネットでは、メーリングリストにおいてはARCのみの対応であり、DKIM再署名までは対応していない(執筆時点)。

DMARC

Domain-based Message Authentication, Reporting and Conformance

SPF、DKIMは、envelope from と ヘッダーFromが異なることを許容するが、DMARCアライメントは、少なくとも一方において、[SPFにおいては認証が成功し、かつ、envelope from と ヘッダーFromが一致していること] [DKIMにおいては、d=ドメイン(=通常署名時のヘッダーFromが採用される)と到着時ヘッダーFromの一致]を要求する。
これにより、ヘッダーFromなりすましを防止する。

https://maildata.jp/specification/dmarc.html

転送メール、メール配信サービス、メーリングリストサービスを使う場合、SPFは、Alignmentチェックをパスしないので、DKIMにおいて、ヘッダFromを認証する方式を確保しておく必要がある。
しかし、DKIMも万能ではなく、転送、MLサービスによって、本文(可視ヘッダー含む)が改変された場合、ハッシュ一致しなくなるので、DKIMも失敗する可能性がある。特に件名を変更するタイプが要注意であろう。

その欠点を補完するために、ARCがあるが、限界がある。
これは転送にかかわる経路途中のサーバーにおいて、DMARC認証を行い、その結果をヘッダーに記録し、受信サーバーにつなげる仕組みである。
確実な認証の引継ではなく、頼むよ~、レベルなので、斟酌するかは受信サーバー次第。
https://maildata.jp/specification/arc.html

*1 : 正しくはインターネットに接続された最終の受信MTA

*2 : HELO時のドメイン名でSPF検証することも定められているが、実装としてはMAIL FROM検証が必須

*3 : 通常の1:1通信の場合は最後の経路といっても、インターネット上の全経路、ということとなる

*4 : その他の技術で迷惑メールは防御される必要がある

*5 : 通常To,From,Subject等が入る

*6 : というか、認証用ドメインなので、どちらでもないドメインを記載することも可能。意味は無いが。

まとめ

技術強み弱み運用Tips
SPF導入簡単IP検証,転送時失敗しやすいSRSと組み合わせる
DKIM改ざん検知MLで署名破壊再署名を検討
DMARC包括的ポリシーアライメント厳格ARCで補完
ARC中継時の緩和普及が遅れている中継者信頼性を確認

Gmail のセキュリティーポリシーの変更 2024/2

https://zenn.dev/ken_yoshi/articles/gmail-new-requirements-2024

5000通未満と以上で対応が分かれるようだが、要確認

MLサービス参考

http://www.kt.rim.or.jp/~atsato/ml/mlprov.html

DKIMヘッダーの例(Gemini)

以下は、メールヘッダーに実際に含まれるDKIM-Signatureフィールドの典型的な例です。
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
s=20231120; t=1756479600; bh=g+Lq+J9uK8/b+R0j+v7oF+P+5F+n8P/J1+q/g==;
h=From:To:Subject:Date:Message-ID; b=...signature_string...

各タグの解説

v=1
意味: DKIM署名のバージョンを示します。現在はバージョン1が一般的です。

a=rsa-sha256
意味: 署名アルゴリズムを示します。

rsa: 公開鍵暗号方式のアルゴリズム。
sha256: ハッシュ関数。

c=relaxed/simple
意味: 正規化アルゴリズムを示します。

relaxed: 緩和モード。メールヘッダーの空白や大文字・小文字の違いを無視して検証します。
simple: 厳格モード。メールヘッダーの空白や変更を一切許容しません。

この例では、ヘッダーにはrelaxedモード、本文にはsimpleモードが適用されています。

d=example.com
意味: 署名ドメイン。このメールに署名した組織のドメインです。
DMARCアライメントの鍵となる部分です。 このドメインが、メールヘッダーのFromフィールドに記載されたドメインと一致するかどうかがDMARCアライメントの評価基準となります。

s=20231120

意味: セレクター。この署名を検証するために使用する公開鍵の名前を示します。

受信側のメールサーバーは、d=example.comとs=20231120の組み合わせでDNSサーバーを検索し、公開鍵を取得します。

t=1756479600
意味: 署名が作成された日時をUnixタイムスタンプで示します。

bh=...
意味: メールの本文のハッシュ値。本文が改ざんされていないかを確認するために使われます。

h=From:To:Subject:Date:Message-ID
意味: 署名に含まれるヘッダーフィールドのリスト。ここに記載されたヘッダーが改ざんされていないかを確認します。

b=...signature_string...

意味: 署名データ。hタグで指定されたヘッダーとbhタグで指定された本文のハッシュ値を、秘密鍵で署名した文字列です。受信側は公開鍵を使ってこの署名を検証します。
このDKIMヘッダー全体がメールに添付されることで、受信側はメールの送信元と内容が正当であることを確認できます。

歴史

2023年10月
グーグルがにGoogleは、Gmailの新しいガイドライン発表。2024.2から適用。
https://support.google.com/a/answer/81126?hl=ja

2024年1月31日
さくらインターネットがDKIM対応発表(SPFは以前から対応)
https://www.sakura.ad.jp/corporate/information/announcements/2023/12/19/1968214527/

2024年2月
新ガイドライン施行

2025年1月~2月
さくらインターネットがARC対応。
https://www.sakura.ad.jp/corporate/information/announcements/2025/01/14/1968218162/

AIによるまとめ

電子メール認証技術の整理(改訂版)

1. SPF の本質

  • SPF は **最終受信 MTAが直接接続してきたサーバの IP** と、SMTP セッションで名乗られたドメイン(MAIL FROM または HELO)を突き合わせる仕組み。
  • SPF が保証できるのは **直前ホップの正当性のみ**。経路全体やオリジナル送信者を保証するものではない。
  • 通常のリレーでは `MAIL FROM` は改変されないが、転送サーバが **SRS (Sender Rewriting Scheme)** を導入している場合は書き換えられる。

2. SPF と転送の関係

  • 転送サーバが `MAIL FROM` をそのまま流すと、最終受信 MTAから見ると「転送サーバの IP とオリジナルドメイン」の組合せになる。
  • その IP が SPF レコードに載っていなければ Fail。
  • これを解決するのが **SRS**。転送サーバのドメインに書き換えることで SPF Pass が成立する。

3. DKIM の役割

  • **`d=` タグは署名ドメイン**。MAIL FROM とは関係なく、署名者が主張するドメインを示す。
  • メッセージヘッダや本文に署名をかけることで「改ざん検知」を可能にする。
  • メーリングリストが Subject 追加やフッタ挿入をすると DKIM 署名は壊れる。

4. DMARC の位置づけ

  • DMARC は **RFC5322.From ヘッダのドメイン**を基準に、SPF/DKIM の結果との alignment を確認する。
  • SPF/DKIM いずれかが Pass かつ alignment していれば DMARC Pass。
  • メーリングリストが From を書き換えない場合、SPF/DKIM が壊れて DMARC Fail になる。
  • 実務上は **From 書換(From munging)** を行い、ML ドメインで DKIM 再署名することで DMARC Pass を成立させるケースが多い。

5. ARC の役割

  • ARC は **前段での SPF/DKIM/DMARC の結果を署名付きで引き継ぐ仕組み**。
  • これにより「ML で署名が壊れても、オリジナルでは Pass だった」ことを最終受信者が確認できる。
  • ただし ARC の信頼性は「中継者を信用できるか」に依存するため、単独では不十分。
  • 現状では Gmail や Microsoft 365 が導入しており、将来的には From 書換を減らせる可能性がある。

2025/07/27(日)和暦と西暦 早見表

和暦西暦
令和8年2026
令和7年2025
令和6年2024
令和5年2023
令和4年2022
令和3年2021
令和2年2020
令和元年2019
4月30日まで平成31年、5月1日以降令和元年
平成31年2019
平成30年2018
平成29年2017
平成28年2016
平成27年2015
平成26年2014
平成25年2013
平成24年2012
平成23年2011
平成22年2010
平成21年2009
平成20年2008
平成19年2007
平成18年2006
平成17年2005
平成16年2004
平成15年2003
平成14年2002
平成13年2001
平成12年2000
平成11年1999
平成10年1998
平成9年1997
平成8年1996
平成7年1995
平成6年1994
平成5年1993
平成4年1992
平成3年1991
平成2年1990
平成元年1989
1月7日まで昭和64年、1月8日以降平成元年
昭和63年1989
昭和63年1988
昭和62年1987
昭和61年1986
昭和60年1985
昭和59年1984
昭和58年1983
昭和57年1982
昭和56年1981
昭和55年1980
昭和54年1979
昭和53年1978
昭和52年1977
昭和51年1976
昭和50年1975
昭和49年1974
昭和48年1973
昭和47年1972
昭和46年1971
昭和45年1970
昭和44年1969
昭和43年1968
昭和42年1967
昭和41年1966
昭和40年1965
昭和39年1964
昭和38年1963
昭和37年1962
昭和36年1961
昭和35年1960
昭和34年1959
昭和33年1958
昭和32年1957
昭和31年1956
昭和30年1955
昭和29年1954
昭和28年1953
昭和27年1952
昭和26年1951
昭和25年1950
昭和24年1949
昭和23年1948
昭和22年1947
昭和21年1946
昭和20年1945
昭和19年1944
昭和18年1943
昭和17年1942
昭和16年1941
昭和15年1940
昭和14年1939
昭和13年1938
昭和12年1937
昭和11年1936
昭和10年1935
昭和9年1934
昭和8年1933
昭和7年1932
昭和6年1931
昭和5年1930
昭和4年1929
昭和3年1928
昭和2年1927
昭和元年1926
12月25日まで大正15年、12月26日以降昭和元年
大正15年1926
大正14年1925
大正13年1924
大正12年1923
大正11年1922
大正10年1921
大正9年1920
大正8年1919
大正7年1918
大正6年1917
大正5年1916
大正4年1915
大正3年1914
大正2年1913
大正元年1912
7月29日まで明治44年、7月30日以降大正元年
明治44年1912
明治44年1911
明治43年1910
明治42年1909
明治41年1908
明治40年1907
明治39年1906
明治38年1905
明治37年1904
明治36年1903
明治35年1902
明治34年1901
明治33年1900
明治32年1899
明治31年1898
明治30年1897
明治29年1896
明治28年1895
明治27年1894
明治26年1893
明治25年1892
明治24年1891
明治23年1890
明治22年1889
明治21年1888
明治20年1887
明治19年1886
明治18年1885
明治17年1884
明治16年1883
明治15年1882
明治14年1881
明治13年1880
明治12年1879
明治11年1878
明治10年1877
明治9年1876
明治8年1875
明治7年1874
明治6年1873
明治5年1872
明治4年1871
明治3年1870
明治2年1869
明治元年1868