Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][mySQL] generowanie emaili z danymi pobranymi z DB
Forum PHP.pl > Forum > PHP
suse
Witam,

Postaram sie jak najkrocej opisac moj problem.

Staram sie stworzyc mechanizm, ktory bedzie wysylal automatycznie emaile do dwoch grup uzytkownikow systemu:

1. Aplikantow, ktorzy zarejestrowali Projekt (glowni adresaci)
2. Pozostalych osob 'zamieszanych' w Projekt (adresaci Cc)

Glowna funkcja (w uproszczeniu) wyglada tak:

  1. <?php
  2. function send_email() {
  3.  
  4.  
  5. $subject = "Raport koncowy";
  6.  
  7.  
  8. $query = "SELECT (...)
  9. FROM project, people, members
  10. WHERE (...)
  11. AND members.status = 'Aplikant'
  12. ORDER BY project.id
  13. ";
  14.  
  15.  
  16.  
  17. $this->dblayer->runQuery($query);
  18.  
  19. while ($row = $this->dblayer->getNextRow()) {
  20.  
  21.  
  22.  
  23.  
  24. $to_address = $row['email'];
  25.  
  26. $row['cc_email'] = $this->list_ccEmails($row['project_id'], $row['applicant_id']);
  27.  
  28.  
  29.  $headers = "From: system@domain.comrn";
  30.  $headers .= .$row['cc_email']."rn"; #*****#
  31.  $headers .= "Bcc: admin@domain.comrn";
  32.  $headers .= "Content-Type: text/html; charset=ISO-8859-1 ";
  33.  $headers .= "MIME-Version: 1.0 ";
  34.  
  35. $body = "<p>Do: ".$row['first_name']." ".$row['last_name'].", </p>";
  36.  
  37. $body .= "<p>Dotyczy projektu: ".$row['project_id']." - ".stripslashes($row['project_title'])."</p>";
  38. $body .= "(...)";
  39.  
  40. if (mail($to_address, $subject, $body, $headers)) {
  41.  
  42.  
  43. $email_to = addslashes($to_address);
  44. $email_cc = addslashes($row['cc_email']);
  45. $email_subject = addslashes($subject);
  46. $project_id = $row['project_id'];
  47. $followup_date = date('Y-m-d', strtotime($row['follow_up_date']));
  48. $sql = "INSERT INTO
  49. (...)
  50.  ";
  51.  
  52.  $added = $this->dblayer->runInsert($sql);
  53.  
  54. if (!$added) {
  55. $error_returned .= mysql_error();
  56.  return $error_returned;
  57.  }
  58.  
  59.  }
  60. }
  61. }
  62. ?>


Do generowania listy adresatow Cc mam druga funkcje list_ccEmails i generuje ona ciag adresow poprawnie.

