A gondom az, hogy a Gmail kekeckedik velem. Az általam távolról karbantartott gépek futtatnak egy shell scriptet, ebben mailx-szel elküldenek nekem egy kis levelet a WAN oldali IP-címükkel, az ifconfig, a df -h kimenetével, kernel verzióval, dátummal, szóval fontosabb paraméterekkel, ami a frissítéshez kell nekem. Ezt egy erre a célra fenntartott gmail-es címemre teszik a gépek. Egy ideje visszapattannak a levelek az alábbi szöveggel:
Our system has detected that this message is not 550-5.7.1 RFC 2822 compliant. To reduce the amount of spam sent to Gmail, this 550-5.7.1 message has been blocked. Please review 550 5.7.1 RFC 2822 specifications for more information.
A mailx használata a scriptben így néz ki, a változóknak persze van aktuális értékük:
mail -s "$subject" "$address" <<-EOF
Date: $DATE
Hostname: $HNAME
Release: $RELEASE
System: $UNAME
IP address: $IPADDR
============================== ifconfig ==============================
$IFCONFIG
======================================================================
------------------------------ df -h ------------------------------
$DF
----------------------------------------------------------------------
EOF
Az RFC 2822 igen hosszú ahhoz, hogy kiszúrjam, mi is a pontos baja. Örülnék, ha kapnék tippeket, mi az, amiben nem szabványos ez a levél, s amiért a Gmail nem fogadja ezt be. A levelet az illető gép ISP-jének SMTP szerverén keresztül küldöm.
Update: A megoldás mikéntje egy május 28-i hozzászólásomban olvasható.
- 6367 megtekintés
Hozzászólások
Sokféle mailx van manapság forgalomban, nem tudom, hogy melyik mennyire intelligens. Én most kipróbáltam az első, utamba eső PC-n (Debian 6.0, "bsd-mailx" csomag) és azt kellett megállapítanom, hogy az ég világon semmi MIME kódolást nem csinál meg önmagától.
Az RFC sokmindent előír. A fejléc elemeinek kódolását (beleértve a From/To/Subject sorokat is), a levéltörzs kódolását, stb. Ezek nálad tehát jó eséllyel mind hiányoznak.
- A hozzászóláshoz be kell jelentkezni
Tételezzük fel, hogy értelmes a beállítás, azaz a szkriptben a változók beállítása előtt volt egy export LANG=C (manapság inkább egy export LC_ALL=C) beállítás, azaz minden angolul szerepel a fenti parancsok kimenetében. Ebben az esetben én max a subject-ben keresnék ékezetes szöveget. De valóban, átlag mailx nem fog majmolódni.
Amúgy az a mailx nem csinál semmit a küldéshez, hanem a gépen fenn levő lokális MTA-nak adja át maximum a levelet. Szerintem.
- A hozzászóláshoz be kell jelentkezni
Most kipróbáltam a heirloom mailx-et, és a BSD mailx-szel ellentétben teljesen f.sza MIME levelet produkált:
To: teszt@juzer.hu
Subject: =?utf-8?B?w6FydsOtenTFsXLFkQ==?=
User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20130407101741.83586FBD3@kozod.hozza.hu>
From: semmi@kozod.hozza.hu (Egervary Gergely)
Kukucs
- A hozzászóláshoz be kell jelentkezni
Köszönöm a hozzászólásokat! Most elmegyek itthonról, amint érkezésem lesz, foglalkozom megint a problémával, hiszen szeretném azt megoldani.
A manual alapján Heirloom mailx 12.5. Egyébként Fedora csomagból használom, például ez:
mailx-12.5-7.fc18.x86_64
Meg néhány gépen Fedora 17 hasonló csomagja.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
export sendmail=nowhere
mailx -s "$subject" "$address" << EOF
...
EOF
Ekkor a mailx - működő sendmail hiányában - le fogja rakni a kész levelet egy dead.letter nevű fájlba, aztán nézd meg, hogy hogyan néz ki...
- A hozzászóláshoz be kell jelentkezni
Köszönöm, meg fogom vizsgálni! A sendmail valóban kisbetűvel kell?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
igen, a man page is azt mondja.
- A hozzászóláshoz be kell jelentkezni
Nos, megoldottam a problémát. A gond az volt, hogy az RFC2822 szerint a From: mező megadása kötelező, a mailx viszont ezt nem töltötte ki. Van lehetőség a -r kapcsoló után megadni a feladót, ebbe viszont az msmtp-nek fájdult bele a feje, tudniillik a mailx a -r feladó konstrukciót parancssori paraméterként átadta az msmtp-nek, csak ez utóbbinak nincs ilyen paramétere. Erre kitaláltam, hogy jó, akkor cseréljül le a -r-et -f-re, hiszen az msmtp manualját olvasva az derül ki, neki -f cím kell.
Erre írtam az alábbi scriptet:
#!/bin/bash
i=0
while [ $# -gt 0 ]; do
if [ x"$1" = x'-r' ]; then
param[i]='-f'
else
param[i]="$1"
fi
shift
((i++))
done
exec msmtp "${param[@]}"
A /etc/mail.rc
file végén pedig egy ilyen sor áll:
set sendmail="/usr/local/bin/mailtext"
Ez a mailtext nevű program a fenti scriptem. Így végre befogadja a Gmail a levelemet.
A mailx hívása meg valahogy így néz ki:
mail -s "$subject" -r "$from" "$address" <<-EOF
Blabla
EOF
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
sub
-------------------------------------------
- A hozzászóláshoz be kell jelentkezni