SMTP Protocol Deep Dive: Sending/Receiving Emails via Raw IP Addresses Instead of Domains


2 views

While the internet fundamentally operates on IP addresses, email protocols were designed with domain-based addressing as a core principle. The RFC 5321 (SMTP) specification explicitly requires domain names in envelope addresses. This creates an interesting technical constraint when attempting IP-based email delivery.

In theory, you could configure a mail server to accept emails addressed to user@[192.168.1.1] (with brackets). Some MTAs like Postfix can be forced to accept such addresses with these configuration tweaks:

# In main.cf
allow_untrusted_routing = yes
ignore_mx_lookup_error = yes
smtp_skip_5xx_greeting = yes

However, most public mail servers (Gmail, Outlook, etc.) will reject such messages due to:

  • SPF/DKIM validation failures
  • Absence of reverse DNS
  • Spam filter heuristics

For IoT device communication, consider these protocol alternatives that natively support IP addressing:

// MQTT Example (Node.js)
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://192.168.1.100')

client.on('connect', () => {
  client.subscribe('iot/device/status')
  client.publish('iot/device/status', 'online')
})

In controlled networks, you can create a local DNS zone file mapping IPs to domains:

; Example zone file
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
  2023081501 ; serial
  3600       ; refresh
  1800       ; retry
  604800     ; expire
  86400 )    ; minimum

1.1.168.192.in-addr.arpa. IN PTR mail.iot.example.com.

Bypassing domain validation creates multiple security vulnerabilities:

  • Easier phishing attacks (no visible domain reputation)
  • Reduced traceability for abuse reports
  • Interference with TLS certificate validation

While standard email infrastructure relies heavily on domain names (MX records, SPF, etc.), SMTP protocol itself operates at the TCP/IP layer. Theoretically, you could attempt direct delivery to an IP by bypassing DNS resolution:

# Python example using smtplib with IP destination
import smtplib

server = smtplib.SMTP('192.168.1.100', 25)  # Direct IP connection
server.sendmail('user@192.168.1.50', ['recipient@192.168.1.100'], 'Test message')

Several technical roadblocks exist:

  • Reverse DNS Requirements: Most mail servers enforce rDNS checks
  • SPF/DKIM Limitations: Authentication mechanisms assume domains
  • Port 25 Blocking: Many ISPs restrict outbound SMTP traffic

For device-to-device communication, consider these alternatives:

// MQTT over TLS (IoT-friendly alternative)
const mqtt = require('mqtt')
const client = mqtt.connect('mqtts://192.168.1.100', {
  clientId: 'device_123',
  rejectUnauthorized: false // For testing only
})

If you must use email protocols, configure Postfix to accept raw IP addresses:

# /etc/postfix/main.cf
mydestination = $myhostname, localhost, 192.168.1.100
local_header_rewrite_clients = permit_mynetworks

Warning signs for production environments:

  • IP-based emails are frequently marked as spam
  • No TLS certificate validation possible
  • Vulnerable to IP spoofing attacks