Mail multipart / alternativ vs multipart / qarışıq

E- poçt ünvanından elektron poçtunuzu yükləyin Content-Type ilə multipart/alternative HTML və TEXT ilə çoxpart multipart/mixed pri otpravka TEXT və vlozeniy.

İtak, çto vy delaete, əgər HTML yazmaq istəsən, mətn və vlozeniya? İstifadə qaydası:

93
11 окт. Xəzər dənizi Xeoncross 11 oktyabr . 2010-10-11 01:21 '10 в 1:21 2010-10-11 01:21
@ 7 @

Istifadə multipart/mixed s первой частью как multipart/alternative və последующими частями для вложений. Bəzən text/plaintext/html və ya çoxpart multipart/alternative .

Zatem dəstəkləyən poçt mübadiləsi çoxpart multipart/alternative və geri göndərmə mətn hissəsi və ya html vasitəsilə çoxlu sayda qeyri-qənaətbəxşdir. On da bir müddət sonra hər hansı bir partiyanı qaçırmaq istəmir.

MIME yazmaq üçün, MIME-ə göndərilən mesajlara cavab verin. Theoretically, bu gnozdo cani yayılmaq üçün lyubuyu glubinu. Lyu̇byoy razumno sposobnyy pochtovyy cliente doljen imete vozmojnostu recursivno obrazy vse chasti xabar.

86
21 окт. Mike Green 21 oktyabr. 2010-10-21 07:23 '10 в 7:23 2010-10-21 07:23

Bu gün mən bu problemlə məşğul oldum, və mən bu problemləri aradan qaldırdım, amma mənim üçün mənə həqiqi mənada.

Son dəyişikliklər : prosto naşel Apache Commons E-poçt , который прекрасно обертывает это, что означает, что вам не нужно ниже.

Əsli ваше требование - это электронное письмо с:

  • mətn və html-versiya
  • versiya html şəklindədir (встроенные) образы
  • вложения

Gmail / Outlook / iPad proqramı ilə birləşdirilmiş qurğu, kotoruyu ya naşel, который работает с:

border=0
  • смешано
    • alternativ
      • mətn
      • rütbəli
        • HTML
        • встроенное изображение
        • встроенное изображение
    • вложение
    • вложение

İ kodu:

85
25 мая '14 в 10:34 2014-05-25 10:34 ответ от Iain 25 мая '14 в 10:34 2014-05-25 10:34

Təqvimə aiddir. Kontent, mətn, html, DataHandler və ya Multipart, və mümkün ola bilər yalnız content. Bəzi BodyParts, çox mürəkkəbdir. BodyParts, например Mesajlar, может иметь контент, который уже был описан.

HTML mesajı, mətn və vlojeniem mojno proosinq hierarxicheskiẏ sleduyuschim obrazom:

 message mainMultipart (content for message, subType="related") ->htmlAndTextBodyPart (bodyPart1 for mainMultipart) ->htmlAndTextMultipart (content for htmlAndTextBodyPart, subType="alternative") ->textBodyPart (bodyPart2 for the htmlAndTextMultipart) ->text (content for textBodyPart) ->htmlBodyPart (bodyPart1 for htmlAndTextMultipart) ->html (content for htmlBodyPart) ->fileBodyPart1 (bodyPart2 for the mainMultipart) ->FileDataHandler (content for fileBodyPart1 ) 

Bu kodu yaratmaq üçün:

9
15 мая '13 в 3:40 2013-05-15 03:40 ответ dan splashout 15 мая '13 в 3:40 2013-05-15 03:40

Yəqin ki, mənim kimi, mənə birbaşa ehtiyac duyulan bu mətnləri birbaşa HTML, HTML və bir neçə istifadə etməklə deyil, PHP istifadə edir. SAS Amazon istifadə etmək üçün istifadə etmək üçün API-yə ehtiyac duyduğunuz müddətdə, e-poçt göndərmək üçün qeyri-zəmanət yaratmaq üçün, sendRawEmail (...) funksiyasını istifadə edin.

Son günlərdə araşdırmalar aparan (və daha çox, normal normallaşma) problemi buna reşenə və isxodnıẏ kod PHP yerləşdirmək üçün istifadə etmək üçün, on mog pomochь druqim испытать подобную problem. Həqiqətən, bu, mənim üçün də pomozet komu-to - mütləq məcburiyyətdir, bu, mənə zastavil işləməklə, problemsizdir, belə israrçıları.

Saz Amazon kodunu PHP vasitəsilə göndərmək üçün istifadə edin.

03 марта '15 в 17:03 2015-03-03 17:03 otvetten SağHandedMonkey 03 mart '15 de 17:03 2015-03-03 17:03

