วิธีส่งอีเมล HTML


25

ฉันกำลังสร้างโมดูลอย่างง่ายซึ่งจะส่งอีเมล HTML ไปยังผู้ใช้เพื่อรับข้อเสนอในเว็บไซต์ของเรา

ฉันค้นหามาก แต่ไม่สามารถหาโซลูชันที่เหมาะสมสำหรับ Drupal ตอนนี้ฉันสามารถส่งอีเมล แต่เป็นข้อความธรรมดา

ขั้นตอนทีละขั้นตอนในการส่งอีเมล HTML ใน Drupal 7 คืออะไร?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='no-reply@example.com';
    $subject = "another message for  HTML email from example.com";
    $body="<h2 style='font-size:28px;color:red;'>Hello EMAIL, i here i want to be <b>bolded</b></h2>";
    if (drupal_mail('example', 'send_gift', $mailto, language_default(),$params,$mailfrom,TRUE)) {
        drupal_set_message(t('Your gift was sent successfully!!!'));
    }
    else {
        drupal_set_message(t('<font color="red">Error occured while sending your mail!!!</font>'));
    }


/****hook_mail*/
function example_mail($key,&$message,$params) {
    $language = $message['language'];
    switch ($key) {
        case 'send_gift':
            $message['subject']=t($params['subject'], $var, $language->language);
            $message['body'][]=$params['body'];
            $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
        break;
    }
}

คุณไม่ได้ผ่านหน้า HTML แบบเต็ม
GoodSp33d

คำตอบ:


22

เช่นเดียวกับ geoff ที่กล่าวถึงตัวเลือกหนึ่งคือการใช้โมดูล Mime Mail แต่คุณสามารถเปิดใช้งานโมดูลที่กำหนดเองของคุณเพื่อส่งอีเมล HTML ด้วยรหัสพิเศษบางอย่างได้ ในระยะสั้นที่คุณจะต้องปรับเปลี่ยนตัวแปรและเขียนการดำเนินงานของคุณเองmail_system MailSystemInterfaceตัวอย่างของรหัสต่อไปนี้คือ

ภายใน 'mymodule.install':

function mymodule_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('mymodule' => 'MymoduleMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function mymodule_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['mymodule']);
  variable_set('mail_system', $mail_system);
}

ภายใน 'mymodule.module':

class MymoduleMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

คุณจะต้องแทนที่อินสแตนซ์ mymodule ด้วยชื่อโมดูลจริงของคุณจากนั้นปิดการใช้งานและเปิดใช้งานโมดูลของคุณอีกครั้งเพื่อให้ตัวแปรเปลี่ยนแปลงหลังจากที่สิ่งต่าง ๆ ควรใช้งานได้ สำหรับตัวอย่างที่สมบูรณ์คุณสามารถตรวจสอบคำตอบของฉันที่นี่ นอกจากนี้หน้านี้บน drupal.org มาจากที่ฉันได้รับข้อมูลทั้งหมด


2
ฉันทำตามคำแนะนำของคุณ + ตัวอย่างที่สมบูรณ์ที่คุณให้ไว้ตอนนี้ทุกอย่างกำลังทำงาน ... ขอบคุณมาก
mrcniceguy

7

โมดูลMime Mailนั้นเกือบจะเป็นสิ่งที่คุณต้องการอย่างแน่นอน

นี่คือโมดูลส่วนประกอบ Mime Mail (สำหรับใช้โดยโมดูลอื่น)

  • อนุญาตให้ผู้ใช้รับอีเมล HTML และโมดูลอื่นสามารถใช้ได้ ฟังก์ชั่นเมลยอมรับเนื้อหาข้อความ HTML, mime-endcodes และส่ง
  • หาก HTML มีกราฟิกฝังตัวกราฟิกเหล่านี้จะถูกเข้ารหัสแบบ MIME และรวมไว้เป็นไฟล์แนบของข้อความ
  • ใช้สไตล์ของไซต์ของคุณโดยรวมไฟล์สไตล์ชีทของธีมของคุณในรูปแบบข้อความ HTML ที่เป็นธีม
  • หากการตั้งค่าของผู้รับพร้อมใช้งานและพวกเขาต้องการข้อความธรรมดา HTML จะถูกแปลงเป็นข้อความธรรมดาและส่งตามที่เป็น มิฉะนั้นอีเมลจะถูกส่งในรูปแบบ HTML ที่เป็นทางเลือกแทนข้อความธรรมดา
  • ช่วยให้คุณสามารถจัดรูปแบบข้อความที่มีปุ่มเฉพาะ
  • แปลงสไตล์ CSS เป็นคุณสมบัติสไตล์แบบอินไลน์
  • จัดเตรียมการทำงานของระบบอย่างง่ายและการกระทำของกฎเพื่อส่งอีเมล HTML พร้อมรูปภาพและไฟล์แนบ

