mutt를 사용하여 마크 다운으로 작성된 이메일 보내기


21

때로는 Google 그룹 인라인에서 코드 조각을 보내야합니다. 텍스트는 여기서 도움이되지 않습니다. 마크 다운에 입력하고 HTML (pandoc 등을 사용하여)로 변환하고 mutt에 첨부하여 text/html보낼 수 있습니다.

이 가능한 하나 개의 좋은 솔루션으로 여기는 하지만 외부 사용 sendmail보내기 이메일 프로그램을. IMAP을 통해 자체적으로 전자 메일을 보내는 기능이있는 mutt을 사용 하고 있습니다.


1
커맨드 라인 Markdown 포맷터의 출력을 sendmail?
— Naftuli Kay

흠 .. 공유 컴퓨터! 외부 sendmail에 비밀번호를 저장하고 싶지 않습니다.
— Dilawar

Google 그룹에서 현재 결과가 어떻게 보이는지 확인할 수있는 예가 있습니까?
— slm

또한 마크 다운에 항목을 입력하고 싶지만 전자 메일에 첨부하기 전에 렌더링 했습니까?
— slm

이것은 당신이 요구하는 것 같지만 수정해야 할 수도 있습니다 : dgl.cx/2009/03/html-mail-with-mutt-using-markdown . 또한 markdownmail.py 는 사용할 수있는 것처럼 들렸습니다.
— slm

답변:


28

메시지를 작성한 후, 보내기 전에 많은 옵션을 사용할 수 있습니다. 눌러서 ?봅니다.

여기에 도움이 될만한 것들이 있습니다 :

  • F 외부 프로세서를 통해 첨부 파일을 필터링
    • pandoc -s -f markdown -t htmlHTML로 변환하는 데 사용
  • ^T 첨부 파일 MIME 유형을 편집하려면
    • 에서 text/plain로 변경하십시오 text/html.

이제 한 번에 모든 작업을 수행하는 매크로입니다. 이것을 다음에 추가하십시오 .muttrc.

macro compose \e5 "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=us-ascii\n"
set wait_key=no

당신이 당신의 메시지 작성을 완료 한 후,이 매크로를 사용하려면하지만 보내기 전에 눌러 Esc다음 5HTML로 인하 형식의 메시지를 변환 할 수 있습니다.

이 매크로를 자연스럽게 사용자 정의 할 수 있습니다. Mutt에는 이미 많은 키 바인딩이 내장되어 있으므로 바인딩하려는 키 시퀀스가 ​​무엇이든 다른 것을 덮어 쓰지 않아야합니다 (또는 당신이없이 살 수있는 것).


이 옵션 은 외부 명령이 실행될 때 set wait_key=noMutt의 Press any key to continue...프롬프트를 표시하지 않습니다. 경우 wait_key입니다 yes당신이 언론에해야합니다 (디폴트) Esc, 다음 5, 다음 다른 키를 계속합니다.


1
이것은 정말 우아한 솔루션입니다! +1
— sinisterstuf

5
이것은 좋지만 핵심 결함이 있습니다. 그것은 이메일의 평문 부분을 제거하여 ... mutt;)와 같은 클라이언트에서 읽기가 빨라집니다. HTML 이메일에는 평문과 HTML 구성 요소가 있어야합니다. 원시 마크 다운은 평문이어야하고 변환 된 것은 HTML이어야합니다.
— masukomi 2016 년

1
@masukomi에 동의하면 일반적으로 전자 메일 클라이언트는 전자 메일의 HTML 및 텍스트 버전을 모두 보냅니다. HTML 버전을 추가하고 원본을 텍스트 / 일반으로 남겨 두는 매크로를 사용하는 것이 좋습니다.
— pepper_chico



1

Sendmail은 종종 메일 전송에 융통성이 없습니다.

유연한 SMTP를 위해 msmtp를 특정 계정에서 mutt과 함께 사용합니다.

음소거 변경과 함께 사용하려면 :

# ~/.muttrc  
set sendmail="/usr/bin/msmtp -a default"   

과

# ~/.msmtprc  
defaults
tls off
logfile ~/.msmtp.log  
account default   
host your.smtp.host  
port 25  
from your-user-name@your-host.com  
auth off  
user username  
password password  

0

나는 그것을 할 수 있었다. 나는 내 솔루션에 대해 완전히 행복하지는 않지만 충분합니다. 더 나은 솔루션을 제공하기 위해 다른 사람을 기다리는 중입니다.