Problem lezy w tym, ze gdy staram sie w powyzszy sposob (linia kodu oznaczona #*****#) wstawic do emaila ciag cc, wysylany jest tylko jeden email z listy, dotyczacy pierwszego projektu (do Aplikanta i osob cc).

Gdy do zmiennej $row['cc_email'] przypisze zamiast

  1. <?php
  2. $row['cc_email'] = $this->list_ccEmails($row['project_id'], $row['applicant_id']);
  3. ?>


jakis ciag, np tak:

  1. <?php
  2. $row['cc_email'] = "adres1@doman, adres2@domain";
  3. ?>



wysylane sa wszystkie emaile do Aplikantow kazdego projektu, ale rzecz jasna bez Cc


Czy ktos moglby mi podpowiedziec gdzie robie blad? Mecze sie z tym juz od kilku dni i chyba sie zapetlilam...

Z gory dziekuje

suse
deirathe
KOD W TAGI!!!!
  1. <?php
  2. tu php
  3. ?>

btw pokaz funkcję
  1. <?php
  2. list_ccEmails()
  3. ?>
z tej klasy
suse
Juz sie nauczylam formatowania, obiecuje poprawe smile.gif

Jesli chodzi o funkcje, to sa wlasciwie dwie...

W pierwszej zapisuje do tablicy emaile i nazwiska (do wykorzystania w innym miejscu)

$user_id jest id Aplikanta, ktorego email powinien zostac pominiety.

  1. <?php
  2. function select_cc($project_id, $user_id) {
  3.  
  4. $sql = "SELECT 
  5.  people.id AS id,
  6.  CONCAT(people.title,' ', people.first_name,' ', people.last_name) AS cc, 
  7.  people.email AS cc_email, 
  8.  members.project_id 
  9.  FROM people, members
  10.  WHERE members.user_id = people.id
  11.  AND members.user_id != '$user_id'
  12.  AND members.project_id = '$project_id'
  13.  AND members.status IN ('Prowadzacy', 'Pomocnik') 
  14. ORDER BY project_id";
  15.  
  16. $this->dblayer->runQuery($sql);
  17.  while ($row = $this->dblayer->getNextRow()) {
  18. $cc_user[]['cc'] = $row['cc'];
  19. $cc_user[]['cc_email'] = $row['cc_email'];
  20. }
  21.  
  22.  return $cc_user;
  23. }
  24. ?>


Wynikiem wykonania drugiej funkcji jest ciag emaili:

  1. <?php
  2. function list_ccEmails($project_id, $user_id) {
  3.  
  4.  $cc_emails = $this->select_cc($project_id, $user_id);
  5.  
  6. $emails = "Cc: ";
  7.  
  8.  foreach ($cc_emails as $key => $value) {
  9.  
  10. if ($value['cc']) {
  11.  
  12. $emails .= "";
  13.  
  14.  } else {
  15.  
  16. $emails .= $value['cc_email'].", ";
  17.  
  18.  }
  19.  
  20. }
  21.  
  22.  $emails .= "rn";
  23.  
  24. return $emails;
  25.  
  26. }
  27. ?>



Dzieki za chec pomocy
spoksss
Polecam ci skorzystanie z ZendFrameworka do wysyłki wiadomości.
Jest to rozwiązanie: bezpieczne, wygodne, niezawodne

Dla twojego problemu mogłoby to wyglądać mniej więcej tak:
  1. <?php
  2. // to umieszczasz w pliku konfiguracyjnym
  3.  
  4. // pełna nazwa konta e-mail
  5. define("EMAIL_KONTO", 'jas@kowalski.pl');
  6. // hasło do konta e-mail
  7. define("EMAIL_HASLO", "skomplikowaneHasloJasia");
  8. // adres serwera SMTP do wysyłki e-maili
  9. define("EMAIL_SERWER", "kowalski.pl");
  10. // teraz rozpoczynasz wysylke
  11.  
  12. $tabelaDanychUzytkownikow = select_cc($project_id, $user_id);
  13. if(count($tabelaDanychUzytkownikow) == 0){
  14. return false;
  15. }
  16.  
  17. try {
  18. $config = array('auth' => 'login',
  19. 'username' => EMAIL_KONTO,
  20. 'password' => EMAIL_HASLO);
  21. $transport = new Zend_Mail_Transport_Smtp(EMAIL_SERWER, $config);
  22. $nadawca = "twojAdresEmail" ;
  23. $opisNadawcy = "Nazwa twojej aplikacji";
  24. // ustawiasz kodowanie znaków dla wiadomości
  25. $mail = new Zend_Mail('utf-8');
  26. // jeżeli chcesz możesz wybrać wiadomość w formacie html lub txt
  27. $mail->setBodyHtml($trescPotwierdzeniaMail);
  28. // ustawiasz od kogo mają zostać wysłane wiadomości
  29. $mail->setFrom($nadawca, $opisNadawcy);
  30.  
  31. $mail->addTo($email, $imie.' '.$nazwisko);
  32.  
  33. foreach ($tabelaDanychUzytkownikow as $wiersz){
  34. $mail->addTo($wiersz['cc_email'],$wiersz['cc_email']);
  35. // możesz również dodawać użytkowników do kopii ukrytej
  36. // nie będę się rozpisywał, kod chyba tego nie wymaga 
  37. // $mail->addBcc();
  38. }
  39. // Ustawiasz tytuł wiadomości e-mail
  40. $mail->setSubject("Twój tytuł wiadomości e-mail");
  41. // wysyłasz wiadomość
  42. $mail->send($transport);
  43. // jeżeli cokolwiek pójdzie nie tak masz to w logu i możesz wysłać jeszcze raz
  44. // masz nad wszystkim pełną kontrole
  45. }catch(Zend_Mail_Transport_Exception $e )
  46. {
  47. // tutaj używam klasy loga
  48. // może to być prosta funkcja
  49. // np. dopiszLoga($trescLoga)
  50. Log::ELog("Błąd! nie można wysłać e-maila. Treść błędu:".$e);
  51. }
  52. ?>

pozdrawiam
suse
spoksss, dzieki.

To rzeczywiscie wyglada niezle i jest przejrzyste jak woda zrodlana! Bede sie musiala przyjrzec temu ZendFrameworkowi winksmiley.jpg

Ale i tak meczy mnie co robie zle w 'moim' kodzie

pozdrawiam slonecznie



Witam ponownie.


Chcialam tylko poinformowac, ze w koncu znalazlam miejsce, w ktorym robilam blad. Przy okazji napisalam wszystko od nowa i chyba kod na tym zyskal. winksmiley.jpg


Dziekuje osobom, ktore zainteresowaly sie moim problemem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.