Я попал в эту проблему. Эта архитектура (от ответа Лэйна) işləmək üçün mənə. Pythonda röteni həll edin.

  • смешано
    • alternativ
      • mətn
      • rütbəli
        • HTML
        • встроенное изображение
        • встроенное изображение
    • вложение
    • вложение

Baş buraxılış funksiyası hazırlanıb elektron poçt:

 def create_message_with_attachment( sender, to, subject, msgHtml, msgPlain, attachmentFile): """Create a message for an email. Args: sender: Email address of the sender. to: Email address of the receiver. subject: The subject of the email message. message_text: The text of the email message. file: The path to the file to be attached. Returns: An object containing a base64url encoded email object. """ message = MIMEMultipart('mixed') message['to'] = to message['from'] = sender message['subject'] = subject message_alternative = MIMEMultipart('alternative') message_related = MIMEMultipart('related') message_related.attach(MIMEText(msgHtml, 'html')) message_alternative.attach(MIMEText(msgPlain, 'plain')) message_alternative.attach(message_related) message.attach(message_alternative) print "create_message_with_attachment: file:", attachmentFile content_type, encoding = mimetypes.guess_type(attachmentFile) if content_type is None or encoding is not None: content_type = 'application/octet-stream' main_type, sub_type = content_type.split('/', 1) if main_type == 'text': fp = open(attachmentFile, 'rb') msg = MIMEText(fp.read(), _subtype=sub_type) fp.close() elif main_type == 'image': fp = open(attachmentFile, 'rb') msg = MIMEImage(fp.read(), _subtype=sub_type) fp.close() elif main_type == 'audio': fp = open(attachmentFile, 'rb') msg = MIMEAudio(fp.read(), _subtype=sub_type) fp.close() else: fp = open(attachmentFile, 'rb') msg = MIMEBase(main_type, sub_type) msg.set_payload(fp.read()) fp.close() filename = os.path.basename(attachmentFile) msg.add_header('Content-Disposition', 'attachment', filename=filename) message.attach(msg) return {'raw': base64.urlsafe_b64encode(message.as_string())} 

Html / text / attachment:

 import httplib2 import os import oauth2client from oauth2client import client, tools import base64 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from apiclient import errors, discovery import mimetypes from email.mime.image import MIMEImage from email.mime.audio import MIMEAudio from email.mime.base import MIMEBase SCOPES = 'https://www.googleapis.com/auth/gmail.send' CLIENT_SECRET_FILE1 = 'client_secret.json' location = os.path.realpath( os.path.join(os.getcwd(), os.path.dirname(__file__))) CLIENT_SECRET_FILE = os.path.join(location, CLIENT_SECRET_FILE1) APPLICATION_NAME = 'Gmail API Python Send Email' def get_credentials(): home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'gmail-python-email-send.json') store = oauth2client.file.Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME credentials = tools.run_flow(flow, store) print 'Storing credentials to ' + credential_path return credentials def SendMessageWithAttachment(sender, to, subject, msgHtml, msgPlain, attachmentFile): credentials = get_credentials() http = credentials.authorize(httplib2.Http()) service = discovery.build('gmail', 'v1', http=http) message1 = create_message_with_attachment(sender, to, subject, msgHtml, msgPlain, attachmentFile) SendMessageInternal(service, "me", message1) def SendMessageInternal(service, user_id, message): try: message = (service.users().messages().send(userId=user_id, body=message).execute()) print 'Message Id: %s' % message['id'] return message except errors.HttpError, error: print 'An error occurred: %s' % error return "error" def create_message_with_attachment( sender, to, subject, msgHtml, msgPlain, attachmentFile): """Create a message for an email. Args: sender: Email address of the sender. to: Email address of the receiver. subject: The subject of the email message. message_text: The text of the email message. file: The path to the file to be attached. Returns: An object containing a base64url encoded email object. """ message = MIMEMultipart('mixed') message['to'] = to message['from'] = sender message['subject'] = subject message_alternative = MIMEMultipart('alternative') message_related = MIMEMultipart('related') message_related.attach(MIMEText(msgHtml, 'html')) message_alternative.attach(MIMEText(msgPlain, 'plain')) message_alternative.attach(message_related) message.attach(message_alternative) print "create_message_with_attachment: file:", attachmentFile content_type, encoding = mimetypes.guess_type(attachmentFile) if content_type is None or encoding is not None: content_type = 'application/octet-stream' main_type, sub_type = content_type.split('/', 1) if main_type == 'text': fp = open(attachmentFile, 'rb') msg = MIMEText(fp.read(), _subtype=sub_type) fp.close() elif main_type == 'image': fp = open(attachmentFile, 'rb') msg = MIMEImage(fp.read(), _subtype=sub_type) fp.close() elif main_type == 'audio': fp = open(attachmentFile, 'rb') msg = MIMEAudio(fp.read(), _subtype=sub_type) fp.close() else: fp = open(attachmentFile, 'rb') msg = MIMEBase(main_type, sub_type) msg.set_payload(fp.read()) fp.close() filename = os.path.basename(attachmentFile) msg.add_header('Content-Disposition', 'attachment', filename=filename) message.attach(msg) return {'raw': base64.urlsafe_b64encode(message.as_string())} def main(): to = "to@address.com" sender = "from@address.com" subject = "subject" msgHtml = "Hi<br/>Html Email" msgPlain = "Hi\nPlain Email" attachment = "/path/to/file.pdf" SendMessageWithAttachment(sender, to, subject, msgHtml, msgPlain, attachment) if __name__ == '__main__': main() 