과정은 다음과 같습니다. 마크 다운을 html로 변환하여 메시지에 첨부하십시오. 이 부착물을 inline부착물로 돌리십시오 . 그러나 이제 두 개의 첨부 파일이 있습니다. 첫 번째는 마크 다운에 있고 두 번째는 html입니다. html 만 전송되도록 마크 다운 컨텐츠를 빈 문자열로 바꾸십시오.

~/.muttrc파일에 다음 줄을 추가했습니다 .

macro compose B ":set editor=text2mime-markdown.py<enter>E:set editor=email-editor<enter>Da/tmp/html-markdown-alternative.html<enter>^Du"

다음은 email-editor문제가 게시 된 링크에서 빌린 것입니다.

#!/bin/sh
if grep -q In-Reply-To $1; then
  # Jump to first line of message
  exec vim -c 'norm }j' $1
else
  # Enter insert mode on the To: line
  exec vim  $1
fi

그리고 주요 파이썬 파일은 다음과 같습니다. 이것은 해당 링크의 펄 스크립트에서 영감을 얻은 것입니다.

#!/usr/bin/env python
import os
import sys
from formatter import *
version = "0.1"

file = sys.argv[1]
new_file = "/tmp/html-markdown-alternative.html"
with open(file, "r") as f:
    text = f.read()

lines = text.split('\n')
header = []
body = []
headerStart = True
for l in lines:
    if headerStart:
        m = re.search(r'^[\w\-]+\:', l)
        if m:
            header.append(l)
        else:
            headerStart = False
            body.append(l)
    else:
        body.append(l)

header = '\n'.join(header)
body = '\n'.join(body)

htmlBody = markdownToHtml(body);

html = []
html.append('<html>')
html.append('<head>')
html.append('<meta name=\"generator\" content=\"text2mime-markdown{}\">'.format(version))
html.append('<style>')
html.append("code { font-family: 'Andale Mono', 'Lucida Console', \
        'Bitstream Vera Sans Mono', 'Courier New', monospace; }")
html.append('pre { border-left: 20px solid #ddd; margin-left: 10px; \
        padding-left: 5px; }')
html.append('</style>')
html.append('</head>')
html.append('<body>')
html.append('{0}'.format(body))
html.append('</body>')
html.append('</html>')
html = '\n'.join(html)

with open(new_file, "w") as newF:
    newF.write(html)

with open(file, 'w') as f:
    f.write(header)

이것은 내 메일을 형식화 formatter.py하는 데 사용되는 하나 이상의 파이썬 파일에 달려 pandoc있지만 pandoc사용할 수없는 경우 python-markdown2패키지 를 사용할 수 있습니다 . 이 스크립트는 다음과 같습니다.

import subprocess
import re
import os 
import sys
import html2text 
import collections

# check if pandoc exists
panDoc = True
try:
    subprocess.call(["pandoc", '--version']
            , stdout=subprocess.PIPE
            , stdin=subprocess.PIPE
            )
except OSError:
    panDoc = False

if not panDoc:
    import text.html2text as html2text
    import markdown 

def decodeText(text):
    return text.decode('utf-8')

def markdownToHtml(content, convertor='pandoc'):
    global panDoc
    if panDoc:
        cmd = ["pandoc", "-f", "markdown", "-t", "html"]
        p = subprocess.Popen(cmd
                , stdin = subprocess.PIPE
                , stdout = subprocess.PIPE
                )
        p.stdin.write(content)
        content = p.communicate()[0]
        return decodeText(content)
    else:
        return markdown.markdown(decodeText(content))


def htmlToMarkdown(content, convertor='pandoc'):
    global panDoc
    if panDoc and convertor == 'pandoc':
        cmd = ["pandoc", "-t", "markdown", "-f", "html"]
        p = subprocess.Popen(cmd
                , stdin = subprocess.PIPE
                , stdout = subprocess.PIPE
                )
        p.stdin.write(content)
        content = p.communicate()[0]
        return decodeText(content)
    # Use markdown package to convert markdown to html
    else:
        h = html2text.HTML2Text()
        content = h.handle(decodeText(content))
        return content

def titleToBlogDir(title):
    if title is None:
        return ''
    if len(title.strip()) == 0:
        return ''
    blogDir = title.replace(" ","_").replace(':', '-').replace('(', '')
    blogDir = blogDir.replace('/', '').replace('\\', '').replace('`', '')
    blogDir = blogDir.replace(')', '').replace("'", '').replace('"', '')
    return blogDir

