Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Page 1 of 3 123 LastLast
Results 1 to 15 of 39
  1. #1
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts

    sendmail won't send mail...???

    I am trying to add sendmail to a cgi script I have.

    Well my first question is can I add it to an existing cgi script as I have below?

    If I can, then why isn't it send the message? I was testing it with my $to ="myemail@tome.com\n"; just for testing purposes but I would need to use the email address for the users that are being notified. The first part of this script is sending a notification to my internal message system which is also suppose to send a message to the users external email but its not working and I can't figure out why.... so, I thought I would just add the sendmail into it so it finally works. This is the one thing I am trying to get working 100% before I want to launch the site.

    If I cannot combine them then will I be able to call both scripts at the sametime without any problems?

    Here is the code:

    Code:
    #!/usr/bin/perl -w
    use CGI::Carp qw(fatalsToBrowser carpout);
    use CGI qw(:standard);
    use DBD::mysql;
    use LWP::Simple;
    use URI;
    print "Content-type: text/html \n\n";
    
     ###############################
     # find the root if this is IIS:
     ###############################
     if($ENV{'SERVER_SOFTWARE'} =~ m/IIS/)
     {
    	if($root eq "" && $ENV{'PATH_TRANSLATED'} ne "")
    	{
    		my $pt = $ENV{'PATH_TRANSLATED'};
    		my @pts = split(/\\/, $pt);
    		$pts[-1] = "";
    		$root = join "/", @pts;
    		$OS = "NT";
    	}
     }
    
     ###############################
     # functions library:
     ###############################
     if(!$dontparse){
            require "${root}data/config/pmpre.cfg";
            require "${root}lib/mysql.lib";
            require "${root}lib/pm.lib";
            require "${root}lib/phpbb.lib" if($plugin_phpbb eq "yes");
     }
    
     ###############################
     # Read the data coming from the form..
     ###############################
     if(!$dontparse){ &readit; }
     ###############################
    
      if($use_cookie eq "yes" && !$dontparse && $input{'ID'}<1 && $input{'action'} ne "register"){
       #- retrieve existing cookie
       $lp = $req->cookie("pmpre");
       my ($clogin, $cID) = split(/\|/, pm_decode($lp));
       if(($clogin ne "") and ($cID ne "")){
    	   if($input{'login'} eq ""){
    		$input{'login'} = $clogin;
    	   }
    	   if($input{'ID'} eq "" && $input{'password'} eq ""){
    		$input{'ID'} = $cID;
    	   }
       }
    
     }
    
    
    my $count = 0;
    my $subject = "New posting in your Location";
    my $flag = "1";
    my $from = "admin";
    my $time = &get_time;
    
    $query = "SELECT MAX(mailno) FROM `mailbox`";
    my $sth = $dbh->prepare($query);
    $sth->execute();
    my $data = $sth->fetchrow_array();
    my $mailno = ($data + 1);
    
    
    my $profiles_sth = $dbh->prepare("SELECT * FROM `departures` WHERE `departures_states` = ? AND `departures_state_region` = ?" ) or die $DBI::errstr;
    $profiles_sth->execute($input{'state1'}, $input{'state2'}) or die $DBI::errstr;
    while(my $profiles = $profiles_sth->fetchrow_hashref()){
    my $firstname = "$profiles->{'firstname'}";
    my $login = "$profiles->{'login'}";
    my $to = "$profiles->{'email'}";
    
    # add personalized mail
    my $body = "You have recent posts. <a href=pm.cgi?action=app_list&app=ship1&app_id=".$input{'app_id'}.">Click Here</a> to view it.";
    
    my $mail_sth = $dbh->prepare("INSERT INTO `mailbox` (`mailno`, `time`, `newflag`, `from`, `to`, `subject`, `body`)
    VALUES (?, ?, ?, ?, ?, ?, ?)") or die $DBI::errstr;
    $mail_sth->execute($mailno, $time, $flag, $from, $login, $subject, $body) or die $DBI::errstr;
    $mail_sth->finish;
    $count = ($count + 1);
    $mailno = ($mailno + 1);
    }
    
    
    my $sendmail = "/usr/sbin/sendmail -t";
    my $from = "register@domain.com\n";
    my $subject = "Subject: New Posting\n";
    my $body = "Thanks for your submission.... testing.... testing...\n";
    my $to = "tome@tome.com\n";
     
    
    {
    
    open(MAIL, "|$sendmail") || die
       		"Content-type: text/plain\n\nCan't open $sendmail: $!\n";
       }
    
    print MAIL "$to\n"; 
    print MAIL "$from\n"; 
    print MAIL "$subject\n";  
    print MAIL "$body\n"; 
    
    
       close(MAIL);
     
    
    $profiles_sth->finish;
    
    
    print "<br>$count ";
    
    	if ($count == 1){
    	print "Member has";
    	} else {
    	print "members have";
    	}
    
    print " been alerted about this post..<br><br>";
    exit;
    Thanks in advance for the help!

  • #2
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Also in playing around with the script I am also "at times" getting No recipient addresses found in header... Also got something about more then one "from"... I think thats what it was.

    Just figured I would post more info as I continued to sort it out.

  • #3
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Whats up with the last post.... Was it spam?

    But I am still looking for help lol

  • #4
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    OK, so working on this a bit more I got it to work 100% when I had an actual email address entered on line my
    Code:
    $to = 'email@mydomain.com';
    But what I need it to do is to send an email to the users that are getting notified on the internal message system. I thought by putting my
    Code:
    $email = "$profiles->{'email'}";
    when it was fetching login and name that it would send the email to those addresses.... But I get "No recipient addresses found in header" as well as dead.letter error.

    Can anyone shed any light on how to get this working 100%+? Once I have it working I will also want to know how to post the data into the email being sent that was entered into the database when the user is notified... But I will prob start a new thread for that.

    Here is the code that I have updated now and thanks again for any and all help with this:

    Code:
    #!/usr/bin/perl -w
    use CGI::Carp qw(fatalsToBrowser carpout);
    use CGI qw(:standard);
    use DBD::mysql;
    use LWP::Simple;
    use URI;
    print "Content-type: text/html \n\n";
    
     ###############################
     # find the root if this is IIS:
     ###############################
     if($ENV{'SERVER_SOFTWARE'} =~ m/IIS/)
     {
    	if($root eq "" && $ENV{'PATH_TRANSLATED'} ne "")
    	{
    		my $pt = $ENV{'PATH_TRANSLATED'};
    		my @pts = split(/\\/, $pt);
    		$pts[-1] = "";
    		$root = join "/", @pts;
    		$OS = "NT";
    	}
     }
    
     ###############################
     # functions library:
     ###############################
     if(!$dontparse){
            require "${root}data/config/pmpre.cfg";
            require "${root}lib/mysql.lib";
            require "${root}lib/pm.lib";
            require "${root}lib/phpbb.lib" if($plugin_phpbb eq "yes");
     }
    
     ###############################
     # Read the data coming from the form..
     ###############################
     if(!$dontparse){ &readit; }
     ###############################
    
      if($use_cookie eq "yes" && !$dontparse && $input{'ID'}<1 && $input{'action'} ne "register"){
       #- retrieve existing cookie
       $lp = $req->cookie("pmpre");
       my ($clogin, $cID) = split(/\|/, pm_decode($lp));
       if(($clogin ne "") and ($cID ne "")){
    	   if($input{'login'} eq ""){
    		$input{'login'} = $clogin;
    	   }
    	   if($input{'ID'} eq "" && $input{'password'} eq ""){
    		$input{'ID'} = $cID;
    	   }
       }
    
     }
    
    
    my $count = 0;
    my $subject = "New posting in your Location";
    my $flag = "1";
    my $from = "admin";
    my $time = &get_time;
    
    $query = "SELECT MAX(mailno) FROM `mailbox`";
    my $sth = $dbh->prepare($query);
    $sth->execute();
    my $data = $sth->fetchrow_array();
    my $mailno = ($data + 1);
    
    
    my $profiles_sth = $dbh->prepare("SELECT * FROM `departures` WHERE `departures_states` = ? AND `departures_state_region` = ?" ) or die $DBI::errstr;
    $profiles_sth->execute($input{'state1'}, $input{'state2'}) or die $DBI::errstr;
    while(my $profiles = $profiles_sth->fetchrow_hashref()){
    my $firstname = "$profiles->{'firstname'}";
    my $login = "$profiles->{'login'}";
    my $email = "$profiles->{'email'}";
    
    
    
    
    # add personalized mail
    my $body = "You have recent posts from your state.";
    
    my $mail_sth = $dbh->prepare("INSERT INTO `mailbox` (`mailno`, `time`, `newflag`, `from`, `to`, `subject`, `body`)
    VALUES (?, ?, ?, ?, ?, ?, ?)") or die $DBI::errstr;
    $mail_sth->execute($mailno, $time, $flag, $from, $login, $subject, $body) or die $DBI::errstr;
    $mail_sth->finish;
    $count = ($count + 1);
    $mailno = ($mailno + 1);
    }
    
    $profiles_sth->finish;
    
    
    my $to = $email;
    my $from = 'register@mydomain.com';
    my $subject = 'New posting in your location';
    my $body = 'Hi, testing location email';
    my $header = "To: $to
    CC: $cc
    Bcc: $bcc
    From: $from
    Subject: $subject
    Content-type: text/html
    
    ";
    
    open(MAIL, '| /usr/sbin/sendmail -t -oi') || die "Unable to open sendmail";
        print(MAIL   
    "${header}$body
    ");
        close(MAIL);
    
    
     
    print "<br>$count ";
    
    	if ($count == 1){
    	print "Member has";
    	} else {
    	print "members have";
    	}
    
    print " been alerted about this post..<br><br>";
    exit;

  • #5
    Super Moderator
    Join Date
    May 2005
    Location
    Southern tip of Silicon Valley
    Posts
    2,871
    Thanks
    2
    Thanked 164 Times in 159 Posts
    Sorry for my delay in responding.

    The first step is to run the script through perl's -c switch to see some of the problems.

    C:\TEMP>perl -c awayne96.pl
    Prototype mismatch: sub main::head: none vs ($) at awayne96.pl line 5
    [Fri Dec 11 05:13:00 2009] awayne96.pl: "my" variable $from masks earlier declaration in same scope at awayne96.pl line 94.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: "my" variable $subject masks earlier declaration in same scope at awayne96.pl line 95.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::email" used only once: possible typo at awayne96.pl line 93.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::plugin_phpbb" used only once: possible typo at awayne96.pl line 31.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::bcc" used only once: possible typo at awayne96.pl line 97.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::req" used only once: possible typo at awayne96.pl line 42.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::use_cookie" used only once: possible typo at awayne96.pl line 40.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::cc" used only once: possible typo at awayne96.pl line 97.
    [Fri Dec 11 05:13:00 2009] awayne96.pl: Name "main::OS" used only once: possible typo at awayne96.pl line 20.
    When you declare a var with the 'my' keyword, that var is only visible within the block where it was defined. Which means that the $email var that you assigned on line 74 i.e.,
    Code:
    my $email = "$profiles->{'email'}";
    wont be accessible when you try to use it on line 93 i.e.,
    Code:
    my $to = $email; # this is actually a completely different $email var than the one assigned on line 74, it just happens to have the same name
    If the script was using the strict pragma, like it should be doing, then perl would have told you about that error.

    You're assigning $header a multi line string. You should treat that assignment as such and use the proper quoting method.
    In this case that would be a here document.
    Code:
    my $header = <<"HEADER";
    To: $to
    CC: $cc
    Bcc: $bcc
    From: $from
    Subject: $subject
    Content-type: text/html
    
    HEADER
    Lines 107 through 109:
    Code:
        print(MAIL   
    "${header}$body
    ");
    Should be written as:
    Code:
    print(MAIL "$header$body");
    or
    Code:
    print MAIL $header, $body;
    or
    Code:
    print MAIL $header . $body;
    Last edited by FishMonger; 12-11-2009 at 01:42 PM.

  • #6
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    No Problem FishMonger, I appreciate the help when your able to get to it!

    I made the changes and actually took out the part of the script that is sending the message to the internal system to try to get it working.... Well it is still giving me "No recipient addresses found in header"

    Here is what I am currently working with now:

    Code:
    #!/usr/bin/perl -w
    use CGI::Carp qw(fatalsToBrowser carpout);
    use CGI qw(:standard);
    use DBD::mysql;
    use LWP::Simple;
    use URI;
    print "Content-type: text/html \n\n";
    
     ###############################
     # find the root if this is IIS:
     ###############################
     if($ENV{'SERVER_SOFTWARE'} =~ m/IIS/)
     {
    	if($root eq "" && $ENV{'PATH_TRANSLATED'} ne "")
    	{
    		my $pt = $ENV{'PATH_TRANSLATED'};
    		my @pts = split(/\\/, $pt);
    		$pts[-1] = "";
    		$root = join "/", @pts;
    		$OS = "NT";
    	}
     }
    
     ###############################
     # functions library:
     ###############################
     if(!$dontparse){
            require "${root}data/config/pmpre.cfg";
            require "${root}lib/mysql.lib";
            require "${root}lib/pm.lib";
            require "${root}lib/phpbb.lib" if($plugin_phpbb eq "yes");
     }
    
     ###############################
     # Read the data coming from the form..
     ###############################
     if(!$dontparse){ &readit; }
     ###############################
    
      if($use_cookie eq "yes" && !$dontparse && $input{'ID'}<1 && $input{'action'} ne "register"){
       #- retrieve existing cookie
       $lp = $req->cookie("pmpre");
       my ($clogin, $cID) = split(/\|/, pm_decode($lp));
       if(($clogin ne "") and ($cID ne "")){
    	   if($input{'login'} eq ""){
    		$input{'login'} = $clogin;
    	   }
    	   if($input{'ID'} eq "" && $input{'password'} eq ""){
    		$input{'ID'} = $cID;
    	   }
       }
    
     }
    
    
    my $count = 0;
    my $subject = "New posting in your Location";
    my $flag = "1";
    my $from = "admin";
    my $time = &get_time;
    
    $query = "SELECT MAX(mailno) FROM `mailbox`";
    my $sth = $dbh->prepare($query);
    $sth->execute();
    my $data = $sth->fetchrow_array();
    my $mailno = ($data + 1);
    
    
    my $profiles_sth = $dbh->prepare("SELECT * FROM `departures` WHERE `departures_states` = ? AND `departures_state_region` = ?" ) or die $DBI::errstr;
    $profiles_sth->execute($input{'state1'}, $input{'state2'}) or die $DBI::errstr;
    while(my $profiles = $profiles_sth->fetchrow_hashref()){
    my $firstname = "$profiles->{'firstname'}";
    my $login = "$profiles->{'login'}";
    my $to = "$profiles->{'email'}";
    
    
    
    
    my $sendmail = "/usr/sbin/sendmail -t";
    my $from = 'register@domain.com';
    my $subject = 'New posting in your location';
    my $body = 'Hi, testing location email';
    
    my $header = <<"HEADER";
    To: $to
    CC: $cc
    Bcc: $bcc
    From: $from
    Subject: $subject
    Content-type: text/html
    
    HEADER
     
    
    {
    
    open(MAIL, "|$sendmail") || die
       		"Content-type: text/plain\n\nCan't open $sendmail: $!\n";
       }
    
    print(MAIL "$header$body");
    
    
       close(MAIL);
     
    
    $profiles_sth->finish;
    
    
    print "<br>$count ";
    
    	if ($count == 1){
    	print "Member has";
    	} else {
    	print "members have";
    	}
    
    print " been alerted about this post..<br><br>";
    exit;}
    Last edited by awayne96; 12-11-2009 at 07:48 PM.

  • #7
    Super Moderator
    Join Date
    May 2005
    Location
    Southern tip of Silicon Valley
    Posts
    2,871
    Thanks
    2
    Thanked 164 Times in 159 Posts
    Are you sure that your select statement actually returned the email address(es)?

    You should add a check to see that $profiles->{'email'} is defined and holds a properly formatted email address.

  • #8
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Quote Originally Posted by FishMonger View Post
    Are you sure that your select statement actually returned the email address(es)?

    You should add a check to see that $profiles->{'email'} is defined and holds a properly formatted email address.
    I know that there is my email address in there formatted me@mydomain.com.

    We I run the script, it should be sending me an email since I am setup to be notified but nothing was sent.

    I did look just to be sure that $profiles->{'email'} is the field and has my email address in it and it does....

  • #9
    Super Moderator
    Join Date
    May 2005
    Location
    Southern tip of Silicon Valley
    Posts
    2,871
    Thanks
    2
    Thanked 164 Times in 159 Posts
    This needs more tweaking, but see what happens.
    Code:
    #!/usr/bin/perl
    
    #use strict;
    use warnings;
    use CGI::Carp qw(fatalsToBrowser carpout);
    use CGI qw(:standard);
    use DBD::mysql;
    use LWP::Simple;
    use URI;
    print "Content-type: text/html \n\n";
    
     ###############################
     # find the root if this is IIS:
     ###############################
     if($ENV{'SERVER_SOFTWARE'} =~ m/IIS/)
     {
    	if($root eq "" && $ENV{'PATH_TRANSLATED'} ne "")
    	{
    		my $pt = $ENV{'PATH_TRANSLATED'};
    		my @pts = split(/\\/, $pt);
    		$pts[-1] = "";
    		$root = join "/", @pts;
    		$OS = "NT";
    	}
     }
    
     ###############################
     # functions library:
     ###############################
     if(!$dontparse){
            require "${root}data/config/pmpre.cfg";
            require "${root}lib/mysql.lib";
            require "${root}lib/pm.lib";
            require "${root}lib/phpbb.lib" if($plugin_phpbb eq "yes");
     }
    
     ###############################
     # Read the data coming from the form..
     ###############################
     if(!$dontparse){ &readit; }
     ###############################
    
      if($use_cookie eq "yes" && !$dontparse && $input{'ID'}<1 && $input{'action'} ne "register"){
       #- retrieve existing cookie
       $lp = $req->cookie("pmpre");
       my ($clogin, $cID) = split(/\|/, pm_decode($lp));
       if(($clogin ne "") and ($cID ne "")){
    	   if($input{'login'} eq ""){
    		$input{'login'} = $clogin;
    	   }
    	   if($input{'ID'} eq "" && $input{'password'} eq ""){
    		$input{'ID'} = $cID;
    	   }
       }
    
     }
    
    
    my $count;
    #my $subject = "New posting in your Location";
    my $flag = "1";
    #my $from = "admin";
    my $time = &get_time;
    my $sendmail = "/usr/sbin/sendmail -t";
    
    $query = "SELECT MAX(mailno) FROM `mailbox`";
    my $sth = $dbh->prepare($query);
    $sth->execute();
    my ($data) = $sth->fetchrow_array();
    my $mailno = ($data + 1);
    
    
    my $profiles_sth = $dbh->prepare("SELECT * FROM `departures`
                                     WHERE `departures_states` = ?
                                     AND `departures_state_region` = ?" )
                            or die $DBI::errstr;
    
    $profiles_sth->execute($input{'state1'}, $input{'state2'}) or die $DBI::errstr;
    
    while( my $profiles = $profiles_sth->fetchrow_hashref ){
        my $firstname = $profiles->{'firstname'};
        my $login = $profiles->{'login'};
        my $to = $profiles->{'email'} || die "no email retrived from db";
    
       # if these are the same for each email,
       # then they should be declared prior to the while loop
        my $from = 'register@domain.com';
        my $subject = 'New posting in your trucks location';
        my $body = 'Hi, testing truck location email';
    
        my $header = <<"HEADER";
    To: $to
    From: $from
    Subject: $subject
    Content-type: text/html
    
    HEADER
     
        print "attempting to sent email:<br>",
              "$header$body<br>";
    
        open(MAIL, "|$sendmail") or die "Can't pipe $sendmail: $!\n";
        print(MAIL "$header$body");
        close(MAIL);
    }
    
    $profiles_sth->finish;
    
    my $plural = $count == 1 ? "Member has" : "Members have";
    print "<br>$count $plural been alerted about this post..<br><br>";
    
    exit;

  • Users who have thanked FishMonger for this post:

    awayne96 (12-11-2009)

  • #10
    Super Moderator
    Join Date
    May 2005
    Location
    Southern tip of Silicon Valley
    Posts
    2,871
    Thanks
    2
    Thanked 164 Times in 159 Posts
    It's possible that the email was sent, but got blocked for some reason.

    Personally I prefer to use one of Perl's mail modules rather than piping sendmail.

    Take a look at MIME::Lite
    http://search.cpan.org/~rjbs/MIME-Li...b/MIME/Lite.pm

  • #11
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Well, I created the cgi file with the above code and I got this error:

    no email retrived from db at line 83.

    So I was wondering if login and firstname would work so I put the error message next to both of them in the script and guess what, it doesn't pull the first name. So I deleted the error message from firstname and left it next to login.... Tried it again and it came up with only the error no email retrived from db at line 83.

    So now the question, what would be causing this? I know there is a email in the field 'email'. the firstname isn't important at this time since I really want to get them email working first... But I would like to be able to use the firstname in the email body.

    Could this possibly be linked to a .lib file or even the .cfg file?

    Again, I really appreciate all of your assistance with this.

  • #12
    Super Moderator
    Join Date
    May 2005
    Location
    Southern tip of Silicon Valley
    Posts
    2,871
    Thanks
    2
    Thanked 164 Times in 159 Posts
    Reduce your while loop to this and post its output.
    Code:
    use Data::Dumper;
    
    while( my $profiles = $profiles_sth->fetchrow_hashref ){
    	
    	print '<pre>' . Dumper($profiles) . '</pre>';
    
    }

  • #13
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Here is the output:

    $VAR1 = {
    'departures_dispatch_phone' => '3332221111',
    'departures_state_region' => 'Florida',
    'departures_truck_name' => 'test',
    'departures_number_spaces' => '2',
    'departures_trailer_type' => 'Open',
    'departures_states' => 'Ohio',
    'added' => '2009-12-08 17:09:49',
    'app_id' => '15',
    'departures_city_area' => 'Cleveland',
    'departures_inops_okay' => 'Yes',
    'departures_departure_time' => 'Morning',
    'departures_heading_direction' => 'South',
    'departures_departure_date' => '12-12-2009',
    'updated' => '2009-12-08 18:22:53'
    };
    Software error:
    no email retrived from db at line 88

    Now, the email is not in the departures table... only in the profile table

  • #14
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Do I need to add a hidden field to input the users email address to the departures table and into a field 'email'?

  • #15
    New Coder
    Join Date
    Oct 2009
    Posts
    70
    Thanks
    6
    Thanked 0 Times in 0 Posts
    Ok, so I tested it by using another field to input the email address in the departures table.

    Ran the script and it worked.

    I am doing this from another computer right now so it still needs some tweaking which I will be working on in a little while once I get home.

    I guess I should just remove that last bit of code you posted since that was just for testing purposes?
    Last edited by awayne96; 12-12-2009 at 01:02 AM.


  •  
    Page 1 of 3 123 LastLast

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •