10BASE-T. Shortly, to send a packet to Ethernet network, you need manchester encoded data at 10MHz. Manchester could be easily created from synchronous serial bus Clock and Data signals using XOR gate.

Manchester encoding (from Wikipedia)

Fortunately, PIC18 USART could run at 10MHz in synchronous mode. Unfortunately, you need external XOR gates to convert DATA and CLK to differential Manchester.

DIP package. Both PIC18F1320 and 74AC86 exists in DIP package, so you could easily build this project on a breadboard.

About magnetics. You could use any ethernet magnetics you could get in your drawer. You could use DIY transformer made on small 2000 ferrite ring with approx 17 turns windings (inductance must be >350uH).  If your line is not very long, you could run without magnetics at all, directly to twisted pair, in any case your switch had magnetics to decouple. You could also use capacitors to decouple from twisted pair on device side.

Transmit only. Yes, this is a limitation, however, today, even simple transmission of UDP packet is enough to deliver your data to any host around the Earth. You could even use existing out-of-the-box tools to receive and store incoming UDP packets, say, use remote syslog feature to receive and store messages sent by your device.

Simple example provided in source archive sends UDP packet every second from 192.168.255.200:1024 (MAC 00:DE:AD:BE:EF:00) to 192.168.255.1:1024 (MAC 00:01:02:03:04:05). If you need other addresses and ports - just edit them in source code and rebuild. In the example 1st and 2nd bytes of UDP packet payload contains current PORTA and PORTB data respectively. Byte 18 is set to the value of TO flag of RCON register of PIC18.

Build. To build the example code you need gputils and sdcc. Just unpack and run make in /firmware directory

Other MCUs. Of course it is possible to use this method of UDP packets generation with any other MCU if it has synchronous serial peripheral capable of sending bytes back-to-back with 10MHz clock.