ฉันจะส่งอีเมล HTML โดยใช้คำสั่ง 'linux' ของ linux ได้อย่างไร


66

mail -s "subject" xxxxx@gmail.com <test.html ใช้งานได้ แต่สำหรับอีเมลข้อความธรรมดาเท่านั้น

วิธีที่ถูกต้องในการส่งอีเมล HTML โดยใช้คำสั่ง Linux mailคืออะไร

คำตอบ:


61

มีรุ่นที่แตกต่างของอยู่mailรอบ ๆ เมื่อคุณไปไกลกว่านั้นmail -s subject to1@address1 to2@address2 <body(สำหรับการส่งนั่นคือการรับประกันPOSIXทั้งหมด- และแม้-sไม่มีในสมัยก่อน ) พวกเขามักจะมีตัวเลือกบรรทัดคำสั่งที่แตกต่างกัน การเพิ่มส่วนหัวเพิ่มเติมนั้นไม่ใช่เรื่องง่ายเสมอไป

  • ด้วยmailxการใช้งานบางอย่างเช่นจากmailutilsUbuntuหรือDebian'sbsd-mailxมันง่ายเพราะมีตัวเลือกสำหรับสิ่งนั้น

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • ด้วยHeirloom mailxไม่มีวิธีที่สะดวก ความเป็นไปได้ประการหนึ่งที่จะแทรกส่วนหัวตามอำเภอใจคือการตั้งค่าeditheaders=1และใช้โปรแกรมแก้ไขภายนอก (ซึ่งอาจเป็นสคริปต์)

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • ด้วยPOSIXmailxทั่วไปฉันไม่รู้ว่าจะไปที่ส่วนหัวได้อย่างไร

หากคุณกำลังจะใช้ใด ๆmailหรือmailxจำไว้ว่า

  • สิ่งนี้ไม่สามารถพกพาได้แม้จะอยู่ในการกระจาย Linux ที่กำหนด ยกตัวอย่างเช่นทั้ง Ubuntu และ Debian มีทางเลือกหลายและmailmailx
  • เมื่อเขียนข้อความmailและmailxปฏิบัติต่อบรรทัดที่ขึ้นต้นด้วย~คำสั่ง หากคุณข้อความท่อเข้าไปคุณจะต้องจัดให้มีข้อความนี้ไม่ได้ที่จะมีเส้นเริ่มต้นด้วยmail~

หากคุณกำลังจะติดตั้งซอฟต์แวร์ต่อไปคุณอาจรวมทั้งการติดตั้งสิ่งที่คาดการณ์มากขึ้นกว่าmail/ /Mail mailxตัวอย่างเช่นคนโง่ ด้วย Mutt คุณสามารถจัดหาส่วนหัวในอินพุตด้วย-Hตัวเลือกแต่ไม่Content-Typeจำเป็นต้องตั้งค่าผ่านตัวเลือก mutt

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

หรือคุณสามารถเรียกใช้sendmailโดยตรง มีหลายรุ่นที่sendmailออกมี แต่พวกเขาทั้งหมดสนับสนุนsendmail -tการส่งจดหมายในแบบง่ายที่สุดอ่านรายชื่อผู้รับจากจดหมาย (ผมคิดว่าพวกเขาไม่ได้รับการสนับสนุนทั้งหมดBcc:.) ในระบบส่วนใหญ่sendmailไม่ได้อยู่ในปกติ$PATHก็อยู่ในหรือ/usr/sbin/usr/lib

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF

พยายามใช้ตัวอย่าง mutt ด้านบน แทนค่าจริงของชื่อไฟล์ที่อยู่อีเมล ฯลฯ แต่ได้รับ "ไม่ได้ระบุผู้รับ" ฉันใหม่มากที่จะพูดพึมพำ @Gilles คุณรู้หรือไม่ว่าทำไมถึงเกิดขึ้น? (สิงโตภูเขา osx, ติดตั้ง 1.5.21 ผ่าน homebrew)
Chuck van der Linden

บรรทัดที่สองของฉันคือ "ถึง: myaddress@mycompany.com" (ขออภัยที่ไม่มีการจัดรูปแบบไม่สามารถทำได้ในการตอบกลับข้อความจริงคือคำพูดของ Sans) และฉันได้รวมบรรทัดว่างไว้ก่อนที่จะใส่ EOF จะต้องมีการกำหนดค่าที่ต้องทำเพื่อ mutt หรือไม่? ก่อนที่จะลองตัวอย่างที่คุณให้ (แทนค่าที่เหมาะสม) ทั้งหมดที่ฉันทำคือ 'ชงติดตั้ง mutt'
Chuck van der Linden

@ChuckvanderLinden ถามคำถามใหม่ คัดลอกวางคำสั่งที่แน่นอนที่คุณเรียกใช้และข้อความแสดงข้อผิดพลาดทั้งหมด ดูว่าคุณสามารถส่งอีเมลจาก mutt โดยใช้อินเทอร์เฟซแบบโต้ตอบ
Gilles

ฉันสามารถส่งบางอย่างผ่านทางอินเทอร์เฟซ 'แบบโต้ตอบ' ในตอนแรกมันบ่นเกี่ยวกับไดเรกทอรีเมลที่หายไปและเสนอให้สร้างมันขึ้นมา เตือนฉันว่าฉันเกลียดกลุ่ม ;-) แต่ให้ส่ง ฉันจะเริ่มต้นคำถามใหม่เนื่องจากง่ายต่อการจัดรูปแบบและอื่น ๆ ข้อผิดพลาดที่แน่นอนคือสิ่งที่ฉันพูดว่า "ไม่ได้ระบุผู้รับ"
Chuck van der Linden


