it-swarm.dev

linux 'mail'명령을 사용하여 HTML 이메일을 보내려면 어떻게합니까?

mail -s "subject" [email protected] <test.html 작동하지만 일반 텍스트 이메일에만 해당됩니다.

Linux 명령어 mail를 사용하여 HTML 이메일을 보내는 올바른 방법은 무엇입니까?

71
pyth0ner

mail에는 여러 가지 버전이 있습니다. mail -s subject [email protected] [email protected] <body를 넘어 서면 (보내기 만하면 POSIX 보장되며 심지어 -s도 존재하지 않습니다. old days ), 명령 줄 옵션이 다른 경향이 있습니다. 추가 헤더를 추가하는 것이 항상 쉬운 것은 아닙니다.

  • 일부 mailx 구현으로 예를 들어 우분투의 mailutils에서 또는 데비안의 bsd-mailx 옵션이 있기 때문에 쉽습니다.

    mailx -a 'Content-Type: text/html' -s "Subject" [email protected] <test.html
    
  • Heirloommailx 을 사용하면 편리한 방법이 없습니다. 임의의 헤더를 삽입하는 한 가지 가능성은 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" [email protected] <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • 일반적인 POSIX mailx 을 사용하면 헤더를 얻는 방법을 모르겠습니다.

mail 또는 mailx을 사용하려는 경우

  • 주어진 Linux 배포판 내에서도 이식성이 없습니다. 예를 들어, Ubuntu와 Debian에는 mailmailx에 대한 몇 가지 대안이 있습니다.
  • 메시지를 작성할 때 mailmailx~로 시작하는 행을 명령으로 처리합니다. 텍스트를 mail에 파이프하는 경우이 텍스트에 ~로 시작하는 줄을 포함하지 않도록 정렬해야합니다.

어쨌든 소프트웨어를 설치하려는 경우 mail/Mail/mailx보다 더 예측 가능한 것을 설치할 수도 있습니다. 예를 들어 mutt 입니다. Mutt를 사용하면 -H 옵션 그러나 Content-Type는 아님 를 사용하여 대부분의 헤더를 입력 할 수 있습니다.이 옵션은 mutt 옵션을 통해 설정해야합니다.

mutt -e 'set content_type=text/html' -s 'hello' '[email protected]' <test.html

또는 sendmail을 직접 호출 할 수 있습니다. 여러 버전의 sendmail이 있지만 모두 가장 간단한 방식으로 메일을 보내도록 sendmail -t를 지원하여 메일에서 수신자 목록을 읽습니다. (Bcc:를 모두 지원하지는 않습니다.) 대부분의 시스템에서 sendmail은 일반적인 $PATH에 있지 않으며 /usr/sbin 또는 /usr/lib.

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: [email protected]
Subject: hello
Content-Type: text/html

EOF
#!/bin/sh

(
echo "To: [email protected]"
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
14
Code Improver

가보 우편으로 편리한 방법은

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" [email protected] < /tmp/htmlmail.txt

감사합니다 Dude
Fedora 17에서 테스트를 거쳤으며

7
daniel

Content-Type 이메일에 헤더를 추가하십시오.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" [email protected]

작동합니다

5
Noufal Ibrahim

Heirloom-mailx를 사용하면 sendmail 프로그램을 후크 스크립트로 변경하고 헤더를 바꾼 다음 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 [email protected]

이 스크립트는 다음과 같이 메일 헤더의 값을 변경합니다.

  • Content-Type:에서 text/html; charset=utf-8
  • Content-Transfer-Encoding:에서 8bit (실제로 필요한지 확실하지 않음).

HTML 이메일을 보내려면 :

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" [email protected] < test.html

이 방법은 임시 파일을 생성하지 않고 스트림을 즉시 수정하기 때문에 @Gilles가 제안한 것보다 효과적입니다.

3
loentar

아래 스크립트를 사용하여 발생했습니다.

#!/bin/ksh

(
echo "To: [email protected]"
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
1
Bhabatosh

나를 위해 SMTP 서버와 같은 변수를 지정해야하므로 mail 명령이 아래 방식으로 작동했습니다. 많은 게시물을 검색했으며 본문 아래에서 본문을 HTML로 변환하는 속성을 찾았습니다. 이제 내가받는 이메일은 HTML 형식입니다.

콘텐츠 처리 : 인라인

유닉스 버전 : Red Hat Enterprise Linux Server 릴리즈 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")" [email protected]

이렇게하면 이메일에 아래와 같은 정보가 표시됩니다.

콘텐츠 처리 : 인라인 Message-ID : 사용자 에이전트 : Heirloom mailx 12.4 7/29/08 MIME 버전 : 1.0 콘텐츠 유형 : text/plain; charset = us-ascii 콘텐츠 전송 인코딩 : 7bit 
 
 Value1 Value2

TestSql.sh에서 수행 된 HTML 태깅에 따른 Value1 및 Value2

0
Vaibhav

다른 스레드에 게시되었지만 기본적으로 mail/mailx (12.5+) 버전에 게시 된 메일의 -a 매개 변수는 첨부 파일을 추가하므로 더 이상 작동하지 않으며 추가 헤더에 대한 대체 매개 변수를 찾을 수 없으므로 가장 쉬운 방법입니다. 나는 sendmail을 사용했다.

아래는 내가 bash 스크립트에서 실행하기 위해 만든 간단한 1 라이너입니다. 기본적으로 Content-Type : text/html, subject 및 body를 전달하고 작동합니다.

printf "Content-Type: text/html\nSubject: Test Email\nHTML BODY<b>test bold</b>" | sendmail <Email Address To>

변수에서 전체 HTML 페이지를 만들려면 bash 스크립트에서 사용한 대체 방법은 다음과 같이 변수를 전달하는 것입니다.

emailBody="From: <Email Address From>
Subject: Test
Content-Type: text/html; charset=\"us-ascii\"
<html>
<body>
body
<b> test bold</b>

</body>
</html>
"
echo "$emailBody" | sendmail <Email Address To>
0
Miburi