Podążałem za this przewodnikiem po instalacji w Heroku i this do wysyłania wiadomości e-mail.Zmienne środowiskowe na Heroku i Mailgunie Problemy z Phoenix Framework
Wszystko działa dobrze w fazie rozwoju. Moi zmienne są ustawione w Heroku:
heroku config
...
MAILGUN_DOMAIN: https://api.mailgun.net/v3/xxxxxx.mailgun.org
MAILGUN_KEY: key-3-xxxxxx
...
i ładowane z plików konfiguracyjnych tak:
config :take_two, Mailer,
domain: System.get_env("MAILGUN_DOMAIN"),
key: System.get_env("MAILGUN_KEY")
Jednak gdy próbuję wysłać wiadomość e-mail na Heroku gdy config Mailgun jest ustawiony od zmiennych środowiskowych, które uzyskuję ten błąd:
** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
(elixir) lib/io.ex:346: IO.chardata_to_string(nil)
(elixir) lib/path.ex:467: Path.join/2
(elixir) lib/path.ex:449: Path.join/1
lib/client.ex:44: Mailgun.Client.send_without_attachments/2
Dzieje się tak, gdy domena nie jest ustawiona dla klienta Mailgun. Ale powinien być ustawiony ze zmiennej środowiskowej. Zrobiłem prosty moduł do testu:
defmodule TakeTwo.Mailer do
require Logger
use Mailgun.Client,
Application.get_env(:take_two, Mailer)
def blank_shot do
Logger.info Application.get_env(:take_two, Mailer)[:domain]
Logger.info Application.get_env(:take_two, Mailer)[:key]
send_email from: "[email protected]", to: "[email protected]", subject: "Hello", text: "This is a blank shot"
end
Kiedy biegnę TakeTwo.Mailer.blank_shot
widzę prawidłowa domena/zmienne kluczowe zalogowanego następnie błędu. Nie jestem pewien, jak zdalnie debugować klienta Mailgun.
Wreszcie, jeśli odtworzyć powyższy moduł w powłoce (po uruchomieniu heroku run iex -S mix
) działa dobrze !?
Mam wrażenie, że podczas ładowania modułu oryginalnego, zmienne środowiskowe nie zostały jeszcze załadowane?
Kiedy spojrzał na Chrisa Mcoords Przykład klienta mailgun, jedyną różnicą, którą zauważyłem było to, że '' 'use''' przeszedł moduł, a następnie listę słów kluczowych, które zawierają domenę i klucz. Twój przykład przekazuje tylko moduł i '' Application.get_env ((: take_two, Mailer)) '' ', który zwraca krotkę. https://github.com/chrismccord/mailgun –
Dzięki @TheBrofessor, próbowałem go w obie strony i wydawało się działać lokalnie. Jestem prawie pewien, że Application.get_env zwrócił listę słów kluczowych. Zauważam, że przykład Chrisa używa atrybutu modułu, więc próbowałem tego z tymi samymi wynikami. 'TakeTwo.Mailer.conf' pokazuje, że obie wartości to' nil'. Znalazłem powiązany problem z tym repo - czuję, że pakiet kompilacji Heroku nie ładuje zmiennych środowiskowych przed kompilacją. Sądzę więc, że to następny kawałek, na który warto spojrzeć. – speg
Ohhh snap. https://github.com/HashNuke/heroku-buildpack-elixir#specifying-config-vars-to-export-at-compile-time ma odpowiedź. Okazuje się, że musisz wyraźnie określić, które zmienne konfiguracyjne Heroku mają zostać wyeksportowane podczas kompilacji. Głupio, zakładałem, że wszystkie zostaną wyeksportowane automatycznie. – speg