13
#!/bin/sh

(
echo "To: me@example.com"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>ello</b></html>"
echo
) | /usr/sbin/sendmail -t

5
ที่ไม่ได้ใช้mailจริง

3
@ user16144 ไม่ แต่เป็นทางเลือกที่ดีที่ OP อาจต้องการพิจารณา
trusktr

ใช่มันไม่ได้ใช้จดหมาย แต่มันใช้ได้ทุกที่ที่ฉันลองซึ่งเกินกว่าที่ฉันจะบอกได้สำหรับโซลูชันอื่น ๆ
user1683793

ทำงานได้อย่างสวยงามบน Mac เช่นกัน
Asim Jalis

7

ด้วย Heirloom mailx วิธีที่สะดวกคือ

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

ขอบคุณเพื่อน
ทดสอบที่ Fedora 17 และทำงาน


1
หน้าด้าน ฉันชอบมัน. : -]
Alastair Irvine

1
โปรดระวังว่าโซลูชันนี้อาจนำไปสู่อีเมลที่มีทั้ง "ประเภทเนื้อหา: ข้อความ / html" และ "เนื้อหาประเภท: ข้อความ / ธรรมดา" และความไม่สอดคล้องที่อาจเกิดขึ้นหากคุณใช้วิธีนี้เพื่อระบุชุดอักขระ
Skippy le Grand Gourou

5

คุณจะต้องเพิ่มContent-Typeส่วนหัวในอีเมลของคุณเพื่อให้สิ่งนี้เกิดขึ้น

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

จะทำงาน


2
จดหมาย: ตัวเลือกที่ผิดกฎหมาย - a
pyth0ner

คุณมีmailx? นั่นอาจมีตัวเลือก หากไม่ได้ผล หากไม่ได้ผลคุณสามารถลองใช้ mutt ได้แม้ว่าฉันจะไม่ทราบว่าบรรทัดคำสั่งเปลี่ยนไปทำอะไร
Noufal Ibrahim

1
ถ้าเมลไม่ได้ตัดมัสตาร์ดให้ใช้ python ... docs.python.org/library/email-examples.htmlตัวอย่างคืออันที่ 3 หรือ # 6 ที่ตรงกับความต้องการของคุณ
sdolgy

Python จะต้องให้คุณเขียน (และดูแล) สคริปต์ ซับบรรทัดคำสั่งหนึ่งมีข้อดีที่แตกต่างกัน
Noufal Ibrahim

ฉันมี mailx แต่ "ตัวเลือก -a" ไม่ทำงานยังคงแสดง: mail: ตัวเลือกที่ผิดกฎหมาย - a
pyth0ner

3

ด้วย heirloom-mailx คุณสามารถเปลี่ยนโปรแกรม sendmail เป็น hook script ของคุณแทนที่ส่วนหัวที่นั่นแล้วใช้ sendmail

สคริปต์ที่ฉันใช้ ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail $@

สคริปต์นี้เปลี่ยนค่าในส่วนหัวจดหมายดังนี้:

  • Content-Type: ไปยัง text/html; charset=utf-8
  • Content-Transfer-Encoding:ถึง8bit(ไม่แน่ใจว่าจำเป็นหรือไม่)

ในการส่งอีเมล HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

วิธีนี้มีประสิทธิภาพมากกว่าที่เสนอโดย @Gilles เพราะมันไม่ได้สร้างไฟล์ชั่วคราวและเพียงแค่แก้ไขกระแสข้อมูลแบบทันที


1

ฉันใช้สคริปต์ด้านล่างนี้แล้ว

#!/bin/ksh

(
echo "To: yourmail@domain.com"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t

0

สำหรับฉันฉันจำเป็นต้องระบุตัวแปรเช่นเซิร์ฟเวอร์ SMTP ดังนั้นคำสั่ง mail จึงทำงานในรูปแบบด้านล่าง ฉันค้นหาจากหลาย ๆ โพสต์และฉันพบด้านล่างคุณสมบัติเพื่อแปลงเนื้อหาให้เป็นข้อความ / html ตอนนี้อีเมลที่ฉันได้รับอยู่ในรูปแบบ HTML

การจัดการเนื้อหา: แบบอินไลน์

รุ่น Unix: เซิร์ฟเวอร์ Linux Red Hat Enterprise รุ่น 6.6 (Santiago)

เป็นครั้งแรก สร้างข้อมูลใดก็ตามที่จำเป็นในสคริปต์ (testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

ที่สอง ไพพ์สคริปต์นั้นไปยังคำสั่ง mail

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" userid@email.com

โดยทำเช่นนี้ฉันได้รับข้อมูลด้านล่างในอีเมล:

การจัดการเนื้อหา: แบบอินไลน์ข้อความ -ID: User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text / plain; charset = us-ascii การเข้ารหัสการถ่ายโอนเนื้อหา: 7 บิต

ค่า 1 มูลค่า 2

Value1 และ Value2 ตามการติดแท็ก HTML ที่ทำใน testSql.sh


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
Nope นี่จะส่งอีเมลข้อความพร้อม HTML ในเนื้อความ
Noufal Ibrahim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.