3
01 апр. cavab 01 apr . 2017-04-01 16:14 '17 v 16:14 2017-04-01 16:14

Отличный ответ Lain!

Bəli, sadəcə olaraq, bu, mənim üçün bir şeydir. В конце я перечислит клиентов, на которых я тестировал.

  • MimeMultipart ("qarışdırılmış") istifadə edərək, yeni funksiyanı yaratdıq. Смешать не нужно, əgər siz вы отправляете только встроенные изображения.

     public Multipart build(String messageText, String messageHtml, List<URL> messageHtmlInline) throws MessagingException { final Multipart mpAlternative = new MimeMultipart("alternative"); { // Note: MUST RENDER HTML LAST otherwise iPad mail client only renders // the last image and no email addTextVersion(mpAlternative,messageText); addHtmlVersion(mpAlternative,messageHtml, messageHtmlInline); } return mpAlternative; } 
  • AddTextVersion ya da əlavə kodlaşdırma əlavə olunduqda, mətni əlavə edin, mümkündür, mümkün / mütləq köçməyinizə baxmayaraq, mən yalnız statik əlavə etdim.

     textPart.setContent(messageText, "text/plain"); to textPart.setContent(messageText, "text/plain; charset=UTF-8"); 
  • Sonuncu element addImagesInline üsulunu əlavə edir. Mən əlavə olaraq faylın görünüşünü görüntüləyin. Nə qədər ki, bu, sadəcə olaraq, Android-dəki müştərilər üçün bilinməyən şəkillərə sahib olmaq üçün bilinməyən şəkilləri ilə bilinməyəcək və avtomatik olaraq elektron poçtla göndərilməlidir.

     for (URL img : embeded) { final MimeBodyPart htmlPartImg = new MimeBodyPart(); DataSource htmlPartImgDs = new URLDataSource(img); htmlPartImg.setDataHandler(new DataHandler(htmlPartImgDs)); String fileName = img.getFile(); fileName = getFileName(fileName); String newFileName = cids.get(fileName); boolean imageNotReferencedInHtml = newFileName == null; if (imageNotReferencedInHtml) continue; htmlPartImg.setHeader("Content-ID", "<"+newFileName+">"); htmlPartImg.setDisposition(BodyPart.INLINE); **htmlPartImg.setFileName(newFileName);** parent.addBodyPart(htmlPartImg); } 

Итак, это список клиентов, на которых я тестировал. Outlook 2010, Outlook Web App, Internet Explorer 11, Fire Fox, Хром, Outlook с использованием собственного приложения Apple, Электронная почта, проходящая через Gmail - Почтовый клиент браузера, Internet Explorer 11, Fire Fox, Хром, Почтовый клиент по умолчанию для Android, osx IPhone по умолчанию почтовый клиент, Почтовый клиент Gmail на Android, Почтовый клиент Gmail на IPhone, Электронная почта через Yahoo - Почтовый клиент браузера, Internet Explorer 11, Fire Fox, Хром, Почтовый клиент по умолчанию для Android, osx IPhone по умолчанию почтовый клиент.

Надеюсь, что это поможет кому-то еще.

3
ответ дан XDevOne 15 янв. '16 в 20:38 2016-01-15 20:38

Вот лучшее: Многостраничное/смешанное сообщение mime с вложениями и встроенными изображениями

И изображение: https://www.qcode.co.uk/images/mime-nesting-structure.png

 From: from@qcode.co.uk To: to@@qcode.co.uk Subject: Example Email MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MixedBoundaryString" --MixedBoundaryString Content-Type: multipart/related; boundary="RelatedBoundaryString" --RelatedBoundaryString Content-Type: multipart/alternative; boundary="AlternativeBoundaryString" --AlternativeBoundaryString Content-Type: text/plain;charset="utf-8" Content-Transfer-Encoding: quoted-printable This is the plain text part of the email. --AlternativeBoundaryString Content-Type: text/html;charset="utf-8" Content-Transfer-Encoding: quoted-printable <html> <body>=0D <img src=3D=22cid:masthead.png=40qcode.co.uk=22 width 800 height=3D80= =5C>=0D <p>This is the html part of the email.</p>=0D <img src=3D=22cid:logo.png=40qcode.co.uk=22 width 200 height=3D60 =5C= >=0D </body>=0D </html>=0D --AlternativeBoundaryString-- --RelatedBoundaryString Content-Type: image/jpgeg;name="logo.png" Content-Transfer-Encoding: base64 Content-Disposition: inline;filename="logo.png" Content-ID: <logo.png@qcode.co.uk> amtsb2hiaXVvbHJueXZzNXQ2XHVmdGd5d2VoYmFmaGpremxidTh2b2hydHVqd255aHVpbnRyZnhu dWkgb2l1b3NydGhpdXRvZ2hqdWlyb2h5dWd0aXJlaHN1aWhndXNpaHhidnVqZmtkeG5qaG5iZ3Vy ... ... a25qbW9nNXRwbF0nemVycHpvemlnc3k5aDZqcm9wdHo7amlodDhpOTA4N3U5Nnkwb2tqMm9sd3An LGZ2cDBbZWRzcm85eWo1Zmtsc2xrZ3g= --RelatedBoundaryString Content-Type: image/jpgeg;name="masthead.png" Content-Transfer-Encoding: base64 Content-Disposition: inline;filename="masthead.png" Content-ID: <masthead.png@qcode.co.uk> aXR4ZGh5Yjd1OHk3MzQ4eXFndzhpYW9wO2tibHB6c2tqOTgwNXE0aW9qYWJ6aXBqOTBpcjl2MC1t dGlmOTA0cW05dGkwbWk0OXQwYVttaXZvcnBhXGtsbGo7emt2c2pkZnI7Z2lwb2F1amdpNTh1NDlh ... ... eXN6dWdoeXhiNzhuZzdnaHQ3eW9zemlqb2FqZWt0cmZ1eXZnamhka3JmdDg3aXV2dWd5aGVidXdz dhyuhehe76YTGSFGA= --RelatedBoundaryString-- --MixedBoundaryString Content-Type: application/pdf;name="Invoice_1.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment;filename="Invoice_1.pdf" aGZqZGtsZ3poZHVpeWZoemd2dXNoamRibngganZodWpyYWRuIHVqO0hmSjtyRVVPIEZSO05SVURF SEx1aWhudWpoZ3h1XGh1c2loZWRma25kamlsXHpodXZpZmhkcnVsaGpnZmtsaGVqZ2xod2plZmdq ... ... a2psajY1ZWxqanNveHV5ZXJ3NTQzYXRnZnJhZXdhcmV0eXRia2xhanNueXVpNjRvNWllc3l1c2lw dWg4NTA0 --MixedBoundaryString Content-Type: application/pdf;name="SpecialOffer.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment;filename="SpecialOffer.pdf" aXBvY21odWl0dnI1dWk4OXdzNHU5NTgwcDN3YTt1OTQwc3U4NTk1dTg0dTV5OGlncHE1dW4zOTgw cS0zNHU4NTk0eWI4OTcwdjg5MHE4cHV0O3BvYTt6dWI7dWlvenZ1em9pdW51dDlvdTg5YnE4N3Z3 ... ... OTViOHk5cDV3dTh5bnB3dWZ2OHQ5dTh2cHVpO2p2Ymd1eTg5MGg3ajY4bjZ2ODl1ZGlvcjQ1amts dfnhgjdfihn= --MixedBoundaryString-- . 

Схема многочастная/связанная/альтернативная

 Header |From: email |To: email |MIME-Version: 1.0 |Content-Type: multipart/mixed; boundary="boundary1"; Message body |multipart/mixed --boundary1 |--boundary1 | multipart/related --boundary2 | |--boundary2 | | multipart/alternative --boundary3 | | |--boundary3 | | |text/plain | | |--boundary3 | | |text/html | | |--boundary3-- | |--boundary2 | |Inline image | |--boundary2 | |Inline image | |--boundary2-- |--boundary1 |Attachment1 |--boundary1 |Attachment2 |--boundary1 |Attachment3 |--boundary1-- | . 
1
ответ дан user8660272 23 сент. '17 в 13:04 2017-09-23 13:04

Другие вопросы по меткам или Задайте вопрос