I am sending all my WordPress emails using Mailgun SMTP.
Other emails from WordPress arrive to the inbox fine, but I have just created a new function to automatically generate an email when a post is published and it always gets caught by the spam filter.
Can you see why?
Maybe something to do with my headers config?
I have tried sending with and without the attachment, it makes no difference.
add_action( 'publish_post', 'notify_on_publish' );
function notify_on_publish( $post_id ) {
global $post;
$from_name = get_bloginfo( 'name' );
$from_email = get_bloginfo( 'admin_email' );
$to_email = get_post_meta( $post_id, 'contact_email', true );
$attachment = get_post_meta( $post_id, 'post_image', true );
$headers = "From: '$from_name' <$from_email> \r\n Content-type: text/html; charset=" . get_option('blog_charset') . "\r\n";
$subject = "This is a test subject";
$message = "<p>This is some test body text</p>";
$attachment_url = $attachment['guid'];
wp_mail( $to_email, $subject, $message, $headers, $attachment_url );
}
Related
In order to send a post form submission notification with wp_mail(), I would like to get the sender email.
I have created an hidden field into my form where I can get the user logged email.
What is the function I can use to get the user logged email to send the notification ?
The hidden field ID into the form is 4.
I have created a variable :
$subscribers = rgar( $entry, '4' );
But it's not working...
My code to send the notification :
add_action( 'gform_after_submission', 'notification_mail', 10, 2 );
function notification_mail( $entry, $form ) {
$created_posts = gform_get_meta( $entry['id'], 'gravityformsadvancedpostcreation_post_id' );
foreach ( $created_posts as $post )
{
$post_id = $post['post_id'];
$subscribers = rgar( $entry, '4' );
$subject = 'Merci';
$message = "<p>Bonjour,</p>
<p>Merci d'avoir rempli notre formulaire</p>";
$headers = array('Content-Type: text/html; charset=UTF-8','From: SMP <noreply#smp.fr>');
$content_type = function() { return 'text/html'; };
add_filter( 'wp_mail_content_type', $content_type );
wp_mail( $subscribers, $subject, $message, $headers );
remove_filter( 'wp_mail_content_type', $content_type );
}
}
Thank you so much !
FX
Ok... I just wrote this function to get the user mail (my user is logged when he complets the form) :
$user = wp_get_current_user();
$subscriber = esc_html( $user->user_email );
I'm new in plugin development. I would like to use this simple function in Wordpress to send mail to users. I saw this code in the documentation everything is simple and straight forward but this code returns false. Why ?
require_once explode( 'wp-content', __FILE__ )[0] . 'wp-load.php';
function send_mail() {
$to = 't.testmail#gmail.com';
$subject = 'The subject';
$body = 'The email body content';
$headers = array( 'Content-Type: text/html; charset=UTF-8' );
$send_message = wp_mail( $to, $subject, $body, $headers );
if ( $send_message ) {
echo 'Email was sent';
} else {
echo 'Email sending was aborted';
}
}
send_mail();
According to the documentation (https://developer.wordpress.org/reference/functions/wp_mail/) the mail could not be sent.
Reasons could be many. Have you checked the debug log of WordPress (https://wordpress.org/support/article/debugging-in-wordpress/)?
I have a WordPress site where users can post from the front-end and the post status goes as Draft.
Now when I publish the post from Admin panel, the notification email is sent more than one time. I need to send email once.
Below my code:
if (is_admin()) {
function notifyauthor($post_id) {
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post publish notification";
$headers = 'From: '.get_bloginfo( 'name' ).' <my_email#gmail.com>' . "\r\n";
$message = "
Hi ".$author->display_name.",
Your post, \"".$post->post_title."\" has just been published.
View post: ".get_permalink( $post_id )."
Thank You, Admin"
;
wp_mail($author->user_email, $subject, $message, $headers);
}
add_action('publish_post', 'notifyauthor');
}
I tried current_user_can('administrator') insteed to is_admin(), but same result I got.
Many hooks will actually run more than one time. The simple solution is to add a counter by way of post_meta after the first iteration, then check it doesn't exist. This isn't tested, but should work.
function notifyauthor($post_id) {
if (is_admin() && !(metadata_exists('post', $post_id, 'sent_notification_email'))) {
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post publish notification";
$headers = 'From: '.get_bloginfo( 'name' ).' <my_email#gmail.com>' . "\r\n";
$message = "
Hi ".$author->display_name.",
Your post, \"".$post->post_title."\" has just been published.
View post: ".get_permalink( $post_id )."
Thank You, Admin";
wp_mail($author->user_email, $subject, $message, $headers);
// Set a meta key as a counter
update_post_meta($post_id, 'sent_notification_email', '1');
}
}
add_action('publish_post', 'notifyauthor');
I have this code and it should work, the email is sent but without the attachment.
$attachments = THEME_DIR . '/resources/img/emails/cropped.png';
$headers[] = 'Content-Type: text/html; charset=UTF-8';
$headers[] = 'From: Me Myself <me#example.net>';
wp_mail( 'test#example.org', 'subject', 'message', $headers, $attachments );
Okay, turns out that you just need to use ABSPATH.
$attachments = [
ABSPATH . 'wp-content/themes/themename/resources/img/emails/cropped.png',
ABSPATH . 'wp-content/themes/themename/resources/img/emails/facebook.png'
];
// Send the email and the invoice as an attachment.
wp_mail( 'test#email.com', 'New Invoice', 'Message body sent with attachment.', $headers, $attachments );
You can set up also these or just include them in $headers:
add_filter( 'wp_mail_content_type', function ( $content_type ) {
return 'text/html';
} );
add_filter( 'wp_mail_from', 'yoursite_wp_mail_from' );
function yoursite_wp_mail_from( $content_type ) {
return 'contact#yoursite.ca';
}
add_filter( 'wp_mail_from_name', 'yoursite_wp_mail_from_name' );
function yoursite_wp_mail_from_name( $name ) {
return 'Your Site Inc.';
}
I am trying to send mail when a post is published. For that I wrote code in my function.php file, the mail is correctly sending, but the featured image is not sent. I want to display the featured image attached to the post. Right now in mail the featured image is not displayed, but the link of fthe eatured image is displayed.
What can I do to achieve my task to display the featured image in the mail? I am attaching the code I have written in function.php file:
function mysendmail($post_id) {
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post Published: ".$post->post_title."";
$message = "
Hi ".$author->display_name.",
Your post, \"".$post->post_title."\" has just been published.
View post: ".get_permalink( $post_id )."
Your Image: ".get_the_post_thumbnail( $post->ID )."
Thanks"
;
wp_mail($author->user_email, $subject, $message);
}
add_action('publish_post', 'mysendmail');
To attach file through wp_mail function, you need to use $attachments parameter in it. In which you need to give absolute file path of attachment.
function mysendmail($post_id) {
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post Published: ".$post->post_title."";
$attachments = get_attached_file( get_post_thumbnail_id( $post_id ));
$headers[] = '';
$message = "
Hi ".$author->display_name.",
Your post, \"".$post->post_title."\" has just been published.
View post: ".get_permalink( $post_id )."
Thanks"
;
wp_mail($author->user_email, $subject, $message, $headers, $attachments);
}
add_action('publish_post', 'mysendmail');
You need to set the content type to text/html for the image to work. You can do that using the wp_mail_content_type filter or by adding a header into your wp_mail() function. Here's an example of the latter.
function mysendmail($post_id) {
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post Published: ".$post->post_title."";
$headers = array('Content-Type: text/html; charset=UTF-8');
$message = "
Hi ".$author->display_name.",
Your post, \"".$post->post_title."\" has just been published.
View post: ".get_permalink( $post_id )."
Your Image: ".get_the_post_thumbnail( $post->ID )."
Thanks"
;
wp_mail($author->user_email, $subject, $message, $headers);
}
add_action('publish_post', 'mysendmail');
Try this one, just tested on a local install and it works well :) you need to change the content type for the mail as discussed, also im returning the actual URL of the image (large size).
function set_html_content_type() {
return 'text/html';
}
function mysendmail($post_id) {
add_filter( 'wp_mail_content_type', 'set_html_content_type' );
$post = get_post($post_id);
$author = get_userdata($post->post_author);
$subject = "Post Published: ".$post->post_title."";
$image = get_the_post_thumbnail_url($post_id, 'large');
$message = '
Hi '.$author->display_name.',<br/><br/>
Your post, '.$post->post_title.' has just been published.<br/>
View post: '.get_permalink( $post_id ).'<br/>
Your Image: <img src="'.$image.'" /><br/><br/>
Thanks';
wp_mail($author->user_email, $subject, $message);
remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
}
add_action('publish_post', 'mysendmail');