コードのフラグメントをgoogle-groupインラインで送信する必要がある場合があります。ここではテキストは役に立ちません。私はそれをマークダウンに入力し、(pandocなどを使用して)htmlに変換し、text/html
としてmuttに添付して送信できます。
利用できる良い解決策が1つあります ここ が、外部sendmail
プログラムを使用して電子メールを送信します。メールを送信する機能があるmuttを使用しています iMAP経由 単独で。
メッセージを作成した後、送信する前に、多くのオプションを利用できます。それらを表示するには、?
を押してください。
ここで役立つかもしれないいくつか:
F
は、外部プロセッサを介して添付ファイルをフィルタリングしますpandoc -s -f markdown -t html
を使用してHTMLに変換します^T
添付ファイルのMIMEタイプを編集するにはtext/plain
からtext/html
に変更します。すべてを1つのステップで実行するマクロです。これをあなたの.muttrc
に追加してください:
macro compose \e5 "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=utf-8\n"
set wait_key=no
このマクロを使用するには、メッセージの作成が終わってから送信する前に、 Esc その後 5 マークダウン形式のメッセージをHTMLに変換します。
このマクロは、必要に応じて自然にカスタマイズできます。 Muttにはすでに多くのキーバインディングが組み込まれているため、バインドするキーシーケンスを選択しても、それが他のものを上書きしないことを確認してください(または、それなしで使用できるものです)。
オプションset wait_key=no
は、外部コマンドの実行時にMuttのPress any key to continue...
プロンプトを抑制します。 wait_key
がyes
(デフォルト)の場合、押す必要があります Esc、その後 5、次に続行する他のキー。
multipart/alternative
とtext/plain
の両方を含むtext/html
として電子メールを送信することもできます。
要件:pandoc
基本的には、markdownメッセージのプレーンテキストと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"
Sendmailは、メールを送信するのに十分な柔軟性を備えていないことがよくあります。
柔軟なSMTPを実現するために、特定のアカウントでmuttと一緒にmsmtpを使用しています。
Mutt changeで使用するには:
# ~/.muttrc
set sendmail="/usr/bin/msmtp -a default"
そして
# ~/.msmtprc
defaults
tls off
logfile ~/.msmtp.log
account default
Host your.smtp.Host
port 25
from [email protected]
auth off
user username
password password
できました。私の解決策に完全に満足しているわけではありませんが、それで十分です。他の誰かがより良い解決策を提供するのを待っています。
プロセスは以下の通りです。マークダウンをhtmlに変換し、メッセージに添付します。この添付ファイルをinline
添付ファイルにします。しかし、今は2つの添付ファイルがあります。1つはマークダウンで、2つ目は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
_
そして、呼び出されるメインのpythonファイルは次のとおりです。これは、問題のリンクからのPerlスクリプトから発想を得ています。
_#!/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)
_
これは、もう1つpython _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
neomutt
を使用して、任意の形式でメールを送信できます。 Emacs
の代わりにvim
(org-mode)を使用します。ただし、私もvim
ユーザーです。しかし、私は主にEmacs
をevil-modeで使用します。
私の.muttrc
emacs
ではなくvim
になるようにエディターを設定しました。新しいメールを書くとき、neomutt
がemacs
を起動します。次に、「org-mode」を呼び出してメッセージを書き込み、必要な形式にエクスポートします。
PDF
形式にエクスポートできます。次に、それを保存し、PDF
ファイルを/tmp
。その後は誰にでも送ることができます。
html
形式が必要な場合は、同じ方法でエクスポートし、電子メールを送信する前に出力を自動的に確認できます。
それとは別に、org-modeには他にも多くのエクスポート形式があります。ちょうど、あなたが欲しいものを選択してください。他の人にコードを送信するには、ソースコードを任意の言語に追加します。すべては org-wiki で説明されています。