2016-08-26 7 views
1

"<a href="link">Link</a>"タグに埋め込まれたURLを含むメールを送信するPythonコードがあります。ハイパーリンクURLにスペースを挿入するGmailとOutlook

GmailまたはOutlook 365のWebメールクライアントからのリンクをクリックすると、両方に空白文字またはURLに '%20'が挿入されているため、壊れたページが表示されます。興味深いことに、それは両方のクライアントと同じ場所で発生するようです。

リンクは木場ダッシュボードリンクなので埋め込みコードRisonです。

リンクは以下のようになります。

<a href="http://localhost:5601/app/kibana?#/visualize/edit/BetterPie?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-60d,mode:quick,to:now))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:breed,negate:!f,value:'lion'),query:(match:(breed:(query:lion,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:age,negate:!f,value:'2'),query:(match:(age:(query:2,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:name,negate:!f,value:'nala'),query:(match:(name:(query:nala,type:phrase))))),linked:!f,query:(query_string:(analyze_wildcard:!t,query:'*')),uiState:(spy:(mode:(fill:!f,name:!n))),vis:(aggs:!((id:'1',params:(),schema:metric,type:count),(id:'2',params:(field:breed,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'3',params:(field:age,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'4',params:(field:name,order:desc,orderBy:'1',size:5),schema:segment,type:terms)),listeners:(),params:(addLegend:!t,addTooltip:!t,isDonut:!f,shareYAxis:!t),title:'BetterPie',type:pie))">Dashboard Link</a> 

しかし、それはどちらかの「%20」またはスペースがここに注入します:

query:'*')),%20uiState 

を私はエンコードするためのpythonのsmtplibモジュールを使用していますメッセージを送信し、次の手順でメールを送信してください:

htmlEnc = MIMEText(body, 'html') 

eが注入されるので、どんな助けも大いに評価されます。

+0

ウェブメールクライアントから真のURLを隠す方法として、中間URL短縮/リダイレクトを検討することは可能でしょうか?電子メールサービスプロバイダは、追跡の目的ですべての電子メールリンクでこれをデフォルトで実行しています。 – revelt

+0

@reveltそれはオプションですが、それが100%問題を解決するかどうかはわかりません。クライアントが電子メール本文の長さのためにスペースを挿入している可能性があるので、URLリンクが短くても、追加されるHTMLに他の情報があるためスペースが表示されることがあります。 – funseiki

+0

私は100%を確認することはできませんが、私が正しく覚えていれば、電子メールのURLは256文字の制限があります。それはもっと少ないかもしれない。しかし、あなたのURLは切り取られていないので、それは別のケースです。電子メールのスペースに関しては、それは想像上の紙が終了するスペースを追加するWordレンダリングエンジンですが、もう一度%20が追加されたときとは異なります。これは異なっています。 – revelt

答えて

3

私は電子メールの送信に関してPHPで同じ問題がありました。私の問題は、1行あたり1,000文字の問題で、1000文字目に自動的に改行が挿入された。これはあなたのURLである可能性があります。 PHPの問題を解決するには、まず電子メールヘッダにContent-Transfer-Encoding:quoted-printableを追加しました。次に、PHP関数quoted_printable_encode()を使用してメール本文を処理しました。 Pythonの同等の機能はわかりませんが、同じ種類の問題に対する私の解決策が正しい方向に向けるのを助けてくれるはずです。

2

問題は、電子メール行が最大998文字である必要があります。長い行のメールをPostfixサーバに送ると、Postfixはそのメッセージを最後の宛先に転送する前にメッセージに改行を挿入します。改行は、HTML電子メールのスペースとして扱われます。

998文字より長い行のメールは送信しないでください。実際には、標準のrecommendsは1行につき最大78文字です。 998文字より長い行でHTMLを送信するには、quoted-printableやbase64など、いわゆるContent-Transfer-Encodingを使用します。幸いなことに、email Python標準モジュールを使用している場合、これは次のように実現できます。

Message.set_charset()メソッドは、Content-Transfer-Encodingがquoted-printableであることを指定するCharsetインスタンスで呼び出す必要があります。

from email.charset import Charset, QP 
import email.message 
def fix_content_transfer_encoding(message: email.message.Message): 
    charset = Charset('utf-8') 
    charset.body_encoding = QP 
    message.set_charset(charset) 

Djangoプロジェクトでは、デフォルトでDjango 1.10以降のquoted-printableを使用しています。 Django #22561 (EmailMessage should respect RFC2822 on max line length)を参照してください。


電子メールの行の長さの制限に関するトピック:すべてのメールサーバーがPostfixソフトウェアと同じ厳密に998文字の制限に従っているわけではありません。実際、ヤフーのウェブメールクライアントは、998文字を超えるReferences: - ヘッダーを含む無効なメールを喜んで送信します。 Yahooの厳密なDMARCポリシーでは、References:ヘッダが中間メールサーバによって変更されないように要求されているため、正当なYahooメールは、Postfixサーバから転送されたDMARCによって拒否されます。

関連する問題