5
ฉันได้ดาวน์โหลดโมดูล mimemail + ระบบเมล ... คุณจะกรุณาอธิบายให้โทรฟังก์ชั่น mimemail ไปยังโมดูลของฉันตามรหัสด้านบน
mrcniceguy

3

คุณอาจต้องการดูโมดูล Swift Mailer ช่วยให้คุณส่งอีเมล HTML ที่มีไฟล์แนบทั้งแบบอินไลน์และแบบปกติ (เช่นรูปภาพหรือไฟล์) นอกจากนี้ยังสามารถสร้างเวอร์ชันข้อความธรรมดาโดยอัตโนมัติตามอีเมล HTML

คุณสามารถดูได้ที่http://www.drupal.org/project/swiftmailer

สำหรับบันทึก: ฉันเป็นผู้แต่งและผู้ดูแลโมดูล


2

คุณไม่ได้ส่ง HTML ที่เหมาะสมคุณเป็นเพียงแค่แท็ก H1 และแท็ก B คุณอาจต้องรวมแท็ก HTML แบบเต็มเช่นกันเริ่มจาก
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


ขอบคุณสำหรับความคิดเห็นของคุณฉันใช้ @Dooshta เช่นเพิ่ม html ที่เหมาะสมตามที่คุณแนะนำ .. ทุกอย่างทำงานได้
mrcniceguy

ฉันแน่ใจว่าไม่มีอันตรายใด ๆ ในการใช้ doctype & การตรวจสอบ HTML อย่างสมบูรณ์ แต่ไม่จำเป็นต้องส่งอีเมล HTML ผ่าน drupal ฉันเพิ่งลบแท็ก doctype & html และอีเมลที่แสดงผลได้ดีใน Gmail & Outlook อย่างไรก็ตามสิ่งสำคัญคือต้องมีการแก้ไขของ Dooshta: ก่อนที่ฉันจะใช้การเปลี่ยนแปลงเหล่านั้นฉันไม่สามารถสร้าง html ได้เลย
doub1ejack

2

คำตอบข้างต้นไม่ได้ผลสำหรับฉันดังนั้นนี่คือการตอบคำถามดั้งเดิมของฉัน

ก่อนอื่นให้ติดตั้งและเปิดใช้งานโมดูลMime Mail คุณสามารถอ่านREADME.txtสำหรับคำแนะนำที่สมบูรณ์เกี่ยวกับวิธีการใช้งาน ฉันจะให้รุ่นสั้น ๆ แก่คุณ

คุณต้องเปิดใช้งาน Mime Mail สำหรับโมดูลของคุณ คุณสามารถทำได้โดยใช้hook_enableหรือhook_update_Nในexample.install:

function example_enable() {
  mailsystem_set(array(
    'example_send_gift' => 'MimeMailSystem',
  ));
}

เมื่อคุณไปที่admin/config/system/mailsystemคุณจะเห็นว่ามีการเพิ่มรายการใหม่สำหรับโมดูลของคุณ:

ตัวอย่างคลาสโมดูล (คีย์ send_gift)

MimeMailSystem

ตอนนี้คุณไม่จำเป็นต้องเจาะจงtext/htmlหัวเรื่องใด ๆอีกต่อไป Mime Mail จะดูแลเรื่องนี้ ดังนั้นคุณไม่ต้องการสิ่งนี้:

$message['headers']['Content-Type'] = ...

หากคุณต้องการคุณสามารถเพิ่ม$message['plaintext']อีเมลของคุณเป็นทางเลือกที่ไม่ใช่ HTML แต่ไม่จำเป็น

แค่นั้นแหละ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.