Imagine all your tools available on one site. A unified portal lets developers log in, find everything they need, and focus on writing code instead of searching for links.
Troubleshooting email delivery often starts with SendGrid:
Copy
Ask AI
import osimport sendgridfrom sendgrid.helpers.mail import Mail, Email, To, ContentSENDGRID_API_KEY = os.getenv("SENDGRID_API_KEY")SENDER_EMAIL = os.getenv("SENDER_EMAIL")RECEIVER_EMAIL = "[email protected]"SUBJECT = "Welcome to Our Application!"BODY = "Thank you for using our app! We are glad to have you onboard."if not SENDGRID_API_KEY or not SENDER_EMAIL: raise EnvironmentError("Missing SendGrid configuration. Check environment variables.")sg = sendgrid.SendGridAPIClient(api_key=SENDGRID_API_KEY)from_email = Email(SENDER_EMAIL)to_email = To(RECEIVER_EMAIL)content = Content("text/plain", BODY)mail = Mail(from_email, to_email, SUBJECT, content)try: response = sg.send(mail) print(f"Email sent successfully! Status Code: {response.status_code}")except Exception as e: print(f"Failed to send email: {e}")
If that fails, you might switch to SMTP:
Copy
Ask AI
import osimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartSMTP_SERVER = os.getenv("SMTP_SERVER")SMTP_PORT = int(os.getenv("SMTP_PORT", 587))SENDER_EMAIL = os.getenv("SENDER_EMAIL")SENDER_PASSWORD = os.getenv("SENDER_PASSWORD")RECEIVER_EMAIL = "[email protected]"SUBJECT = "Welcome to Our Application!"BODY = "Thank you for using our app! We are glad to have you onboard."if not SMTP_SERVER or not SENDER_EMAIL or not SENDER_PASSWORD: raise EnvironmentError("Missing SMTP configuration. Check environment variables.")message = MIMEMultipart()message["From"] = SENDER_EMAILmessage["To"] = RECEIVER_EMAILmessage["Subject"] = SUBJECTmessage.attach(MIMETText(BODY, "plain"))try: with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server: server.starttls() server.login(SENDER_EMAIL, SENDER_PASSWORD) server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) print("Email sent successfully!")except Exception as e: print(f"Failed to send email: {e}")
Without dependency tracking, downstream services can break. Backstage’s graphing prevents these surprises.
All these scenarios led to Internal Developer Portals—central hubs that aggregate tools, documentation, and resources so teams can build, test, and deploy software efficiently.