def titleToFilePath(title, blogDir):
    if len(blogDir.strip()) == 0:
        return ''
    fileName = os.path.join(blogDir, titleToBlogDir(title))
    return fileName


def htmlToHtml(html):
    return decodeText(html)

def metadataDict(txt):
    mdict = collections.defaultdict(list)
    md = getMetadata(txt)
    for c in ["title", 'type', "layout", "status", "id", "published", "category", "tag"]:
        pat = re.compile(r'{0}\:\s*(?P<name>.+)'.format(c), re.IGNORECASE)
        m = pat.findall(txt)
        for i in m:
            mdict[c].append(i)
    return mdict

def getMetadata(txt):
   """
   Get metadata out of a txt
   """
   if not "---" in txt:
       print txt
       sys.exit(1)

   pat = re.compile(r'\-\-\-+(?P<metadata>.+?)\-\-\-+', re.DOTALL)
   m = pat.search(txt)
   if m:
       return m.group('metadata')
   else:
       sys.exit(0)

def getContent(txt):
    """ 
    Return only text of the post.
    """
    pat = re.compile(r'\-\-\-+(?P<metadata>.+?)\-\-\-+', re.DOTALL)
    return re.sub(pat, "", txt)

def readInputFile(fileName):
    """
    read file and return its format. html or markdown
    """
    assert fileName
    if not os.path.exists(fileName):
        raise IOError, "File %s does not exists" % fileName

    # Check the fmt of file.
    fmt = os.path.splitext(fileName)[1].lower()
    if fmt in ["htm", "html", "xhtml"]:
        fmt = "html"
    elif fmt in ["md", "markdown"]:
        fmt = "markdown"
    else:
        fmt = "markdown"
    txt = open(fileName, 'r').read()   
    return (fmt, txt)

def formatContent(txt, fmt):
    """
    Format the content as per fmt.
    """
    content = getContent(txt)
    if fmt == "html":
        content = htmlToHtml(content)
    elif fmt == "markdown":
        content = markdownToHtml(content)
    else:
        content = markdownToHtml(content)
    return content

이 파일은 https://github.com/dilawar/mutt 에서도 제공됩니다.


0

을 사용하여 모든 형식의 이메일을 보낼 수 있습니다 neomutt. 나는 Emacs대신 (org-mode)를 사용 vim합니다. 그러나 나는 또한 vim사용자입니다. 그러나 나는 주로 Emacs악의 모드로 사용 합니다.

내 .muttrc편집기를 emacs대신 설정했습니다 vim. 새 이메일을 작성할 때 neomutt발생 emacs합니다. 그런 다음 "org-mode"를 호출하고 메시지를 작성한 다음 원하는 형식으로 내 보냅니다.

PDF포맷으로 내보낼 수 있습니다 . 그런 다음 PDF파일을 저장하고 내 파일에 첨부합니다 /tmp. 그 후 나는 누구에게나 보낼 수 있습니다.

html형식을 원한다면 같은 방식으로 내보내고 전자 메일을 보내기 전에 출력을 자동으로 볼 수 있습니다.

그 외에도, org-mode에는 다른 많은 내보내기 형식이 있습니다. 원하는 것을 선택하십시오. 다른 사람에게 코드를 보내려면 원하는 언어로 소스 코드를 추가하십시오. 모든 것은 org-wiki에 설명되어 있습니다.


0

당신은으로도 전자 메일을 보낼 수 있습니다 multipart/alternative모두 포함하는 text/plain과 text/html.

요구 사항 : pandoc

기본적으로 마크 다운 메시지 일반 텍스트와 html5에서 생성됩니다. 해당 파트에서 첨부 파일을 작성하고 인라인 첨부 파일로 표시하고 올바른 MIME 유형을 설정 한 후 멀티 파트 메시지로 결합합니다.

작성 메뉴에서이 매크로를 실행 한 후 다른 첨부 파일을 추가해야합니다. 선택적으로 서명 / 암호화 메시지는 마지막 단계로 수행해야합니다.

macro compose ,m \
"<enter-command>set pipe_decode<enter>\
<pipe-message>pandoc -f gfm -t plain -o /tmp/msg.txt<enter>\
<pipe-message>pandoc -s -f gfm -t html5 -o /tmp/msg.html<enter>\
<enter-command>unset pipe_decode<enter>a^U/tmp/msg.txt\n^Da^U/tmp/msg.html\n^D^T^Utext/html; charset=utf-8\n=DTT&d^U\n" \
"Convert markdown gfm to HTML and plain" 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.