开发者

Beginners PHP e-mail problem

I'm working on my first PHP project, and it's going well. I've been able to figure out how to do most of what I need so far, but there's one big problem for me now: E-mail.

I'm on a shared server, so I can't install PEAR, and I can't modify my php.ini. According to my host's very limited documentation, I have to use SMTP so 开发者_运维技巧I can't (correct me if I'm wrong) use the mail() function. So does anyone have any suggestions on what to do? At this point I just want to send a basic text message, so where would I specify my SMTP port number, user, password and so on? Thanks


Even if you cannot install PEAR components at the system-level, you can still download some, and bundle them in your application, properly setting the include_path so it contains the directory in which you've put those components -- see set_include_path(), about that.


Else, there are others non-PEAR components, that might be great for you ; for instance, I've heard that Swift Mailer is great.

And it seems it has at least some documentation -- including the following pages, that might prove useful, in your case :

  • Installing the Library
  • Including Swift Mailer (Autoloading)


Chances are that your provider has configured the mail() command already to it uses the right SMTP server. Providers usually do that. I would try that out first.

If it really doesn't work that way, use a mailer class like phpMailer. With that, you can specify the exact SMTP server to use.


Might as well give it a try, especially if the documentation is limited - it could very easily be inaccurate or outdated.


// The message
$message = "Line 1\nLine 2\nLine 3";

// Send
mail('caffeinated@example.com', 'My Subject', $message);

Also, even when you can't use php.ini you can sometimes use ini_set() to set some things yourself.


very basic code just to show you an idea. working though

function smtp($recipient,$subject,$content) {

  $smtp_server = "mail.com"; 
  $port = 25; 
  $mydomain = "mydomain.com"; 
  $username = "me@mail.com"; 
  $password = "xxxyyy"; 
  $sender = $username; 

  $handle = fsockopen($smtp_server,$port); 
  fputs($handle, "EHLO $mydomain\r\n"); 

  // SMTP authorization 
  fputs($handle, "AUTH LOGIN\r\n"); 
  fputs($handle, base64_encode($username)."\r\n"); 
  fputs($handle, base64_encode($password)."\r\n"); 

  // Send out the e-mail 
  fputs($handle, "MAIL FROM:<$sender>\r\n"); 
  fputs($handle, "RCPT TO:<$recipient>\r\n"); 
  fputs($handle, "DATA\r\n"); 
  fputs($handle, "To: $recipient\r\n"); 
  fputs($handle, "Subject: $subject\r\n\r\n"); 
  fputs($handle, "$content\r\n"); 
  fputs($handle, ".\r\n"); 

  // Close connection to SMTP server 
  fputs($handle, "QUIT\r\n"); 
}


Google App Engine

Maybe you could try out Google app engine's email service(It is not a PHP solution, but this scales really well and is cheap). You can email 2,000 recipients(8 recipients/minute) daily for free. After that you only have to pay $0.0001 per recipient (5,100 recipients/minute). I think this is really cheap and it works really well.

Email service

I developed a real simple mail service. You just simply curl(post data) to your app engine domain.

Quick introduction to google app engine

If you are interested in this solution here is a quick video introduction by Brett Stalkin explaining how to creat a simple guestbook using python's app engine sdk within 10 minutes. I think this is pretty amazing.

Code

app.yaml

application: nameofmyapplication #name of your application
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: myemail.py

myemail.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import mail

#config
sender = "x@y.com" # Your admin email adres.
secret = "/7befe053cf52caba05ad2be3c25c340af7732564" # needs leading /

class Email:
    @classmethod 
    def email(self, to, subject, body):
        message = mail.EmailMessage()
        message.sender = sender
        message.subject = subject
        message.to = to
        message.body = body
        message.send()

class MainPage(webapp.RequestHandler):
    def post(self):
        if not sender:
            self.response.out.write("Please configure sender.")
            pass

        to = self.request.get("to")
        subject = self.request.get("subject")
        body = self.request.get("body")

        if not mail.is_email_valid(to):
            self.response.out.write("to param is invalid email address.")
            pass
        if not subject:
            self.response.out.write("subject param is invalid.")
            pass
        if not body:
            self.response.out.write("body param is invalid")
            pass

        Email.email(to, subject, body)
        self.response.out.write("Message sent.")

application = webapp.WSGIApplication(
                                     [(secret, MainPage)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Configure application

For example you have the following configuration.

app.yaml

  • application: nameofmyapplication # name of your application

myemail.py

  • sender: To your admin email address specified for app engine. For example x@y.com
  • secret: To secret url which to post data to. For example: 7befe053cf52caba05ad2be3c25c340af7732564

Uploading application to app engine

  1. Put all the code in a directory <path to your folder>.
  2. Upload the code using appcfg.py update <path to your folder>
  3. If successful you can access your app online.

Sending email using curl

The final step to test your app.

curl -d "to=<your@email.com>&body=<Hello World!>&subject=<Testing app engine>" http://<nameofyourapplication>.appspot.com/<7befe053cf52caba05ad2be3c25c340af7732564>

Where arguments between <> you have to specify yourself, off course omitting the <>.If successful the server should response with Message sent.


// ini_set("sendmail_from","webmaster@server.com"); // Only use if you have to.
ini_set("SMTP","mail.server.com");

$to = 'email@domain.com';
$subject = "Subject";
$body = "Body Content";
$headers = 'From: no_reply@domain.com' . "\r\n";
$result = @mail ( $to, $subject, $body, $headers );
if (! $result) {
    $errors = error_get_last ();

    $error = "";
    foreach ( $errors as $k => $v ) {
        $error .= "\n{$k} = {$v}";
    }
    error_log ( $error );
}

PHP: mail

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