Linux의 Heirloom mailx에 대한 HTML 이메일

Linux의 Heirloom mailx에 대한 HTML 이메일

저는 Linux 서버의 mailx에서 html 이메일을 보내려고 했습니다.

참고할 몇 가지 사항:

  • sendmail을 사용할 수 없도록 smtp 서버를 지정해야 합니다(변경할 수 있는 사항이 아닙니다).
  • mutt와 같은 타사 제품을 설치할 수 없습니다. 메일이나 mailx를 사용해야 해요
  • 내 버전의 mail/x는 가보이므로 --append 또는 -a(헤더 추가 옵션)가 없습니다.
  • 이것이 도움이 되는지 확실하지 않지만 내 Linux 배포판은 7.3(Maipo)입니다.

내 사건과 관련하여 stackoverflow의 대부분의 게시물에서 본 내용은 다음과 같습니다.

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

제 경우에는 일반 텍스트 이메일만 반환합니다.

그래서 지금까지 제가 시도한 것은 다음과 같습니다.

1번을 시도해보세요:

Content-Disposition: inline을 추가하는 기사를 보았습니다.

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v1\nContent-Type: text/html\nMIME-Version: 1.0\nContent-Disposition: inline")" -r FROM TO < htmlmail.txt

이렇게 하면 html 이메일이 전송되지만 본문에 헤더가 포함되어 있으므로 출력은 다음과 같습니다.

콘텐츠 처리: 인라인 메시지 ID: 사용자 에이전트: Heirloom mailx 12.5 7/5/10 MIME 버전: 1.0 콘텐츠 유형: Text/Plain; Charset=us-ascii 콘텐츠 전송 인코딩: 7비트안녕하세요 세계

2번 시도:

그래서 제목이 본문에 인쇄되는 것을 원하지 않습니다. 그래서 Content-Disposition: inline을 제거해 보았습니다.

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v2\nContent-Type: text/html\nMIME-Version: 1.0")" -r FROM TO < htmlmail.txt

그러면 다음과 같은 간단한 테스트 이메일이 전송됩니다.

<html> <b>Hello World</b> </html>

3번을 시도해보세요:

콘텐츠 유형과 무언극 버전을 바꿔보세요.

mailx -v -S SERVER -s "$(echo -e "This is the subject v3\nMIME-Version: 1.0\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

결국 이 코드에서 이메일을 받지 못했습니다.

4번을 시도해 보세요:

문제를 찾는 데 도움이 되도록 온라인에서 다른 타이틀을 시도하는 것을 보았습니다. 그래서 이메일 우선순위를 설정하기 위해 헤더 옵션을 추가했습니다.

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v4\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

결국 우선순위가 높은 이메일이 전송되었지만 모두 일반 텍스트였습니다.

5번을 시도해보세요:

이전 시도에서 MIME 헤더를 추가했습니다.

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v5\nMIME-Version: 1.0\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

그러면 본문에 헤더가 포함된 이메일이 전송되고 우선순위가 높게 설정되지 않습니다... 이상합니다.

X 우선순위: 1(대부분) 뉴스 ID: 사용자 에이전트: Heirloom Mailx 12.5 7/5/10 MIME 버전: 1.0 콘텐츠 유형: 텍스트/순수 텍스트, 문자 집합 = us-ascii 콘텐츠 전송 코드: 7자리안녕하세요 세계

결국 나는 위의 시도를 다양하게 적용해 보았지만 새로운 결과물은 나오지 않았습니다.

따라서 우리는 어떤 제안이나 아이디어라도 기꺼이 받아들입니다! 위에 나열한 제한 사항을 염두에 두십시오. 옵션이 제한된다는 것을 알고 있지만 이는 제가 통제할 수 없는 일입니다.

시간 내 주셔서 감사합니다!

답변1

먼저 몇 가지 맥락: 저는 다음 스레드에서와 같이 heirloom-mailx 버전을 사용하고 있습니다. https://serverfault.com/questions/136106/what-package-to-install-for-sending-emails-from-localhost-ubuntu

저는 Ubuntu 16.04 Xenial을 사용하고 있습니다. Ubuntu Server 16.04에서도 시도했습니다.

이메일을 보내려면 다음 기능을 사용하여 mailx(bash의 heirloom mailx)를 통해 메일을 보냅니다.

sendmail() {
#Sending Report Email
heirloom-mailx -a $2 -v -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
-S smtp-use-starttls \
-S ssl-verify=ignore \
-S smtp-auth=login \
-S smtp=smtp://mail.mymailserver:port \
-S from="[email protected]" \
-S [email protected] \
-S smtp-auth-password='password' \
-S ssl-verify=ignore \
$1 < body.html
}

여기서 $2는 첨부 파일이고 $1은 대상입니다. 참고: 1. 첨부 파일도 본문 내에서 인쇄되지만 첨부 파일 없이 HTML 파일만 전송하려는 경우 이 방법이 적합할 수 있습니다. 2. "-v" 옵션을 사용하면 자세한 정보가 인쇄되므로 무시할 수 있는 .mime.types 문제가 발생할 수 있습니다. mailx에 세부사항이 표시되는 것을 원하지 않으면 이 옵션을 제거하십시오. 3. "-a" 옵션을 사용하는 경우 본문에 다음 내용이 계속 표시됩니다. 이는 MIME 형식의 다중 부분 메시지입니다. --=-=fFPa7dLqoSF1TGj-YDc2k8bdvmjpix_4sKFT=-= 콘텐츠 유형: 텍스트/일반 텍스트, 문자 세트=US-ASCII 콘텐츠 처리: 인라인

이 경우에는 일반 텍스트 파일을 첨부합니다. 명령에서 "-a $2"를 제거하면 html 메시지를 인쇄할 수 있습니다. 따라서 최종 결과는 다음과 같습니다.

sendmail() {
    #Sending Report Email
    heirloom-mailx -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
    -S smtp-use-starttls \
    -S ssl-verify=ignore \
    -S smtp-auth=login \
    -S smtp=smtp://mail.mymailserver:port \
    -S from="[email protected]" \
    -S [email protected] \
    -S smtp-auth-password='password' \
    -S ssl-verify=ignore \
    $1 < body.html
    }

그것을 시도하고 알려주세요. 터미널에서 테스트했는데 작동합니다.

답변2

새 소프트웨어(적절한 MTA 포함)를 설치할 수 없는 서버에 갇힌 경우 아마도 가장 쉬운 해결책은 SMTP 라이브러리가 포함된 언어로 간단한 스크립트를 작성하는 것입니다. 내 선택은 Python입니다. 다음은 예제 코드를 간단히 적용한 것입니다.문서.

#!/usr/bin/env python3

import smtplib
from argparse import ArgumentParser
from email.message import EmailMessage


def main():
    parser = ArgumentParser(description="""\
Quick and dirty mailx replacement for sending a HTML message via a
specific SMTP server. Based on examples from
https://docs.python.org/3/library/email.examples.html#email-examples
""")
    parser.add_argument('-H', '--html-file', required=True,
                        help="The HTML body to send (required)")
    parser.add_argument('-S', '--smtp-server', required=True,
                        help='The SMTP server to use (required)')
    parser.add_argument('-s', '--subject', required=True,
                        help='Subject (required)')
    parser.add_argument('-r', '--return-path', required=True,
                        help='Return-Path / envelope sender (required)')
    parser.add_argument('recipients', nargs='+')
    args = parser.parse_args()

    msg = EmailMessage()
    msg['Subject'] = args.subject
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.return_path
    # The examples suggest you should mess with the preamble, but you should not

    with open(args.html_file, 'r') as html:
        msg.set_content(html.read(), subtype='html')

    with smtplib.SMTP(args.smtp_server) as s:
        s.send_message(msg)


if __name__ == '__main__':
    main()

용법:

python3 path/to/script.py -S SERVER -s "This is the subject" \
    -r FROM -H htmlmail.html TO

이는 Python 버전 3용입니다. 이전 플랫폼을 사용하고 있다면 Python 2만 있을 수도 있지만 이에 적응하는 방법은 상당히 분명합니다( email.message.Message3.3에 도입되고 3.5에 공식적으로 출시된 정밀 검사 및 현대화 대신 주로 레거시 클래스를 사용함 EmailMessage).

답변3

나는 방금 그것을 알아냈습니다. 첫 번째 사례로 돌아가서 제목 필드에 헤더를 삽입하면 mailx에서 만든 헤더(일반 텍스트 헤더)를 본문에 밀어넣는 것입니다. 즉, 본문이 실제 헤더의 끝에서 시작하고 푸시된 헤더를 수락한다고 생각합니다. 이는 HTML을 사용하여 문제를 해결할 수 있음을 의미합니다.

주입 헤더 끝에 다음을 입력합니다.

<html><!--

HTML 주석이 시작됩니다!

실제 의도한 신체의 시작 부분에

-->

댓글이 닫혔습니다! 이렇게 하면 밀어낸 헤더가 몸에서 멀리 숨겨집니다!

관련 정보