How to display emails as a post?

I am creating a Plugin that displays e-mails as posts. I used the following PHP to access those emails:

?php
class Email_reader {
    // imap server connection
    public $conn;
    // inbox storage and inbox message count
    private $inbox;
    private $msg_cnt;
    // email login credentials
    private $server = 'website.com';
    private $user   = '[email protected]';
    private $pass   = 'PASSWORD';
    private $port   = 993; // adjust according to server settings
    // connect to the server and get the inbox emails
    function __construct() {
        $this-connect();
        $this-inbox();
    }
    // close the server connection
    function close() {
        $this-inbox = array();
        $this-msg_cnt = 0;
        imap_close($this-conn);
    }
    // open the server connection
    // the imap_open function parameters will need to be changed for the particular server
    // these are laid out to connect to a Dreamhost IMAP server
    function connect() {
        $this-conn = imap_open('{'.$this-server.'/notls}', $this-user, $this-pass);
    }
    // move the message to a new folder
    function move($msg_index, $folder='INBOX.Processed') {
        // move on server
        imap_mail_move($this-conn, $msg_index, $folder);
        imap_expunge($this-conn);
        // re-read the inbox
        $this-inbox();
    }
    // get a specific message (1 = first email, 2 = second email, etc.)
    function get($msg_index=NULL) {
        if (count($this-inbox) = 0) {
            return array();
        }
        elseif ( ! is_null($msg_index)  isset($this-inbox[$msg_index])) {
            return $this-inbox[$msg_index];
        }
        return $this-inbox[0];
    }
    // read the inbox
    function inbox() {
        $this-msg_cnt = imap_num_msg($this-conn);
        $in = array();
        for($i = 1; $i = $this-msg_cnt; $i++) {
            $in[] = array(
                'index'     = $i,
                'header'    = imap_headerinfo($this-conn, $i),
                'body'      = imap_body($this-conn, $i),
                'structure' = imap_fetchstructure($this-conn, $i)
            );
        }
        $this-inbox = $in;
    }
}
$emails = new Email_reader;
echo pre;
    var_dump($emails);

Now I created a custom post type and I want to assign those emails to the custom post type how can I achieve it. The code I used is

//// Register Post Type.
if(!function_exists('my_email_custom_post_type')){
    function my_email_custom_post_type() {
        $labels = array(
            'name'                = __( 'E-mail Inbox','domain'),
            'singular_name'       = __( ' E-mail','domain'),
            'menu_name'           = __( 'E-mail Inbox','domain'),
            'parent_item_colon'   = __( 'Parent tickets','domain'),
            'all_items'           = __( 'All E-mail tickets','domain'),
            'view_item'           = __( 'View E-mail tickets','domain'),
            'search_items'        = __( 'Search E-mail tickets','domain'),
            'not_found'           = __( 'Not Found','domain'),
            'supports'          =__( 'title', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'revisions', 'page-attributes' ),
            'not_found_in_trash'  = __( 'Not found in Trash','domain')
        );


        $args = array(
            'label'               = __( 'E-mail Inbox','domain'),
            'description'         = __( 'E-mail','domain'),
            'labels'              = $labels,
            'supports'            = array( 'title'),
            'capabilities' = array(
             'create_posts' = false, // Removes support for the Add New function ( use 'do_not_allow' instead of false for multisite set ups )
  ),
            'public'              = true,
            'hierarchical'        = false,
            'show_ui'             = true,
            'menu_icon'           = 'dashicons-feedback',
            'show_in_menu'        = true,
            'show_in_nav_menus'   = true,
            'show_in_admin_bar'   = true,
            'has_archive'         = true,
            'can_export'          = true,
            'exclude_from_search' = false,
            'yarpp_support'       = true,
            'publicly_queryable'  = true,
            'capability_type'     = 'page'
        );
        register_post_type( 'post-email', $args );
    }
    add_action( 'init', 'my_email_custom_post_type', 0 );
}


require_once plugin_dir_path( __FILE__ ) . 'emailpipe.php';


$args = array(
'post_type' = 'my-email',
);

$emails = new WP_query($args);

while($emails-have_posts()) {
$emails-the_post();

?
h3?php the_title(); ?/h3
?php the_excerpt();?
?php
}

This is for sure not working can you please advise me.

Topic variables email plugins custom-post-types Wordpress

Category Web


It's very easy use can use wordpress default function wp_insert_post() to create post programtically. See this for more detail.

Given below is the code that I modified:

<?php
class Email_reader {
    // imap server connection
    public $conn;
    // inbox storage and inbox message count
    private $inbox;
    private $msg_cnt;
    // email login credentials
    private $server = 'website.com';
    private $user   = '[email protected]';
    private $pass   = 'PSSWORD';
    private $port   = 993; // adjust according to server settings
    // connect to the server and get the inbox emails
    function __construct() {
        $this->connect();
        $this->inbox();
    }
    // close the server connection
    function close() {
        $this->inbox = array();
        $this->msg_cnt = 0;
        imap_close($this->conn);
    }
    // open the server connection
    // the imap_open function parameters will need to be changed for the particular server
    // these are laid out to connect to a Dreamhost IMAP server
    function connect() {
        $this->conn = imap_open('{'.$this->server.'/notls}', $this->user, $this->pass);
    }
    // move the message to a new folder
    function move($msg_index, $folder='INBOX.Processed') {
        // move on server
        imap_mail_move($this->conn, $msg_index, $folder);
        imap_expunge($this->conn);
        // re-read the inbox
        $this->inbox();
    }
    // get a specific message (1 = first email, 2 = second email, etc.)
    function get($msg_index=NULL) {
        if (count($this->inbox) <= 0) {
            return array();
        }
        elseif ( ! is_null($msg_index) && isset($this->inbox[$msg_index])) {
            return $this->inbox[$msg_index];
        }
        return $this->inbox[0];
    }
    // read the inbox
    function inbox() {
        $this->msg_cnt = imap_num_msg($this->conn);
        $in = array();
        for($i = 1; $i <= $this->msg_cnt; $i++) {
            $in[] = array(
                'index'     => $i,
                'header'    => imap_headerinfo($this->conn, $i),
                'body'      => imap_body($this->conn, $i),
                'structure' => imap_fetchstructure($this->conn, $i)
            );
        }
        $this->inbox = $in;
    }
    function total_msg(){
        return imap_num_msg($this->conn);;
    }
}

$emails = new Email_reader;    
$total =  $emails->total_msg();

    for ($j=1; $j <= $total; $j++) { 
       $mail =  $emails->get($j);

       $post_array = array(        
        'post_content'  => $mail['body'],
        'post_title'    => $mail['header']->subject,
        'post_type'     => 'my-email',
        'post_status'   => 'publish',
        'meta_input'    => array(
                'to'           => $mail['header']->toaddress,
                'email_date'    => $mail['header']->Date,   // add post meta as many as you want
            ),
       );
       wp_insert_post($post_array);
    }
    

I changed your class and added 1 more function to get a total number of emails. after that, I get email one by one and create a post using wp_insert_post()

Now you can read it using your code:

$args = array(
'post_type' => 'my-email',
);

$emails = new WP_query($args);

while($emails->have_posts()) {
$emails->the_post();

?>
<h3><?php the_title(); ?></h3>

I did not add an Excerpt but you can modify my code according to your need. Thank you.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.